restore status needs to be merged during migration
This commit is contained in:
@ -546,6 +546,7 @@ class ObString;
|
||||
ACT(AFTER_JOIN_LEARNER_LIST,)\
|
||||
ACT(BEFORE_TRANSFER_START_COMMIT,)\
|
||||
ACT(STOP_PRIMARY_LS_THREAD,)\
|
||||
ACT(TRANSFER_GET_BACKFILL_TABLETS_BEFORE,)\
|
||||
ACT(MAX_DEBUG_SYNC_POINT,)
|
||||
|
||||
DECLARE_ENUM(ObDebugSyncPoint, debug_sync_point, OB_DEBUG_SYNC_POINT_DEF);
|
||||
|
||||
@ -965,6 +965,8 @@ int ObStartMigrationTask::process()
|
||||
LOG_WARN("failed to choose src", K(ret), KPC(ctx_));
|
||||
} else if (OB_FAIL(build_ls_())) {
|
||||
LOG_WARN("failed to build ls", K(ret), KPC(ctx_));
|
||||
} else if (OB_FAIL(fill_restore_arg_if_needed_())) {
|
||||
LOG_WARN("failed to fill restore arg", K(ret), KPC(ctx_));
|
||||
} else {
|
||||
#ifdef ERRSIM
|
||||
if (OB_SUCC(ret)) {
|
||||
@ -1544,6 +1546,33 @@ int ObStartMigrationTask::create_all_tablets_(
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObStartMigrationTask::fill_restore_arg_if_needed_()
|
||||
{
|
||||
// As the source log stream status can be ignored during transfer when log scn
|
||||
// is before restore consistent scn. So, we should ensure consistent scn is
|
||||
// valid when replaying transfer log during migration.
|
||||
int ret = OB_SUCCESS;
|
||||
ObLSHandle ls_handle;
|
||||
ObLS *ls = nullptr;
|
||||
ObLSRestoreStatus restore_status;
|
||||
if (OB_FAIL(ObStorageHADagUtils::get_ls(ctx_->arg_.ls_id_, ls_handle))) {
|
||||
LOG_WARN("failed to get ls", K(ret), KPC(ctx_));
|
||||
} else if (OB_ISNULL(ls = ls_handle.get_ls())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("ls should not be NULL", K(ret), KP(ls), KPC(ctx_));
|
||||
} else if (OB_FAIL(ls->get_restore_status(restore_status))) {
|
||||
LOG_WARN("failed to get restore status", K(ret), KPC(ls), KPC(ctx_));
|
||||
} else if (!restore_status.is_in_restore()) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(ls->get_ls_restore_handler()->fill_restore_arg())) {
|
||||
LOG_WARN("failed to fill restore arg", K(ret), KPC(ls), KPC(ctx_));
|
||||
} else {
|
||||
LOG_INFO("succeed fill restore arg during migration", "ls_id", ctx_->arg_.ls_id_, K(restore_status));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObStartMigrationTask::inner_build_ls_with_old_rpc_()
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
|
||||
@ -238,6 +238,7 @@ private:
|
||||
int generate_tablets_migration_dag_();
|
||||
int report_ls_meta_table_();
|
||||
int choose_src_();
|
||||
int fill_restore_arg_if_needed_();
|
||||
int fetch_ls_info_(const uint64_t tenant_id, const share::ObLSID &ls_id,
|
||||
const common::ObAddr &member_addr, obrpc::ObCopyLSInfo &ls_info);
|
||||
int get_local_ls_checkpoint_scn_(share::SCN &local_checkpoint_scn);
|
||||
|
||||
@ -85,6 +85,8 @@ int ObTransferWorkerMgr::get_need_backfill_tx_tablets_(ObTransferBackfillTXParam
|
||||
bool in_migration = false;
|
||||
ObLSRestoreStatus restore_status;
|
||||
|
||||
DEBUG_SYNC(TRANSFER_GET_BACKFILL_TABLETS_BEFORE);
|
||||
|
||||
if (IS_NOT_INIT) {
|
||||
ret = OB_NOT_INIT;
|
||||
LOG_WARN("transfer work not init", K(ret));
|
||||
|
||||
@ -425,7 +425,7 @@ int ObLSRestoreHandler::update_state_handle_()
|
||||
LOG_WARN("fail to get_restore_status", K(ret), KPC(ls_));
|
||||
} else if (nullptr != state_handler_
|
||||
&& new_status == state_handler_->get_restore_status()) { // no need update state handler
|
||||
} else if (OB_FAIL(fill_restore_arg_())) {
|
||||
} else if (OB_FAIL(fill_restore_arg())) {
|
||||
LOG_WARN("fail to fill restore arg", K(ret));
|
||||
} else {
|
||||
lib::ObMutexGuard guard(mtx_);
|
||||
@ -1602,7 +1602,7 @@ int ObLSRestoreStartState::inc_need_restore_ls_cnt_()
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLSRestoreHandler::fill_restore_arg_()
|
||||
int ObLSRestoreHandler::fill_restore_arg()
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
common::ObMySQLProxy *sql_proxy_ = GCTX.sql_proxy_;
|
||||
@ -1620,6 +1620,7 @@ int ObLSRestoreHandler::fill_restore_arg_()
|
||||
tenant_id, job_info))) {
|
||||
LOG_WARN("fail to get restore job", K(ret), K(tenant_id));
|
||||
} else {
|
||||
lib::ObMutexGuard guard(mtx_);
|
||||
ls_restore_arg_.job_id_ = job_info.get_job_id();
|
||||
ls_restore_arg_.restore_type_ = share::ObRestoreType::NORMAL_RESTORE; // quick restore or normal restore
|
||||
ls_restore_arg_.tenant_id_ = tenant_id;
|
||||
|
||||
@ -93,6 +93,7 @@ public:
|
||||
bool is_stop() { return is_stop_; }
|
||||
int update_rebuild_seq();
|
||||
int64_t get_rebuild_seq();
|
||||
int fill_restore_arg();
|
||||
private:
|
||||
int cancel_task_();
|
||||
int check_before_do_restore_(bool &can_do_restore);
|
||||
@ -104,7 +105,6 @@ private:
|
||||
template <typename T>
|
||||
int construct_state_handler_(T *&new_handler);
|
||||
int deal_failed_restore_();
|
||||
int fill_restore_arg_();
|
||||
private:
|
||||
bool is_inited_;
|
||||
bool is_stop_; // used by ls destory
|
||||
|
||||
@ -361,34 +361,51 @@ int ObTabletMeta::init(
|
||||
table_store_flag = OB_ISNULL(tablet_meta) ? table_store_flag : tablet_meta->table_store_flag_;
|
||||
}
|
||||
|
||||
version_ = TABLET_META_VERSION;
|
||||
ls_id_ = old_tablet_meta.ls_id_;
|
||||
tablet_id_ = old_tablet_meta.tablet_id_;
|
||||
data_tablet_id_ = old_tablet_meta.data_tablet_id_;
|
||||
ref_tablet_id_ = old_tablet_meta.ref_tablet_id_;
|
||||
create_scn_ = old_tablet_meta.create_scn_;
|
||||
create_schema_version_ = old_tablet_meta.create_schema_version_;
|
||||
start_scn_ = old_tablet_meta.start_scn_;
|
||||
clog_checkpoint_scn_ = clog_checkpoint_scn;
|
||||
snapshot_version_ = snapshot_version;
|
||||
multi_version_start_ = multi_version_start;
|
||||
compat_mode_ = old_tablet_meta.compat_mode_;
|
||||
ha_status_ = old_tablet_meta.ha_status_;
|
||||
report_status_ = old_tablet_meta.report_status_; //old tablet meta report status already reset
|
||||
table_store_flag_ = table_store_flag;
|
||||
ddl_checkpoint_scn_ = old_tablet_meta.ddl_checkpoint_scn_;
|
||||
ddl_start_scn_ = old_tablet_meta.ddl_start_scn_;
|
||||
ddl_commit_scn_ = old_tablet_meta.ddl_commit_scn_;
|
||||
ddl_snapshot_version_ = old_tablet_meta.ddl_snapshot_version_;
|
||||
max_sync_storage_schema_version_ = max_sync_storage_schema_version;
|
||||
max_serialized_medium_scn_ = MAX(old_tablet_meta.max_serialized_medium_scn_,
|
||||
OB_ISNULL(tablet_meta) ? 0 : tablet_meta->max_serialized_medium_scn_);
|
||||
ddl_execution_id_ = old_tablet_meta.ddl_execution_id_;
|
||||
ddl_data_format_version_ = old_tablet_meta.ddl_data_format_version_;
|
||||
transfer_info_ = transfer_info;
|
||||
mds_checkpoint_scn_ = old_tablet_meta.mds_checkpoint_scn_;
|
||||
// fuse restore status during migration, consider the following timeline
|
||||
// 1. SOURCE: tablet P0 was created with restore status FULL by replay start transfer in.
|
||||
// 2. TARGET: rebuild was triggered, then create P0 with restore status FULL, and data status INCOMPLETE.
|
||||
// 3. SOURCE: transfer handler modified the restore status of P0 to EMPTY.
|
||||
// 4. SOURCE: the minor of P0 was restored by restore handler, then set the restore status to MINOR_AND_MAJOR_META.
|
||||
// 5. TARGET: the minor of P0 was restored by migration, then set data status COMPLETE.
|
||||
// The result is P0 was FULL, but only exist minor sstables, with no major.
|
||||
ObTabletHAStatus new_ha_status = old_tablet_meta.ha_status_;
|
||||
if (!old_tablet_meta.ha_status_.is_data_status_complete() && OB_NOT_NULL(tablet_meta)) {
|
||||
ObTabletRestoreStatus::STATUS src_restore_status;
|
||||
if (OB_FAIL(tablet_meta->ha_status_.get_restore_status(src_restore_status))) {
|
||||
LOG_WARN("failed to get restore status", K(ret), KPC(tablet_meta));
|
||||
} else if (OB_FAIL(new_ha_status.set_restore_status(src_restore_status))) {
|
||||
LOG_WARN("failed to set new restore status", K(ret), K(new_ha_status), K(src_restore_status));
|
||||
}
|
||||
}
|
||||
|
||||
if (OB_SUCC(ret)) {
|
||||
version_ = TABLET_META_VERSION;
|
||||
ls_id_ = old_tablet_meta.ls_id_;
|
||||
tablet_id_ = old_tablet_meta.tablet_id_;
|
||||
data_tablet_id_ = old_tablet_meta.data_tablet_id_;
|
||||
ref_tablet_id_ = old_tablet_meta.ref_tablet_id_;
|
||||
create_scn_ = old_tablet_meta.create_scn_;
|
||||
create_schema_version_ = old_tablet_meta.create_schema_version_;
|
||||
start_scn_ = old_tablet_meta.start_scn_;
|
||||
clog_checkpoint_scn_ = clog_checkpoint_scn;
|
||||
snapshot_version_ = snapshot_version;
|
||||
multi_version_start_ = multi_version_start;
|
||||
compat_mode_ = old_tablet_meta.compat_mode_;
|
||||
ha_status_ = new_ha_status;
|
||||
report_status_ = old_tablet_meta.report_status_; //old tablet meta report status already reset
|
||||
table_store_flag_ = table_store_flag;
|
||||
ddl_checkpoint_scn_ = old_tablet_meta.ddl_checkpoint_scn_;
|
||||
ddl_start_scn_ = old_tablet_meta.ddl_start_scn_;
|
||||
ddl_commit_scn_ = old_tablet_meta.ddl_commit_scn_;
|
||||
ddl_snapshot_version_ = old_tablet_meta.ddl_snapshot_version_;
|
||||
max_sync_storage_schema_version_ = max_sync_storage_schema_version;
|
||||
max_serialized_medium_scn_ = MAX(old_tablet_meta.max_serialized_medium_scn_,
|
||||
OB_ISNULL(tablet_meta) ? 0 : tablet_meta->max_serialized_medium_scn_);
|
||||
ddl_execution_id_ = old_tablet_meta.ddl_execution_id_;
|
||||
ddl_data_format_version_ = old_tablet_meta.ddl_data_format_version_;
|
||||
transfer_info_ = transfer_info;
|
||||
mds_checkpoint_scn_ = old_tablet_meta.mds_checkpoint_scn_;
|
||||
|
||||
is_inited_ = true;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user