[4.3] fix some remain problems about clone
This commit is contained in:
committed by
ant-ob-hengtang
parent
37621d8cfe
commit
3755b0308e
@ -25786,7 +25786,7 @@ int ObDDLService::modify_and_cal_resource_pool_diff(
|
||||
LOG_WARN("fail to grant pool", K(ret), K(diff_pools));
|
||||
} else if (OB_FAIL(unit_mgr_->grant_pools(
|
||||
trans, new_ug_id_array, compat_mode, diff_pools, tenant_id,
|
||||
OB_INVALID_TENANT_ID/*source_tenant_id*/))) {
|
||||
false/*is_bootstrap*/, OB_INVALID_TENANT_ID/*source_tenant_id*/))) {
|
||||
LOG_WARN("fail to grant pools", K(ret));
|
||||
}
|
||||
} else if (new_pool_name_list.count() + 1 == old_pool_name_list.count()) {
|
||||
@ -26596,6 +26596,11 @@ int ObDDLService::drop_tenant(const ObDropTenantArg &arg)
|
||||
if (OB_FAIL(ObAllTenantInfoProxy::load_tenant_info(
|
||||
user_tenant_id, sql_proxy_, false, tenant_info))) {
|
||||
LOG_WARN("failed to load tenant info", KR(ret), K(arg), K(user_tenant_id));
|
||||
} else if (!tenant_info.is_primary() && !tenant_info.is_standby()) {
|
||||
ret = OB_NOT_SUPPORTED;
|
||||
LOG_WARN("drop tenant not in primary or standby role is not supported",
|
||||
KR(ret), K(arg), K(tenant_info));
|
||||
LOG_USER_ERROR(OB_NOT_SUPPORTED, "should drop tenant force, drop tenant");
|
||||
} else if (tenant_info.is_standby() && !open_recyclebin) {
|
||||
//if standby tenant and no recyclebin, need drop force
|
||||
drop_force = true;
|
||||
|
||||
@ -1972,19 +1972,19 @@ int ObDRWorker::try_disaster_recovery()
|
||||
int ObDRWorker::check_whether_the_tenant_role_can_exec_dr_(const uint64_t tenant_id)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObAllTenantInfo tenant_info;
|
||||
|
||||
if (OB_UNLIKELY(!inited_)) {
|
||||
ret = OB_NOT_INIT;
|
||||
LOG_WARN("not init", KR(ret));
|
||||
} else if (OB_UNLIKELY(OB_INVALID_ID == tenant_id)) {
|
||||
} else if (OB_UNLIKELY(OB_INVALID_ID == tenant_id)
|
||||
|| OB_ISNULL(GCTX.sql_proxy_)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid argument", KR(ret), K(tenant_id));
|
||||
} else {
|
||||
if (is_sys_tenant(tenant_id) || is_meta_tenant(tenant_id)) {
|
||||
ret = OB_SUCCESS;
|
||||
} else {
|
||||
ObAllTenantInfo tenant_info;
|
||||
if (OB_FAIL(ObAllTenantInfoProxy::load_tenant_info(tenant_id,
|
||||
} else if (is_sys_tenant(tenant_id) || is_meta_tenant(tenant_id)) {
|
||||
// good, sys tenant and meta tenant can not in clone procedure
|
||||
} else if (OB_FAIL(ObAllTenantInfoProxy::load_tenant_info(
|
||||
tenant_id,
|
||||
GCTX.sql_proxy_,
|
||||
false,
|
||||
tenant_info))) {
|
||||
@ -1994,9 +1994,7 @@ int ObDRWorker::check_whether_the_tenant_role_can_exec_dr_(const uint64_t tenant
|
||||
LOG_INFO("the tenant is currently in the clone processing and disaster recovery will"
|
||||
" not be executed for the time being", KR(ret), K(tenant_id));
|
||||
} else {
|
||||
ret = OB_SUCCESS;
|
||||
}
|
||||
}
|
||||
// good, can do dr-task
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -433,8 +433,8 @@ int ObTenantRoleTransitionService::do_switch_access_mode_to_append(
|
||||
LOG_WARN("Tenant status changed by concurrent operation, switch to primary not allowed",
|
||||
KR(ret), K(tenant_info), K(cur_tenant_info));
|
||||
LOG_USER_ERROR(OB_OP_NOT_ALLOW, "tenant status changed by concurrent operation, switch to primary");
|
||||
} else if (OB_FAIL(ObAllTenantInfoProxy::update_tenant_role(
|
||||
tenant_id_, &trans, tenant_info.get_switchover_epoch(),
|
||||
} else if (OB_FAIL(ObAllTenantInfoProxy::update_tenant_role_in_trans(
|
||||
tenant_id_, trans, tenant_info.get_switchover_epoch(),
|
||||
share::PRIMARY_TENANT_ROLE, tenant_info.get_switchover_status(),
|
||||
share::NORMAL_SWITCHOVER_STATUS, switchover_epoch_))) {
|
||||
LOG_WARN("failed to update tenant switchover status", KR(ret), K(tenant_id_), K(tenant_info), K(cur_tenant_info));
|
||||
|
||||
@ -1286,17 +1286,29 @@ int ObUpgradeExecutor::construct_tenant_ids_(
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObArray<uint64_t> standby_tenants;
|
||||
bool is_standby = false;
|
||||
ObTenantRole tenant_role(share::ObTenantRole::INVALID_TENANT);
|
||||
ObSchemaGetterGuard schema_guard;
|
||||
if (OB_FAIL(check_inner_stat_())) {
|
||||
LOG_WARN("fail to check inner stat", KR(ret));
|
||||
} else if (OB_FAIL(schema_service_->get_tenant_schema_guard(OB_SYS_TENANT_ID, schema_guard))) {
|
||||
LOG_WARN("fail to get sys tenant schema guard", KR(ret));
|
||||
} else if (src_tenant_ids.count() > 0) {
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < src_tenant_ids.count(); i++) {
|
||||
const uint64_t tenant_id = src_tenant_ids.at(i);
|
||||
if (OB_FAIL(ObAllTenantInfoProxy::is_standby_tenant(sql_proxy_, tenant_id, is_standby))) {
|
||||
LOG_WARN("fail to check is standby tenant", KR(ret), K(tenant_id));
|
||||
} else if (is_standby) {
|
||||
const ObSimpleTenantSchema *tenant_schema = nullptr;
|
||||
if (OB_FAIL(schema_guard.get_tenant_info(tenant_id, tenant_schema))) {
|
||||
LOG_WARN("fail to get tenant info", KR(ret), K(tenant_id));
|
||||
} else if (OB_ISNULL(tenant_schema)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("tenant schema is null", KR(ret), KP(tenant_schema));
|
||||
} else if (!tenant_schema->is_normal()) {
|
||||
ret = OB_NOT_SUPPORTED;
|
||||
LOG_WARN("not support to upgrade a standby tenant", KR(ret), K(tenant_id));
|
||||
LOG_WARN("tenant is not normal, can not do upgrade", KR(ret), K(tenant_id), KPC(tenant_schema));
|
||||
} else if (OB_FAIL(ObAllTenantInfoProxy::get_tenant_role(sql_proxy_, tenant_id, tenant_role))) {
|
||||
LOG_WARN("fail to get tenant role", KR(ret), K(tenant_id), K(tenant_role));
|
||||
} else if (!tenant_role.is_primary()) {
|
||||
ret = OB_NOT_SUPPORTED;
|
||||
LOG_WARN("not support to upgrade a non-primary tenant", KR(ret), K(tenant_id), K(tenant_role));
|
||||
}
|
||||
} // end for
|
||||
// tenant_list is specified
|
||||
@ -1310,10 +1322,23 @@ int ObUpgradeExecutor::construct_tenant_ids_(
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < tenant_ids.count(); i++) {
|
||||
const uint64_t tenant_id = tenant_ids.at(i);
|
||||
if (OB_FAIL(ObAllTenantInfoProxy::is_standby_tenant(sql_proxy_, tenant_id, is_standby))) {
|
||||
LOG_WARN("fail to check is standby tenant", KR(ret), K(tenant_id));
|
||||
} else if (is_standby) {
|
||||
const ObSimpleTenantSchema *tenant_schema = nullptr;
|
||||
if (OB_FAIL(schema_guard.get_tenant_info(tenant_id, tenant_schema))) {
|
||||
LOG_WARN("fail to get tenant info", KR(ret), K(tenant_id));
|
||||
} else if (OB_ISNULL(tenant_schema)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("tenant schema is null", KR(ret), KP(tenant_schema));
|
||||
} else if (!tenant_schema->is_normal()) {
|
||||
ret = OB_NOT_SUPPORTED;
|
||||
LOG_WARN("tenant is not normal, can not do upgrade", KR(ret), K(tenant_id), KPC(tenant_schema));
|
||||
} else if (OB_FAIL(ObAllTenantInfoProxy::get_tenant_role(sql_proxy_, tenant_id, tenant_role))) {
|
||||
LOG_WARN("fail to get tenant role", KR(ret), K(tenant_id), K(tenant_role));
|
||||
} else if (tenant_role.is_standby()) {
|
||||
// skip
|
||||
} else if (!tenant_role.is_primary()) {
|
||||
ret = OB_NOT_SUPPORTED;
|
||||
LOG_WARN("not support do upgrade with tenant role is neither primary nor standby",
|
||||
KR(ret), K(tenant_id), K(tenant_role));
|
||||
} else if (OB_FAIL(dst_tenant_ids.push_back(tenant_id))) {
|
||||
LOG_WARN("fail to push back tenant_id", KR(ret), K(tenant_id));
|
||||
}
|
||||
|
||||
@ -1082,6 +1082,7 @@ int ObCloneScheduler::clone_user_finish(const share::ObCloneJob &job)
|
||||
uint64_t user_tenant_id = job.get_tenant_id();
|
||||
bool sync_satisfied = true;
|
||||
|
||||
DEBUG_SYNC(BEFORE_CREATE_CLONE_TENANT_END);
|
||||
if (IS_NOT_INIT) {
|
||||
ret = OB_NOT_INIT;
|
||||
LOG_WARN("not inited", KR(ret));
|
||||
|
||||
@ -36,7 +36,8 @@ static const char* conflict_case_with_clone_strs[] = {
|
||||
"MODIFY_UNIT",
|
||||
"MODIFY_LS",
|
||||
"MODIFY_REPLICA",
|
||||
"SWITCHOVER"
|
||||
"MODIFY_TENANT_ROLE_OR_SWITCHOVER_STATUS",
|
||||
"DELAY_DROP_TENANT"
|
||||
};
|
||||
|
||||
const char* ObConflictCaseWithClone::get_case_name_str() const
|
||||
@ -1291,6 +1292,8 @@ int ObTenantSnapshotUtil::check_tenant_has_no_conflict_tasks(
|
||||
} else if (is_sys_tenant(tenant_id) || is_meta_tenant(tenant_id)) {
|
||||
ret = OB_OP_NOT_ALLOW;
|
||||
LOG_WARN("sys or meta tenant can not in clone procedure, clone not allowed", KR(ret), K(tenant_id));
|
||||
} else if (OB_FAIL(check_tenant_is_in_dropping_procedure_(tenant_id))) {
|
||||
LOG_WARN("fail to check tenant in dropping procedure", KR(ret), K(tenant_id));
|
||||
} else if (OB_FAIL(check_tenant_is_in_upgrading_procedure_(tenant_id, data_version))) {
|
||||
LOG_WARN("fail to check tenant in upgrading procedure", KR(ret), K(tenant_id));
|
||||
} else if (OB_FAIL(check_tenant_is_in_transfer_procedure_(tenant_id))) {
|
||||
@ -1314,13 +1317,40 @@ int ObTenantSnapshotUtil::check_tenant_has_no_conflict_tasks(
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTenantSnapshotUtil::check_tenant_is_in_dropping_procedure_(
|
||||
const uint64_t tenant_id)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
int64_t check_begin_time = ObTimeUtility::current_time();
|
||||
ObConflictCaseWithClone case_to_check(ObConflictCaseWithClone::DELAY_DROP_TENANT);
|
||||
schema::ObTenantStatus tenant_status = ObTenantStatus::TENANT_STATUS_MAX;
|
||||
LOG_INFO("begin to check whether tenant is dropping", K(tenant_id));
|
||||
if (OB_UNLIKELY(!is_valid_tenant_id(tenant_id))) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid tenant id", KR(ret), K(tenant_id));
|
||||
} else if (OB_ISNULL(GCTX.sql_proxy_)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid argument", KR(ret));
|
||||
} else if (OB_FAIL(inner_lock_line_for_all_tenant_table_(tenant_id, *GCTX.sql_proxy_, tenant_status))) {
|
||||
LOG_WARN("fail to lock line in __all_table table", KR(ret), K(tenant_id));
|
||||
} else if (!is_tenant_normal(tenant_status)) {
|
||||
ret = OB_CONFLICT_WITH_CLONE;
|
||||
LOG_WARN("source tenant is in dropping procedure, can not do clone",
|
||||
KR(ret), K(tenant_id), K(tenant_status));
|
||||
LOG_USER_ERROR(OB_CONFLICT_WITH_CLONE, tenant_id, case_to_check.get_case_name_str(), CLONE_PROCEDURE_STR);
|
||||
}
|
||||
int64_t cost = ObTimeUtility::current_time() - check_begin_time;
|
||||
LOG_INFO("finish check whether tenant is dropping", KR(ret), K(tenant_id), K(check_begin_time), K(cost));
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTenantSnapshotUtil::check_tenant_is_in_upgrading_procedure_(
|
||||
const uint64_t tenant_id,
|
||||
uint64_t &data_version)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
data_version = 0;
|
||||
int check_begin_time = ObTimeUtility::current_time();
|
||||
int64_t check_begin_time = ObTimeUtility::current_time();
|
||||
ObConflictCaseWithClone case_to_check(ObConflictCaseWithClone::UPGRADE);
|
||||
LOG_INFO("begin to check whether tenant is upgrading", K(tenant_id));
|
||||
common::ObMySQLTransaction trans;
|
||||
@ -1349,11 +1379,6 @@ int ObTenantSnapshotUtil::check_tenant_is_in_upgrading_procedure_(
|
||||
data_version = target_data_version;
|
||||
}
|
||||
}
|
||||
// TODO@jingyu.cr: need to solve problems below
|
||||
// 1. after current_data_version==target_data_version in upgrade procedure, make sure whether check conflict in steps remained
|
||||
// 2. clone tenant need target_tenant initialize data_version
|
||||
// source tenant baseline + memdump's data_version need same
|
||||
// make sure whether to double check tenant's data_version is same
|
||||
if (trans.is_started()) {
|
||||
int tmp_ret = OB_SUCCESS;
|
||||
if (OB_TMP_FAIL(trans.end(OB_SUCC(ret)))) {
|
||||
@ -1370,7 +1395,7 @@ int ObTenantSnapshotUtil::check_tenant_is_in_transfer_procedure_(
|
||||
const uint64_t tenant_id)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
int check_begin_time = ObTimeUtility::current_time();
|
||||
int64_t check_begin_time = ObTimeUtility::current_time();
|
||||
ObConflictCaseWithClone case_to_check(ObConflictCaseWithClone::TRANSFER);
|
||||
LOG_INFO("begin to check whether tenant is transfer", K(tenant_id));
|
||||
common::ObMySQLTransaction trans;
|
||||
@ -1428,7 +1453,7 @@ int ObTenantSnapshotUtil::check_tenant_is_in_modify_resource_pool_procedure_(
|
||||
const uint64_t tenant_id)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
int check_begin_time = ObTimeUtility::current_time();
|
||||
int64_t check_begin_time = ObTimeUtility::current_time();
|
||||
LOG_INFO("begin to check whether tenant is transfer", K(tenant_id));
|
||||
ObSqlString sql("FetchPool");
|
||||
if (OB_UNLIKELY(!is_valid_tenant_id(tenant_id))) {
|
||||
@ -1472,7 +1497,7 @@ int ObTenantSnapshotUtil::check_tenant_is_in_modify_ls_procedure_(
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
common::ObMySQLTransaction trans;
|
||||
int check_begin_time = ObTimeUtility::current_time();
|
||||
int64_t check_begin_time = ObTimeUtility::current_time();
|
||||
ObConflictCaseWithClone case_to_check(ObConflictCaseWithClone::MODIFY_LS);
|
||||
LOG_INFO("begin to check whether tenant is modifing ls", K(tenant_id));
|
||||
if (OB_UNLIKELY(!is_valid_tenant_id(tenant_id))) {
|
||||
@ -1530,7 +1555,7 @@ int ObTenantSnapshotUtil::check_tenant_is_in_modify_replica_procedure_(
|
||||
observer::ObInnerSQLConnection *conn = NULL;
|
||||
ObSqlString sql("FetchDRTask");
|
||||
int64_t task_cnt = 0;
|
||||
int check_begin_time = ObTimeUtility::current_time();
|
||||
int64_t check_begin_time = ObTimeUtility::current_time();
|
||||
ObConflictCaseWithClone case_to_check(ObConflictCaseWithClone::MODIFY_REPLICA);
|
||||
LOG_INFO("begin to check whether tenant is modifing ls", K(tenant_id));
|
||||
if (OB_UNLIKELY(!is_valid_tenant_id(tenant_id))) {
|
||||
@ -1593,8 +1618,8 @@ int ObTenantSnapshotUtil::check_tenant_is_in_switchover_procedure_(
|
||||
int ret = OB_SUCCESS;
|
||||
common::ObMySQLTransaction trans;
|
||||
ObAllTenantInfo tenant_info;
|
||||
int check_begin_time = ObTimeUtility::current_time();
|
||||
ObConflictCaseWithClone case_to_check(ObConflictCaseWithClone::SWITCHOVER);
|
||||
int64_t check_begin_time = ObTimeUtility::current_time();
|
||||
ObConflictCaseWithClone case_to_check(ObConflictCaseWithClone::MODIFY_TENANT_ROLE_OR_SWITCHOVER_STATUS);
|
||||
LOG_INFO("begin to check whether tenant is switchover", K(tenant_id));
|
||||
if (OB_UNLIKELY(!is_valid_tenant_id(tenant_id))) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
@ -1634,7 +1659,7 @@ int ObTenantSnapshotUtil::check_tenant_is_in_modify_unit_procedure_(
|
||||
int ret = OB_SUCCESS;
|
||||
common::ObMySQLTransaction trans;
|
||||
ObSqlString sql("FetchUnit");
|
||||
int check_begin_time = ObTimeUtility::current_time();
|
||||
int64_t check_begin_time = ObTimeUtility::current_time();
|
||||
LOG_INFO("begin to check whether tenant is modifing unit", K(tenant_id));
|
||||
if (OB_UNLIKELY(!is_valid_tenant_id(tenant_id))) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
@ -1802,3 +1827,65 @@ int ObTenantSnapshotUtil::lock_resource_pool_for_tenant(
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTenantSnapshotUtil::lock_status_for_tenant(
|
||||
ObMySQLTransaction &trans,
|
||||
const uint64_t tenant_id_to_check)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
schema::ObTenantStatus tenant_status = ObTenantStatus::TENANT_STATUS_MAX; // not used
|
||||
if (OB_UNLIKELY(!is_valid_tenant_id(tenant_id_to_check))) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid argument", KR(ret), K(tenant_id_to_check));
|
||||
} else if (!is_user_tenant(tenant_id_to_check)) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(inner_lock_line_for_all_tenant_table_(tenant_id_to_check, trans, tenant_status))) {
|
||||
LOG_WARN("fail to lock line in __all_table table", KR(ret), K(tenant_id_to_check));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTenantSnapshotUtil::inner_lock_line_for_all_tenant_table_(
|
||||
const uint64_t tenant_id_to_lock,
|
||||
ObISQLClient &sql_proxy,
|
||||
share::schema::ObTenantStatus &tenant_status)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
tenant_status = ObTenantStatus::TENANT_STATUS_MAX;
|
||||
ObSqlString sql("TenantLock");
|
||||
if (OB_UNLIKELY(!is_valid_tenant_id(tenant_id_to_lock))) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid argument", KR(ret), K(tenant_id_to_lock));
|
||||
} else if (OB_FAIL(sql.append_fmt("SELECT status FROM %s WHERE tenant_id = %lu FOR UPDATE",
|
||||
OB_ALL_TENANT_TNAME, tenant_id_to_lock))) {
|
||||
LOG_WARN("append_fmt failed", KR(ret), K(tenant_id_to_lock));
|
||||
} else {
|
||||
SMART_VAR(ObISQLClient::ReadResult, result) {
|
||||
common::sqlclient::ObMySQLResult *res = NULL;
|
||||
if (OB_FAIL(sql_proxy.read(result, GCONF.cluster_id, OB_SYS_TENANT_ID, sql.ptr()))) {
|
||||
LOG_WARN("execute sql failed", KR(ret), "sql", sql.ptr());
|
||||
} else if (OB_ISNULL(res = result.get_result())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get mysql result failed", KR(ret));
|
||||
} else if (OB_FAIL(res->next())) {
|
||||
if (OB_ITER_END == ret) {
|
||||
// rewrite error code
|
||||
ret = OB_STATE_NOT_MATCH;
|
||||
LOG_WARN("expect at least one row in __all_tenant", KR(ret), K(sql));
|
||||
} else {
|
||||
LOG_WARN("iterate next result fail", KR(ret), K(sql));
|
||||
}
|
||||
} else {
|
||||
ObString status_str;
|
||||
schema::ObTenantStatus tenant_status;
|
||||
EXTRACT_VARCHAR_FIELD_MYSQL(*res, "status", status_str);
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(schema::get_tenant_status(status_str, tenant_status))) {
|
||||
LOG_WARN("get tenant status failed", KR(ret), K(status_str));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -44,7 +44,8 @@ public:
|
||||
MODIFY_UNIT = 3,
|
||||
MODIFY_LS = 4,
|
||||
MODIFY_REPLICA = 5,
|
||||
SWITCHOVER = 6,
|
||||
MODIFY_TENANT_ROLE_OR_SWITCHOVER_STATUS = 6,
|
||||
DELAY_DROP_TENANT = 7,
|
||||
MAX_CASE_NAME
|
||||
};
|
||||
public:
|
||||
@ -65,7 +66,8 @@ public:
|
||||
bool is_modify_unit() const { return MODIFY_UNIT == case_name_; }
|
||||
bool is_modify_ls() const { return MODIFY_LS == case_name_; }
|
||||
bool is_modify_replica() const { return MODIFY_REPLICA == case_name_; }
|
||||
bool is_switchover() const { return SWITCHOVER == case_name_; }
|
||||
bool is_switchover() const { return MODIFY_TENANT_ROLE_OR_SWITCHOVER_STATUS == case_name_; }
|
||||
bool is_delay_drop_tenant() const { return DELAY_DROP_TENANT == case_name_; }
|
||||
const ConflictCaseWithClone &get_case_name() const { return case_name_; }
|
||||
const char* get_case_name_str() const;
|
||||
private:
|
||||
@ -162,17 +164,47 @@ public:
|
||||
const uint64_t tenant_id,
|
||||
const share::ObTenantSnapshotID &tenant_snapshot_id);
|
||||
// functions to check conflict conditions between clone and other operations
|
||||
// some procedure need to conflict with clone, so need to check whether in clone procedure
|
||||
// 1. ObDRTaskMgr::persist_task_info_ (can not do dr-task)
|
||||
// 2. ObTenantBalanceService::persist_job_and_task_ (can not do transfer)
|
||||
// 3. ObUpgradeExecutor::run_upgrade_begin_action_ (can not do upgrade)
|
||||
// 4. ObTenantSqlService::delay_to_drop_tenant (can not do delay drop tenant)
|
||||
// 5. ObAllTenantInfoProxy::update_tenant_role_in_trans (can not do switchover)
|
||||
// ObAllTenantInfoProxy::update_tenant_status (can not do switchover)
|
||||
// 6. ObUnitTableOperator::update_unit (can not modify unit)
|
||||
// 7. ObUnitTableOperator::update_resource_pool (can not modify resource pool)
|
||||
// 8. ObLSAttrOperator::operator_ls_in_trans_ (can not modify ls)
|
||||
// ObLSAttrOperator::alter_ls_group_in_trans (can not modify ls)
|
||||
// ObLSAttrOperator::update_ls_flag_in_trans (can not modify ls)
|
||||
static int check_tenant_not_in_cloning_procedure(
|
||||
const uint64_t tenant_id,
|
||||
const ObConflictCaseWithClone &case_to_check);
|
||||
static int check_tenant_has_no_conflict_tasks(const uint64_t tenant_id);
|
||||
|
||||
// when update __all_unit, in some case we have to lock __all_unit first and then check clone
|
||||
// called by ObUnitTableOperator::update_unit
|
||||
static int lock_unit_for_tenant(
|
||||
common::ObISQLClient &client,
|
||||
const share::ObUnit &unit,
|
||||
uint64_t &tenant_id_to_lock);
|
||||
|
||||
// when update __all_resource_pool, in some case we have to lock __all_resource_pool first and then check clone
|
||||
// called by ObUnitTableOperator::update_resource_pool
|
||||
static int lock_resource_pool_for_tenant(
|
||||
common::ObISQLClient &client,
|
||||
const share::ObResourcePool &resource_pool);
|
||||
|
||||
// when update __all_tenant, inn some case we have to lock __all_tenant first and then check clone
|
||||
// called by ObTenantSqlService::delay_to_drop_tenant
|
||||
static int lock_status_for_tenant(
|
||||
ObMySQLTransaction &trans,
|
||||
const uint64_t tenant_id_to_check);
|
||||
|
||||
// inner lock __all_tenant for lock_status_for_tenant and check_tenant_is_in_dropping_procedure_
|
||||
static int inner_lock_line_for_all_tenant_table_(
|
||||
const uint64_t tenant_id_to_lock,
|
||||
ObISQLClient &sql_proxy,
|
||||
share::schema::ObTenantStatus &tenant_status);
|
||||
private:
|
||||
static int check_tenant_snapshot_simulated_mutex_(ObMySQLTransaction &trans,
|
||||
const uint64_t tenant_id,
|
||||
@ -204,6 +236,7 @@ private:
|
||||
// @params[in] tenant_id, tenant to check
|
||||
static int check_tenant_is_in_upgrading_procedure_(const uint64_t tenant_id,
|
||||
uint64_t &data_version);
|
||||
static int check_tenant_is_in_dropping_procedure_(const uint64_t tenant_id);
|
||||
static int check_tenant_is_in_transfer_procedure_(const uint64_t tenant_id);
|
||||
static int check_tenant_is_in_modify_resource_pool_procedure_(const uint64_t tenant_id);
|
||||
static int check_tenant_is_in_modify_unit_procedure_(const uint64_t tenant_id);
|
||||
|
||||
@ -568,6 +568,7 @@ class ObString;
|
||||
ACT(BEFORE_SEND_PARALLEL_CREATE_TABLE,)\
|
||||
ACT(BEFORE_DROP_TENANT,)\
|
||||
ACT(BEFORE_WAIT_SYS_LS_END_SCN,)\
|
||||
ACT(BEFORE_CREATE_CLONE_TENANT_END,)\
|
||||
ACT(BEFORE_CALC_CONSISTENT_SCN,)\
|
||||
ACT(MAX_DEBUG_SYNC_POINT,)
|
||||
|
||||
|
||||
@ -576,8 +576,8 @@ int ObPrimaryStandbyService::update_tenant_status_before_sw_to_standby_(
|
||||
} else if (cur_switchover_epoch != tenant_info.get_switchover_epoch()) {
|
||||
ret = OB_NEED_RETRY;
|
||||
LOG_WARN("tenant not expect switchover epoch", KR(ret), K(tenant_info), K(cur_switchover_epoch));
|
||||
} else if (OB_FAIL(ObAllTenantInfoProxy::update_tenant_role(
|
||||
tenant_id, &trans, cur_switchover_epoch,
|
||||
} else if (OB_FAIL(ObAllTenantInfoProxy::update_tenant_role_in_trans(
|
||||
tenant_id, trans, cur_switchover_epoch,
|
||||
PRIMARY_TENANT_ROLE, cur_switchover_status,
|
||||
share::PREP_SWITCHING_TO_STANDBY_SWITCHOVER_STATUS, new_switchover_ts))) {
|
||||
LOG_WARN("failed to update tenant role", KR(ret), K(tenant_id), K(cur_switchover_epoch), K(tenant_info));
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
#include "share/ob_tenant_info_proxy.h"
|
||||
#include "share/ob_cluster_role.h"//ObClusterTYPE
|
||||
#include "share/ob_share_util.h"//ObShareUtil
|
||||
#include "share/ob_tenant_info_proxy.h" //ObAllTenantInfo
|
||||
#include "share/config/ob_server_config.h"//GCONF
|
||||
#include "share/inner_table/ob_inner_table_schema.h"//ALL_TENANT_INFO_TNAME
|
||||
#include "share/ls/ob_ls_i_life_manager.h"//TODO SCN VALUE
|
||||
@ -581,7 +582,47 @@ int ObAllTenantInfoProxy::update_tenant_max_ls_id(
|
||||
|
||||
int ObAllTenantInfoProxy::update_tenant_role(
|
||||
const uint64_t tenant_id,
|
||||
ObISQLClient *proxy,
|
||||
common::ObMySQLProxy *proxy,
|
||||
int64_t old_switchover_epoch,
|
||||
const ObTenantRole &new_role,
|
||||
const ObTenantSwitchoverStatus &old_status,
|
||||
const ObTenantSwitchoverStatus &new_status,
|
||||
int64_t &new_switchover_ts)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
common::ObMySQLTransaction trans;
|
||||
const uint64_t exec_tenant_id = gen_meta_tenant_id(tenant_id);
|
||||
if (OB_UNLIKELY(!is_user_tenant(tenant_id)
|
||||
|| OB_INVALID_VERSION == old_switchover_epoch
|
||||
|| !new_role.is_valid()
|
||||
|| !old_status.is_valid()
|
||||
|| !new_status.is_valid())) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("tenant_info is invalid", KR(ret), K(tenant_id),
|
||||
K(old_switchover_epoch), K(old_status), K(new_role), K(new_status));
|
||||
} else if (OB_ISNULL(proxy)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid argument", KR(ret));
|
||||
} else if (OB_FAIL(trans.start(proxy, exec_tenant_id))) {
|
||||
LOG_WARN("failed to start trans", KR(ret), K(exec_tenant_id), K(tenant_id));
|
||||
} else if (OB_FAIL(update_tenant_role_in_trans(tenant_id, trans, old_switchover_epoch,
|
||||
new_role, old_status, new_status, new_switchover_ts))) {
|
||||
LOG_WARN("fail to update tenant role in trans", KR(ret), K(tenant_id), K(old_switchover_epoch),
|
||||
K(new_role), K(old_status), K(new_status), K(new_switchover_ts));
|
||||
}
|
||||
if (trans.is_started()) {
|
||||
int tmp_ret = OB_SUCCESS;
|
||||
if (OB_SUCCESS != (tmp_ret = trans.end(OB_SUCC(ret)))) {
|
||||
LOG_WARN("failed to commit trans", KR(ret), KR(tmp_ret));
|
||||
ret = OB_SUCC(ret) ? tmp_ret : ret;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObAllTenantInfoProxy::update_tenant_role_in_trans(
|
||||
const uint64_t tenant_id,
|
||||
ObMySQLTransaction &trans,
|
||||
int64_t old_switchover_epoch,
|
||||
const ObTenantRole &new_role,
|
||||
const ObTenantSwitchoverStatus &old_status,
|
||||
@ -594,7 +635,8 @@ int ObAllTenantInfoProxy::update_tenant_role(
|
||||
ObSqlString sql;
|
||||
int64_t affected_rows = 0;
|
||||
ObTimeoutCtx ctx;
|
||||
ObConflictCaseWithClone case_to_check(ObConflictCaseWithClone::SWITCHOVER);
|
||||
ObAllTenantInfo cur_tenant_info;
|
||||
ObConflictCaseWithClone case_to_check(ObConflictCaseWithClone::MODIFY_TENANT_ROLE_OR_SWITCHOVER_STATUS);
|
||||
|
||||
if (OB_UNLIKELY(!is_user_tenant(tenant_id)
|
||||
|| OB_INVALID_VERSION == old_switchover_epoch
|
||||
@ -604,9 +646,8 @@ int ObAllTenantInfoProxy::update_tenant_role(
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("tenant_info is invalid", KR(ret), K(tenant_id), K(old_switchover_epoch), K(old_status),
|
||||
K(new_role), K(new_status));
|
||||
} else if (OB_ISNULL(proxy)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("proxy is null", KR(ret), KP(proxy));
|
||||
} else if (OB_FAIL(ObAllTenantInfoProxy::load_tenant_info(tenant_id, &trans, true, cur_tenant_info))) {
|
||||
LOG_WARN("failed to load all tenant info", KR(ret), K(tenant_id));
|
||||
} else if (OB_FAIL(ObTenantSnapshotUtil::check_tenant_not_in_cloning_procedure(tenant_id, case_to_check))) {
|
||||
LOG_WARN("fail to check whether tenant is in cloning procedure", KR(ret), K(tenant_id));
|
||||
} else if (OB_FAIL(get_new_switchover_epoch_(old_switchover_epoch, old_status, new_status,
|
||||
@ -627,7 +668,7 @@ int ObAllTenantInfoProxy::update_tenant_role(
|
||||
new_switchover_ts, tenant_id, old_switchover_epoch, old_status.to_str()))) {
|
||||
LOG_WARN("failed to assign sql", KR(ret), K(tenant_id), K(old_switchover_epoch),
|
||||
K(new_role), K(old_status), K(sql));
|
||||
} else if (OB_FAIL(proxy->write(exec_tenant_id, sql.ptr(), affected_rows))) {
|
||||
} else if (OB_FAIL(trans.write(exec_tenant_id, sql.ptr(), affected_rows))) {
|
||||
LOG_WARN("failed to execute sql", KR(ret), K(exec_tenant_id), K(sql));
|
||||
} else if (0 == affected_rows) {
|
||||
ret = OB_NEED_RETRY;
|
||||
@ -775,7 +816,7 @@ int ObAllTenantInfoProxy::update_tenant_status(
|
||||
ObTimeoutCtx ctx;
|
||||
int64_t new_switchover_epoch = OB_INVALID_VERSION;
|
||||
ObLogRestoreSourceMgr restore_source_mgr;
|
||||
ObConflictCaseWithClone case_to_check(ObConflictCaseWithClone::SWITCHOVER);
|
||||
ObConflictCaseWithClone case_to_check(ObConflictCaseWithClone::MODIFY_TENANT_ROLE_OR_SWITCHOVER_STATUS);
|
||||
|
||||
if (OB_UNLIKELY(!is_user_tenant(tenant_id)
|
||||
|| !new_role.is_valid()
|
||||
|
||||
@ -283,12 +283,37 @@ private:
|
||||
* OB_SUCCESS update tenant role successfully
|
||||
* OB_NEED_RETRY old_switchover_epoch not match, need retry
|
||||
*/
|
||||
static int update_tenant_role(const uint64_t tenant_id, ObISQLClient *proxy,
|
||||
static int update_tenant_role(
|
||||
const uint64_t tenant_id,
|
||||
common::ObMySQLProxy *proxy,
|
||||
int64_t old_switchover_epoch,
|
||||
const ObTenantRole &new_role,
|
||||
const ObTenantSwitchoverStatus &old_status,
|
||||
const ObTenantSwitchoverStatus &new_status,
|
||||
int64_t &new_switchover_epoch);
|
||||
|
||||
/**
|
||||
* @description: update tenant role of __all_tenant_info in trans, make sure conflict with clone
|
||||
* @param[in] tenant_id
|
||||
* @param[in] trans
|
||||
* @param[in] old_switchover_epoch, for operator concurrency
|
||||
* @param[in] new_role : target tenant role to be update
|
||||
* @param[in] old_status : old switchover status
|
||||
* @param[in] new_status : target switchover status to be update
|
||||
* @param[out] new_switchover_epoch, for operator concurrency
|
||||
* return :
|
||||
* OB_SUCCESS update tenant role successfully
|
||||
* OB_NEED_RETRY old_switchover_epoch not match, need retry
|
||||
*/
|
||||
static int update_tenant_role_in_trans(
|
||||
const uint64_t tenant_id,
|
||||
ObMySQLTransaction &trans,
|
||||
int64_t old_switchover_epoch,
|
||||
const ObTenantRole &new_role,
|
||||
const ObTenantSwitchoverStatus &old_status,
|
||||
const ObTenantSwitchoverStatus &new_status,
|
||||
int64_t &new_switchover_epoch);
|
||||
|
||||
static int fill_cell(common::sqlclient::ObMySQLResult *result, ObAllTenantInfo &tenant_info, int64_t &ora_rowscn);
|
||||
/**
|
||||
* @description: update tenant max ls id while create ls or upgrade, in upgrade from 4100 to 4200,
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
#include "lib/oblog/ob_log_module.h"
|
||||
#include "lib/string/ob_sql_string.h"
|
||||
#include "lib/mysqlclient/ob_isql_client.h"
|
||||
#include "rootserver/tenant_snapshot/ob_tenant_snapshot_util.h" // for ObTenantSnapshotUtil
|
||||
#include "share/ob_dml_sql_splicer.h"
|
||||
#include "share/inner_table/ob_inner_table_schema_constants.h"
|
||||
#include "share/schema/ob_schema_struct.h"
|
||||
@ -90,15 +91,25 @@ int ObTenantSqlService::alter_tenant(
|
||||
|
||||
int ObTenantSqlService::delay_to_drop_tenant(
|
||||
const ObTenantSchema &tenant_schema,
|
||||
ObISQLClient &sql_client,
|
||||
ObMySQLTransaction &trans,
|
||||
const ObString *ddl_stmt_str)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
const ObSchemaOperationType op = OB_DDL_DEL_TENANT_START;
|
||||
rootserver::ObConflictCaseWithClone case_to_check(rootserver::ObConflictCaseWithClone::DELAY_DROP_TENANT);
|
||||
uint64_t tenant_id_to_check_clone = tenant_schema.get_tenant_id();
|
||||
if (!tenant_schema.is_valid()) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid tenant schema", K(tenant_schema), K(ret));
|
||||
} else if (OB_FAIL(replace_tenant(tenant_schema, op, sql_client, ddl_stmt_str))) {
|
||||
} else if (!is_user_tenant(tenant_id_to_check_clone)) {
|
||||
// sys tenant and meta tenant can not in clone procedure
|
||||
} else if (OB_FAIL(rootserver::ObTenantSnapshotUtil::lock_status_for_tenant(trans, tenant_id_to_check_clone))) {
|
||||
LOG_WARN("fail to lock __all_tenant for clone check", KR(ret), K(tenant_id_to_check_clone));
|
||||
} else if (OB_FAIL(rootserver::ObTenantSnapshotUtil::check_tenant_not_in_cloning_procedure(tenant_id_to_check_clone, case_to_check))) {
|
||||
LOG_WARN("fail to check whether tenant is cloning", KR(ret), K(tenant_id_to_check_clone), K(case_to_check));
|
||||
}
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (OB_FAIL(replace_tenant(tenant_schema, op, trans, ddl_stmt_str))) {
|
||||
LOG_WARN("replace_tenant failed", K(tenant_schema), K(op), K(ret));
|
||||
}
|
||||
return ret;
|
||||
@ -175,31 +186,6 @@ int ObTenantSqlService::delete_tenant(
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTenantSqlService::delete_tenant_content(
|
||||
ObISQLClient &client,
|
||||
const uint64_t tenant_id,
|
||||
const char *table_name)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObSqlString sql;
|
||||
int64_t affected_rows = 0;
|
||||
const uint64_t exec_tenant_id = ObSchemaUtils::get_exec_tenant_id(tenant_id);
|
||||
if (OB_INVALID_ID == tenant_id) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid tenant_id", K(tenant_id), K(ret));
|
||||
} else if (OB_ISNULL(table_name)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("table_name is null", K(ret));
|
||||
} else if (OB_FAIL(sql.assign_fmt("DELETE FROM %s WHERE tenant_id = %lu",
|
||||
table_name,
|
||||
ObSchemaUtils::get_extract_tenant_id(exec_tenant_id, tenant_id)))) {
|
||||
LOG_WARN("assign_fmt failed", K(ret));
|
||||
} else if (OB_FAIL(client.write(exec_tenant_id, sql.ptr(), affected_rows))) {
|
||||
LOG_WARN("execute sql failed", K(sql), K(ret));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTenantSqlService::replace_tenant(
|
||||
const ObTenantSchema &tenant_schema,
|
||||
const ObSchemaOperationType op,
|
||||
|
||||
@ -47,7 +47,7 @@ public:
|
||||
common::ObISQLClient &sql_client,
|
||||
const common::ObString *ddl_stmt_str = NULL);
|
||||
virtual int delay_to_drop_tenant(const ObTenantSchema &tenant_schema,
|
||||
ObISQLClient &sql_client,
|
||||
ObMySQLTransaction &trans,
|
||||
const ObString *ddl_stmt_str);
|
||||
virtual int drop_tenant_to_recyclebin(const ObTenantSchema &tenant_schema,
|
||||
common::ObISQLClient &sql_client,
|
||||
@ -57,9 +57,6 @@ public:
|
||||
const int64_t new_schema_version,
|
||||
common::ObISQLClient &sql_client,
|
||||
const common::ObString *ddl_stmt_str = NULL);
|
||||
virtual int delete_tenant_content(common::ObISQLClient &client,
|
||||
const uint64_t tenant_id,
|
||||
const char *table_name);
|
||||
private:
|
||||
int replace_tenant(const ObTenantSchema &tenant_schema,
|
||||
const ObSchemaOperationType op,
|
||||
|
||||
Reference in New Issue
Block a user