diff --git a/src/storage/tablet/ob_tablet_start_transfer_mds_helper.cpp b/src/storage/tablet/ob_tablet_start_transfer_mds_helper.cpp index f1b478a936..e125242679 100644 --- a/src/storage/tablet/ob_tablet_start_transfer_mds_helper.cpp +++ b/src/storage/tablet/ob_tablet_start_transfer_mds_helper.cpp @@ -1163,12 +1163,7 @@ int ObTabletStartTransferInHelper::check_transfer_src_tablets_( } else if (CLICK_FAIL(ls_srv->get_ls(tx_start_transfer_in_info.src_ls_id_, src_ls_handle, ObLSGetMod::STORAGE_MOD))) { LOG_WARN("ls_srv->get_ls() fail", KR(ret), "src ls id", tx_start_transfer_in_info.src_ls_id_); if (OB_LS_NOT_EXIST == ret) { - bool need_rebuild = false; - if (!for_replay) { - // do nothing - } else if (OB_SUCCESS != (tmp_ret = ObStorageHAUtils::check_transfer_ls_can_rebuild(scn, need_rebuild))) { - LOG_WARN("failed to check transfer ls can rebuild", K(tmp_ret), K(scn), K(tx_start_transfer_in_info)); - } else if (need_rebuild && OB_SUCCESS != (tmp_ret = set_dest_ls_rebuild_(tx_start_transfer_in_info.dest_ls_id_))) { + if (OB_SUCCESS != (tmp_ret = set_dest_ls_rebuild_(tx_start_transfer_in_info.dest_ls_id_, scn, for_replay))) { LOG_WARN("failed to set dest ls rebuild", K(tmp_ret), K(tx_start_transfer_in_info)); } } @@ -1189,7 +1184,7 @@ int ObTabletStartTransferInHelper::check_transfer_src_tablets_( for (int64_t i = 0; OB_SUCC(ret) && i < tx_start_transfer_in_info.tablet_meta_list_.count(); ++i) { MDS_TG(10_ms); const ObMigrationTabletParam &tablet_meta = tx_start_transfer_in_info.tablet_meta_list_.at(i); - if (CLICK_FAIL(check_transfer_src_tablet_(for_replay, tablet_meta, src_ls))) { + if (CLICK_FAIL(check_transfer_src_tablet_(scn, for_replay, tablet_meta, src_ls))) { LOG_WARN("failed to check src tablet", K(ret), K(for_replay), K(tablet_meta)); } } @@ -1198,6 +1193,7 @@ int ObTabletStartTransferInHelper::check_transfer_src_tablets_( } int ObTabletStartTransferInHelper::check_transfer_src_tablet_( + const share::SCN &scn, const bool for_replay, const ObMigrationTabletParam &tablet_meta, ObLS *src_ls) @@ -1213,9 +1209,9 @@ int ObTabletStartTransferInHelper::check_transfer_src_tablet_( ObMigrationStatus migration_status = ObMigrationStatus::OB_MIGRATION_STATUS_NONE; //replay scn need check - if (!tablet_meta.is_valid() || OB_ISNULL(src_ls)) { + if (!tablet_meta.is_valid() || OB_ISNULL(src_ls) || (for_replay && !scn.is_valid())) { ret = OB_INVALID_ARGUMENT; - LOG_WARN("check src tablete get invalid argument", K(ret), K(tablet_meta), KP(src_ls)); + LOG_WARN("check src tablete get invalid argument", K(ret), K(tablet_meta), KP(src_ls), K(scn), K(for_replay)); } else if (CLICK_FAIL(src_ls->get_migration_status(migration_status))) { LOG_WARN("failed to get rebuild info", K(ret), KPC(src_ls)); } else if (ObMigrationStatus::OB_MIGRATION_STATUS_NONE != migration_status) { @@ -1223,12 +1219,21 @@ int ObTabletStartTransferInHelper::check_transfer_src_tablet_( LOG_WARN("src ls migration status not none", K(ret), K(migration_status), KPC(src_ls)); } else if (CLICK_FAIL(src_ls->get_tablet(tablet_meta.tablet_id_, tablet_handle, 0, ObMDSGetTabletMode::READ_WITHOUT_CHECK))) { + LOG_WARN("failed to get transfer src tablet", K(ret), K(tablet_meta), KPC(src_ls)); if (ret == OB_TABLET_NOT_EXIST) { - ret = OB_EAGAIN; - if (!for_replay) { - } else if (OB_SUCCESS != (tmp_ret = set_dest_ls_rebuild_(dest_ls_id))) { + SCN gts_scn; + if (OB_SUCCESS != (tmp_ret = ObTransferUtils::get_gts(src_ls->get_tenant_id(), gts_scn))) { + LOG_WARN("failed to get gts", K(tmp_ret), KPC(src_ls)); + } else if (gts_scn < scn || !for_replay) { + LOG_ERROR("transfer src ls already replay to transfer scn but tablet do not exist, unexpected!", + K(ret), K(tablet_meta), KPC(src_ls), K(scn), K(gts_scn)); + } + + if (OB_SUCCESS != (tmp_ret = set_dest_ls_rebuild_(dest_ls_id, scn, for_replay))) { LOG_WARN("failed to set dest ls rebuild", K(tmp_ret), K(dest_ls_id)); } + //change ret to allow retry error code + ret = OB_EAGAIN; } else { LOG_WARN("failed to get tablet", K(ret), KPC(src_ls), K(tablet_meta)); } @@ -1242,8 +1247,7 @@ int ObTabletStartTransferInHelper::check_transfer_src_tablet_( && user_data.tablet_status_ != ObTabletStatus::TRANSFER_OUT_DELETED)) { ret = OB_EAGAIN; LOG_WARN("src ls tablet not ready, need retry", K(ret), K(user_data), K(tablet_meta)); - if (!for_replay) { - } else if (OB_SUCCESS != (tmp_ret = set_dest_ls_rebuild_(dest_ls_id))) { + if (OB_SUCCESS != (tmp_ret = set_dest_ls_rebuild_(dest_ls_id, scn, for_replay))) { LOG_WARN("failed to set dest ls rebuild", K(tmp_ret), K(dest_ls_id)); } } else if (tablet->get_tablet_meta().ha_status_.is_restore_status_empty()) { @@ -1783,15 +1787,24 @@ int ObTabletStartTransferInHelper::check_transfer_dest_tablet_ready_( } int ObTabletStartTransferInHelper::set_dest_ls_rebuild_( - const share::ObLSID &dest_ls_id) + const share::ObLSID &dest_ls_id, + const share::SCN &scn, //scn is current replay log scn + const bool for_replay) { int ret = OB_SUCCESS; ObRebuildService *rebuild_service = nullptr; const ObLSRebuildType rebuild_type(ObLSRebuildType::TRANSFER); + bool need_rebuild = false; - if (!dest_ls_id.is_valid()) { + if (!dest_ls_id.is_valid() || (for_replay && !scn.is_valid())) { ret = OB_INVALID_ARGUMENT; - LOG_WARN("set dest ls rebuild get invalid argument", K(ret), K(dest_ls_id)); + LOG_WARN("set dest ls rebuild get invalid argument", K(ret), K(dest_ls_id), K(scn), K(for_replay)); + } else if (!for_replay) { + //do nothing + } else if (OB_FAIL(ObStorageHAUtils::check_transfer_ls_can_rebuild(scn, need_rebuild))) { + LOG_WARN("failed to check transfer ls can rebuild", K(ret), K(scn), K(dest_ls_id)); + } else if (!need_rebuild) { + LOG_INFO("transfer dest ls do not need rebuild", K(dest_ls_id), K(scn), K(for_replay)); } else if (OB_ISNULL(rebuild_service = MTL(ObRebuildService *))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("rebuild should not be null", K(ret), KP(rebuild_service)); diff --git a/src/storage/tablet/ob_tablet_start_transfer_mds_helper.h b/src/storage/tablet/ob_tablet_start_transfer_mds_helper.h index 6337d0e08d..3f5e02a850 100644 --- a/src/storage/tablet/ob_tablet_start_transfer_mds_helper.h +++ b/src/storage/tablet/ob_tablet_start_transfer_mds_helper.h @@ -171,6 +171,7 @@ private: const bool for_replay, const ObTXStartTransferInInfo &tx_start_transfer_in_info); static int check_transfer_src_tablet_( + const share::SCN &scn, const bool for_replay, const ObMigrationTabletParam &tablet_meta, ObLS *src_ls); @@ -234,7 +235,9 @@ private: const ObMigrationTabletParam &tablet_meta, bool &can_skip); static int set_dest_ls_rebuild_( - const share::ObLSID &dest_ls_id); + const share::ObLSID &dest_ls_id, + const share::SCN &scn, + const bool for_replay); private: DISALLOW_COPY_AND_ASSIGN(ObTabletStartTransferInHelper);