diff --git a/src/share/ob_unit_getter.h b/src/share/ob_unit_getter.h index c4d36608f5..4d688c93d8 100644 --- a/src/share/ob_unit_getter.h +++ b/src/share/ob_unit_getter.h @@ -51,6 +51,9 @@ public: return UNIT_DELETING_IN_OBSERVER != status && UNIT_ERROR_STAT != status; } + static bool is_unit_will_be_deleted_in_observer(const ObUnitStatus status) { + return UNIT_WAIT_GC_IN_OBSERVER == status || UNIT_DELETING_IN_OBSERVER == status; } + struct ObTenantConfig { OB_UNIS_VERSION(1); diff --git a/src/storage/high_availability/ob_ls_complete_migration.cpp b/src/storage/high_availability/ob_ls_complete_migration.cpp index f11ecbefe6..56e6ed1b87 100644 --- a/src/storage/high_availability/ob_ls_complete_migration.cpp +++ b/src/storage/high_availability/ob_ls_complete_migration.cpp @@ -362,8 +362,7 @@ int ObLSCompleteMigrationDagNet::update_migration_status_(ObLS *ls) static const int64_t UPDATE_MIGRATION_STATUS_INTERVAL_MS = 100 * 1000; //100ms ObTenantDagScheduler *scheduler = nullptr; int32_t result = OB_SUCCESS; - share::ObTenantBase *tenant_base = MTL_CTX(); - omt::ObTenant *tenant = nullptr; + bool is_tenant_deleted = false; DEBUG_SYNC(BEFORE_COMPLETE_MIGRATION_UPDATE_STATUS); @@ -376,10 +375,6 @@ int ObLSCompleteMigrationDagNet::update_migration_status_(ObLS *ls) } else if (OB_ISNULL(scheduler = MTL(ObTenantDagScheduler*))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("failed to get ObTenantDagScheduler from MTL", K(ret)); - } else if (OB_ISNULL(tenant_base)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("tenant base should not be NULL", K(ret), KP(tenant_base)); - } else if (FALSE_IT(tenant = static_cast(tenant_base))) { } else { while (!is_finish) { ObMigrationStatus current_migration_status = ObMigrationStatus::OB_MIGRATION_STATUS_MAX; @@ -404,7 +399,9 @@ int ObLSCompleteMigrationDagNet::update_migration_status_(ObLS *ls) ret = OB_SERVER_IS_STOPPING; LOG_WARN("tenant dag scheduler has set stop, stop migration dag net", K(ret), K(ctx_)); break; - } else if (tenant->has_stopped()) { + } else if (OB_FAIL(ObStorageHAUtils::check_tenant_will_be_deleted(is_tenant_deleted))) { + LOG_WARN("failed to check tenant deleted", K(ret), K(ctx_)); + } else if (is_tenant_deleted) { ret = OB_TENANT_HAS_BEEN_DROPPED; LOG_WARN("tenant has been stopped, stop migration dag net", K(ret), K(ctx_)); break; diff --git a/src/storage/high_availability/ob_storage_ha_struct.cpp b/src/storage/high_availability/ob_storage_ha_struct.cpp index 9547a8046c..ff12a29862 100644 --- a/src/storage/high_availability/ob_storage_ha_struct.cpp +++ b/src/storage/high_availability/ob_storage_ha_struct.cpp @@ -547,10 +547,17 @@ int ObMigrationStatusHelper::check_ls_with_transfer_task_( SCN max_decided_scn(SCN::base_scn()); ObLSService *ls_service = NULL; ObLSHandle dest_ls_handle; + bool is_tenant_deleted = false; if (OB_ISNULL(sql_proxy)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("mysql proxy should not be NULL", K(ret), KP(sql_proxy)); + } else if (OB_FAIL(ObStorageHAUtils::check_tenant_will_be_deleted(is_tenant_deleted))) { + LOG_WARN("failed to check tenant deleted", K(ret), K(ls)); + } else if (is_tenant_deleted) { + need_check_allow_gc = true; + need_wait_dest_ls_replay = false; + FLOG_INFO("unit wait gc in observer, allow gc", K(tenant_id), K(src_ls_id)); } else if (OB_FAIL(ObTransferTaskOperator::get_by_src_ls( *sql_proxy, tenant_id, src_ls_id, task, share::OBCG_STORAGE))) { LOG_WARN("failed to get transfer task", K(ret), K(tenant_id), K(src_ls_id)); diff --git a/src/storage/high_availability/ob_storage_ha_utils.cpp b/src/storage/high_availability/ob_storage_ha_utils.cpp index 9a3735cacb..f3198fcaa1 100644 --- a/src/storage/high_availability/ob_storage_ha_utils.cpp +++ b/src/storage/high_availability/ob_storage_ha_utils.cpp @@ -417,6 +417,27 @@ int ObStorageHAUtils::check_ls_is_leader( return ret; } +int ObStorageHAUtils::check_tenant_will_be_deleted( + bool &is_deleted) +{ + int ret = OB_SUCCESS; + is_deleted = false; + + share::ObTenantBase *tenant_base = MTL_CTX(); + omt::ObTenant *tenant = nullptr; + ObUnitInfoGetter::ObUnitStatus unit_status; + if (OB_ISNULL(tenant_base)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("tenant base should not be NULL", K(ret), KP(tenant_base)); + } else if (FALSE_IT(tenant = static_cast(tenant_base))) { + } else if (FALSE_IT(unit_status = tenant->get_unit_status())) { + } else if (ObUnitInfoGetter::is_unit_will_be_deleted_in_observer(unit_status)) { + is_deleted = true; + FLOG_INFO("unit wait gc in observer, allow gc", K(tenant->id()), K(unit_status)); + } + return ret; +} + bool ObTransferUtils::is_need_retry_error(const int err) { bool bool_ret = false; diff --git a/src/storage/high_availability/ob_storage_ha_utils.h b/src/storage/high_availability/ob_storage_ha_utils.h index 7173098b91..8261820d57 100644 --- a/src/storage/high_availability/ob_storage_ha_utils.h +++ b/src/storage/high_availability/ob_storage_ha_utils.h @@ -50,6 +50,8 @@ public: static int calc_tablet_sstable_macro_block_cnt( const ObTabletHandle &tablet_handle, int64_t &data_macro_block_count); + static int check_tenant_will_be_deleted( + bool &is_deleted); private: static int check_merge_error_(const uint64_t tenant_id, common::ObISQLClient &sql_client);