Fix sys ls gc check transfer task bug.

This commit is contained in:
godyangfight
2024-01-18 15:12:41 +00:00
committed by ob-robot
parent 9310bf0bb2
commit e8bde18018
5 changed files with 37 additions and 7 deletions

View File

@ -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);

View File

@ -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<omt::ObTenant *>(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;

View File

@ -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));

View File

@ -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<omt::ObTenant *>(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;

View File

@ -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);