[CP] [DATA_DICT] Fix report incompleted dict record

This commit is contained in:
SanmuWangZJU
2024-08-16 09:05:55 +00:00
committed by ob-robot
parent 7a4c62f2c4
commit 579021c456
5 changed files with 41 additions and 15 deletions

View File

@ -264,6 +264,8 @@ int ObDataDictService::do_dump_data_dict_()
share::SCN snapshot_scn;
palf::LSN start_lsn;
palf::LSN end_lsn;
int64_t start_proposal_id = 0;
int64_t end_proposal_id = 0;
bool is_cluster_status_normal = false;
bool is_data_dict_dump_success = false;
bool is_any_log_callback_fail = false;
@ -293,17 +295,18 @@ int ObDataDictService::do_dump_data_dict_()
} else if (OB_ISNULL(log_handler = ls->get_log_handler())) {
ret = OB_ERR_UNEXPECTED;
DDLOG(WARN, "invalid log_handler_ get from OBLS", KR(ret), K_(tenant_id));
} else if (check_ls_leader(log_handler, is_leader)) {
DDLOG(WARN, "check_is_sys_ls_leader failed", KR(ret));
} else if (OB_FAIL(check_ls_leader(log_handler, is_leader, start_proposal_id))) {
DDLOG(WARN, "check_is_sys_ls_leader failed", KR(ret), K(start_proposal_id));
} else if (! is_leader) {
DDLOG(DEBUG, "won't do_dump_data_dict_ cause not ls_leader", KR(ret), K(is_leader));
ret = OB_STATE_NOT_MATCH;
DDLOG(WARN, "won't do_dump_data_dict_ cause not ls_leader", KR(ret), K(is_leader), K(start_proposal_id));
// do nothing if not ls leader.
} else if (OB_FAIL(get_snapshot_scn_(snapshot_scn))) {
DDLOG(WARN, "get_snapshot_scn failed", KR(ret), K(snapshot_scn));
} else if (OB_FAIL(storage_.prepare(snapshot_scn, log_handler))) {
DDLOG(WARN, "storage prepare for data_dict_dump failed", KR(ret), K(snapshot_scn));
} else if (OB_FAIL(generate_dict_and_dump_(snapshot_scn))) {
DDLOG(WARN, "generate_dict_and_dump_", KR(ret), K_(tenant_id), K(snapshot_scn));
DDLOG(WARN, "generate_dict_and_dump_", KR(ret), K_(tenant_id), K(snapshot_scn), K(start_proposal_id));
} else {
is_data_dict_dump_success = true;
}
@ -319,7 +322,17 @@ int ObDataDictService::do_dump_data_dict_()
K(snapshot_scn), K(start_lsn), K(end_lsn), K_(stop_flag), K_(is_inited));
}
ret = tmp_ret;
} else if (is_data_dict_dump_success && ! is_any_log_callback_fail) {
} else if (OB_UNLIKELY(! is_data_dict_dump_success || is_any_log_callback_fail)) {
ret = OB_STATE_NOT_MATCH;
DDLOG(INFO, "won't report data_dict persist info cause data_dict dump failed or log_callback failed",
KR(ret), K(is_data_dict_dump_success), K(is_any_log_callback_fail));
} else if (OB_FAIL(check_ls_leader(log_handler, is_leader, end_proposal_id))) {
DDLOG(WARN, "check_is_sys_ls_leader failed", KR(ret), K(start_proposal_id), K(end_proposal_id));
} else if (OB_UNLIKELY(! is_leader || start_proposal_id != end_proposal_id)) {
ret = OB_STATE_NOT_MATCH;
DDLOG(INFO, "won't report data_dict persist info cause currently not ls_leader or not the same election term",
KR(ret), K(is_leader), K(start_proposal_id), K(end_proposal_id));
} else {
// only report when dict dump success and all log_callback success.
const int64_t half_dump_interval = ATOMIC_LOAD(&dump_interval_) / 2;
const int64_t report_timeout = DEFAULT_REPORT_TIMEOUT > half_dump_interval ? half_dump_interval : DEFAULT_REPORT_TIMEOUT;
@ -607,13 +620,15 @@ int ObDataDictService::handle_table_metas_(
int64_t &filter_table_count)
{
int ret = OB_SUCCESS;
const int64_t total_table_count = table_ids.count();
lib::ObMemAttr mem_attr(tenant_id_, "ObDatDictTbMeta");
ObArenaAllocator tb_meta_allocator(mem_attr);
static const int64_t batch_table_meta_size = 200;
filter_table_count = 0;
int64_t dump_succ_tb_cnt = 0;
schema::ObSchemaGetterGuard schema_guard; // will reset while getting schem_guard
for (int i = 0; OB_SUCC(ret) && ! stop_flag_ && i < table_ids.count(); i++) {
for (int i = 0; OB_SUCC(ret) && i < total_table_count; i++) {
const ObTableSchema *table_schema = NULL;
uint64_t table_id = OB_INVALID_ID;
// NOTICE: get schema_guard for each table_meta in case of too much memory usage in schema_service.
@ -649,10 +664,21 @@ int ObDataDictService::handle_table_metas_(
} else if (OB_FAIL(storage_.handle_dict_meta(table_meta, header))) {
DDLOG(WARN, "handle dict_table_meta failed", KR(ret), K(table_meta), K(header), KPC(table_schema));
} else {
dump_succ_tb_cnt ++;
DDLOG(DEBUG, "handle dict_table_meta succ", KR(ret), K(table_meta), K(header), KPC(table_schema));
if (i == 0) {
DEBUG_SYNC(BEFORE_DATA_DICT_DUMP_FINISH);
}
}
if (OB_SUCC(ret) && stop_flag_) {
ret = OB_STATE_NOT_MATCH;
DDLOG(WARN, "data_dict service marked stop_flag, may already switch to follower", KR(ret), K_(stop_flag));
}
}
DDLOG(INFO, "handle_table_metas_ done", KR(ret), K(total_table_count), K(dump_succ_tb_cnt), K(filter_table_count), K_(stop_flag));
return ret;
}

View File

@ -556,6 +556,7 @@ int ObDataDictStorage::submit_to_palf_()
const bool allow_compression = true;
palf::LSN lsn;
SCN submit_scn;
int64_t proposal_id = 0;
if (OB_ISNULL(palf_buf_)
|| OB_ISNULL(log_handler_)
@ -568,11 +569,11 @@ int ObDataDictStorage::submit_to_palf_()
DDLOG(WARN, "log_handler_ is not valid", KR(ret));
} else if (OB_UNLIKELY(palf_pos_ == 0)) {
DDLOG(INFO, "empty palf_buf, do nothing", K_(palf_buf_len), K_(palf_pos));
} else if (OB_FAIL(check_ls_leader(log_handler_, is_leader))) {
DDLOG(WARN, "check_ls_leader failed", KR(ret), K(is_leader));
} else if (OB_FAIL(check_ls_leader(log_handler_, is_leader, proposal_id))) {
DDLOG(WARN, "check_ls_leader failed", KR(ret), K(is_leader), K(proposal_id));
} else if (OB_UNLIKELY(! is_leader)) {
ret = OB_STATE_NOT_MATCH;
DDLOG(INFO, "do-nothing on non-leader logstream.", KR(ret), K(is_leader));
DDLOG(INFO, "do-nothing on non-leader logstream.", KR(ret), K(is_leader), K(proposal_id));
} else if (OB_FAIL(alloc_palf_cb_(callback))) {
DDLOG(WARN, "alloc_palf_cb_ failed", KR(ret));
} else if (OB_FAIL(log_handler_->append(

View File

@ -128,21 +128,19 @@ int deep_copy_str_array(
return ret;
}
int check_ls_leader(logservice::ObLogHandler *log_handler, bool &is_leader)
int check_ls_leader(logservice::ObLogHandler *log_handler, bool &is_leader, int64_t &proposal_id)
{
int ret = OB_SUCCESS;
common::ObRole role = common::ObRole::INVALID_ROLE;
int64_t proposal_id = 0;
proposal_id = 0;
if (OB_ISNULL(log_handler)) {
ret = OB_ERR_UNEXPECTED;
DDLOG(WARN, "log_handler_ is invalid", KR(ret));
} else if (OB_FAIL(log_handler->get_role(role, proposal_id))) {
DDLOG(WARN, "get ls role fail", K(ret), K(proposal_id));
} else if (common::ObRole::LEADER == role) {
is_leader = true;
} else {
is_leader = false;
is_leader = is_strong_leader(role);
}
return ret;

View File

@ -124,7 +124,7 @@ OB_INLINE const char *extract_str(const ObString &str)
return str.empty() ? "" : str.ptr();
}
int check_ls_leader(logservice::ObLogHandler *handler, bool &is_leader);
int check_ls_leader(logservice::ObLogHandler *handler, bool &is_leader, int64_t &proposal_id);
} // namespace datadict
} // namespace oceanbase

View File

@ -631,6 +631,7 @@ class ObString;
ACT(BEFORE_RESTORE_CREATE_TABLETS_SSTABLE,)\
ACT(BEFORE_CLOSE_BACKUP_INDEX_BUILDER,)\
ACT(BEFROE_UPDATE_DATA_VERSION,)\
ACT(BEFORE_DATA_DICT_DUMP_FINISH,)\
ACT(MAX_DEBUG_SYNC_POINT,)
DECLARE_ENUM(ObDebugSyncPoint, debug_sync_point, OB_DEBUG_SYNC_POINT_DEF);