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; 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 struct ObTenantConfig
{ {
OB_UNIS_VERSION(1); 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 static const int64_t UPDATE_MIGRATION_STATUS_INTERVAL_MS = 100 * 1000; //100ms
ObTenantDagScheduler *scheduler = nullptr; ObTenantDagScheduler *scheduler = nullptr;
int32_t result = OB_SUCCESS; int32_t result = OB_SUCCESS;
share::ObTenantBase *tenant_base = MTL_CTX(); bool is_tenant_deleted = false;
omt::ObTenant *tenant = nullptr;
DEBUG_SYNC(BEFORE_COMPLETE_MIGRATION_UPDATE_STATUS); 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*))) { } else if (OB_ISNULL(scheduler = MTL(ObTenantDagScheduler*))) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("failed to get ObTenantDagScheduler from MTL", K(ret)); 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 { } else {
while (!is_finish) { while (!is_finish) {
ObMigrationStatus current_migration_status = ObMigrationStatus::OB_MIGRATION_STATUS_MAX; 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; ret = OB_SERVER_IS_STOPPING;
LOG_WARN("tenant dag scheduler has set stop, stop migration dag net", K(ret), K(ctx_)); LOG_WARN("tenant dag scheduler has set stop, stop migration dag net", K(ret), K(ctx_));
break; 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; ret = OB_TENANT_HAS_BEEN_DROPPED;
LOG_WARN("tenant has been stopped, stop migration dag net", K(ret), K(ctx_)); LOG_WARN("tenant has been stopped, stop migration dag net", K(ret), K(ctx_));
break; break;

View File

@ -547,10 +547,17 @@ int ObMigrationStatusHelper::check_ls_with_transfer_task_(
SCN max_decided_scn(SCN::base_scn()); SCN max_decided_scn(SCN::base_scn());
ObLSService *ls_service = NULL; ObLSService *ls_service = NULL;
ObLSHandle dest_ls_handle; ObLSHandle dest_ls_handle;
bool is_tenant_deleted = false;
if (OB_ISNULL(sql_proxy)) { if (OB_ISNULL(sql_proxy)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("mysql proxy should not be NULL", K(ret), KP(sql_proxy)); 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( } else if (OB_FAIL(ObTransferTaskOperator::get_by_src_ls(
*sql_proxy, tenant_id, src_ls_id, task, share::OBCG_STORAGE))) { *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)); 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; 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 ObTransferUtils::is_need_retry_error(const int err)
{ {
bool bool_ret = false; bool bool_ret = false;

View File

@ -50,6 +50,8 @@ public:
static int calc_tablet_sstable_macro_block_cnt( static int calc_tablet_sstable_macro_block_cnt(
const ObTabletHandle &tablet_handle, int64_t &data_macro_block_count); const ObTabletHandle &tablet_handle, int64_t &data_macro_block_count);
static int check_tenant_will_be_deleted(
bool &is_deleted);
private: private:
static int check_merge_error_(const uint64_t tenant_id, common::ObISQLClient &sql_client); static int check_merge_error_(const uint64_t tenant_id, common::ObISQLClient &sql_client);