add sys_recovery_scn to __all_tenant_info && primary tenant iter log
This commit is contained in:
@ -19,7 +19,7 @@
|
||||
#include "rootserver/ob_rs_event_history_table_operator.h" // ROOTSERVICE_EVENT_ADD
|
||||
#include "rootserver/ob_tenant_role_transition_service.h" // ObTenantRoleTransitionService
|
||||
#include "rootserver/ob_primary_ls_service.h"//ObTenantLSInfo
|
||||
#include "share/ls/ob_ls_recovery_stat_operator.h"// ObLSRecoveryStatOperator
|
||||
#include "share/restore/ob_log_restore_source_mgr.h" // ObLogRestoreSourceMgr
|
||||
#include "share/ls/ob_ls_life_manager.h" //ObLSLifeAgentManager
|
||||
#include "share/ls/ob_ls_operator.h" //ObLSAttr
|
||||
#include "storage/tx/ob_timestamp_service.h" // ObTimestampService
|
||||
@ -281,8 +281,6 @@ int ObPrimaryStandbyService::do_recover_tenant(
|
||||
const uint64_t exec_tenant_id = gen_meta_tenant_id(tenant_id);
|
||||
common::ObMySQLTransaction trans;
|
||||
const ObSimpleTenantSchema *tenant_schema = nullptr;
|
||||
ObLSRecoveryStatOperator ls_recovery_operator;
|
||||
ObLSRecoveryStat sys_ls_recovery;
|
||||
if (OB_FAIL(check_inner_stat_())) {
|
||||
LOG_WARN("inner stat error", KR(ret), K_(inited));
|
||||
} else if (!obrpc::ObRecoverTenantArg::is_valid(recover_type, recovery_until_scn)
|
||||
@ -313,19 +311,16 @@ int ObPrimaryStandbyService::do_recover_tenant(
|
||||
} else if (tenant_info.get_switchover_status() != working_sw_status) {
|
||||
ret = OB_OP_NOT_ALLOW;
|
||||
LOG_WARN("unexpected tenant switchover status", KR(ret), K(working_sw_status), K(tenant_info));
|
||||
} else if (OB_FAIL(ls_recovery_operator.get_ls_recovery_stat(tenant_id, share::SYS_LS,
|
||||
true /*for_update*/, sys_ls_recovery, trans))) {
|
||||
LOG_WARN("failed to get ls recovery stat", KR(ret), K(tenant_id));
|
||||
} else if (obrpc::ObRecoverTenantArg::RecoverType::UNTIL == recover_type
|
||||
&& (recovery_until_scn < tenant_info.get_sync_scn()
|
||||
|| recovery_until_scn < sys_ls_recovery.get_sync_scn())) {
|
||||
|| recovery_until_scn < tenant_info.get_sys_recovery_scn())) {
|
||||
ret = OB_OP_NOT_ALLOW;
|
||||
LOG_WARN("recover before tenant sync_scn or SYS LS sync_scn is not allow", KR(ret), K(tenant_info),
|
||||
K(tenant_id), K(recover_type), K(recovery_until_scn), K(sys_ls_recovery));
|
||||
LOG_USER_ERROR(OB_OP_NOT_ALLOW, "recover before tenant sync_scn or SYS LS sync_scn is");
|
||||
LOG_WARN("recover before tenant sync_scn or sys recovery scn is not allow", KR(ret), K(tenant_info),
|
||||
K(tenant_id), K(recover_type), K(recovery_until_scn));
|
||||
LOG_USER_ERROR(OB_OP_NOT_ALLOW, "recover before tenant sync_scn or sys recovery scn is");
|
||||
} else if (tenant_schema->is_normal()) {
|
||||
const SCN &recovery_until_scn_to_set = obrpc::ObRecoverTenantArg::RecoverType::UNTIL == recover_type ?
|
||||
recovery_until_scn : SCN::max(tenant_info.get_sync_scn(), sys_ls_recovery.get_sync_scn());
|
||||
recovery_until_scn : SCN::max(tenant_info.get_sync_scn(), tenant_info.get_sys_recovery_scn());
|
||||
if (tenant_info.get_recovery_until_scn() == recovery_until_scn_to_set) {
|
||||
LOG_WARN("recovery_until_scn is same with original", KR(ret), K(tenant_info), K(tenant_id),
|
||||
K(recover_type), K(recovery_until_scn));
|
||||
@ -423,23 +418,15 @@ int ObPrimaryStandbyService::switch_to_standby(
|
||||
K(tenant_id));
|
||||
}
|
||||
}
|
||||
case share::ObTenantSwitchoverStatus::PREPARE_SWITCHING_TO_STANDBY_STATUS: {
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (OB_FAIL(switch_to_standby_prepare_ls_status_(tenant_id,
|
||||
tenant_info.get_switchover_status(),
|
||||
tenant_info.get_switchover_epoch(),
|
||||
tenant_info))) {
|
||||
LOG_WARN("failed to switch_to_standby_prepare_ls_status_", KR(ret), K(tenant_id), K(tenant_info));
|
||||
}
|
||||
}
|
||||
case share::ObTenantSwitchoverStatus::SWITCHING_TO_STANDBY_STATUS: {
|
||||
if (OB_FAIL(ret)) {
|
||||
} else {
|
||||
//change sys ls asscess mode and wait sys_recovery_scn to latest
|
||||
ObTenantRoleTransitionService role_transition_service(tenant_id, sql_proxy_, GCTX.srv_rpc_proxy_, switch_optype);
|
||||
|
||||
(void)role_transition_service.set_switchover_epoch(tenant_info.get_switchover_epoch());
|
||||
if (OB_FAIL(role_transition_service.do_switch_access_mode_to_raw_rw(tenant_info))) {
|
||||
LOG_WARN("failed to do_switch_access_mode", KR(ret), K(tenant_id), K(tenant_info));
|
||||
if (OB_FAIL(role_transition_service.switchover_to_standby(tenant_info))) {
|
||||
LOG_WARN("failed to switchover to standby", KR(ret), K(tenant_info));
|
||||
} else if (OB_FAIL(role_transition_service.switchover_update_tenant_status(tenant_id,
|
||||
false /* switch_to_standby */,
|
||||
share::STANDBY_TENANT_ROLE,
|
||||
@ -508,8 +495,8 @@ int ObPrimaryStandbyService::update_tenant_status_before_sw_to_standby_(
|
||||
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,
|
||||
PRIMARY_TENANT_ROLE, cur_switchover_status,
|
||||
share::PREP_SWITCHING_TO_STANDBY_SWITCHOVER_STATUS, new_switchover_ts))) {
|
||||
STANDBY_TENANT_ROLE, cur_switchover_status,
|
||||
share::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));
|
||||
} else if (OB_FAIL(ObAllTenantInfoProxy::load_tenant_info(
|
||||
tenant_id, &trans, true, new_tenant_info))) {
|
||||
@ -533,68 +520,6 @@ int ObPrimaryStandbyService::update_tenant_status_before_sw_to_standby_(
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObPrimaryStandbyService::switch_to_standby_prepare_ls_status_(
|
||||
const uint64_t tenant_id,
|
||||
const ObTenantSwitchoverStatus &status,
|
||||
const int64_t switchover_epoch,
|
||||
ObAllTenantInfo &new_tenant_info)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObMySQLTransaction trans;
|
||||
ObLSAttr sys_ls_attr;
|
||||
share::ObLSAttrOperator ls_operator(tenant_id, sql_proxy_);
|
||||
share::schema::ObSchemaGetterGuard schema_guard;
|
||||
const share::schema::ObTenantSchema *tenant_schema = NULL;
|
||||
int64_t new_switchover_epoch = OB_INVALID_VERSION;
|
||||
|
||||
if (!is_user_tenant(tenant_id)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid argument", KR(ret), K(tenant_id));
|
||||
} else if (OB_ISNULL(GCTX.schema_service_)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("schema_service_ is NULL", KR(ret));
|
||||
} else if (OB_FAIL(check_inner_stat_())) {
|
||||
LOG_WARN("inner stat error", KR(ret), K_(inited));
|
||||
} else if (OB_UNLIKELY(!status.is_prepare_switching_to_standby_status())) {
|
||||
ret = OB_OP_NOT_ALLOW;
|
||||
LOG_WARN("switchover status not match, switchover to standby not allow", KR(ret), K(status));
|
||||
LOG_USER_ERROR(OB_OP_NOT_ALLOW, "switchover status not match, switchover to standby");
|
||||
} else if (OB_FAIL(GCTX.schema_service_->get_tenant_schema_guard(OB_SYS_TENANT_ID, schema_guard))) {
|
||||
LOG_WARN("fail to get schema guard", KR(ret));
|
||||
} else if (OB_FAIL(schema_guard.get_tenant_info(tenant_id, tenant_schema))) {
|
||||
LOG_WARN("failed to get tenant ids", KR(ret), K(tenant_id));
|
||||
} else if (OB_ISNULL(tenant_schema)) {
|
||||
ret = OB_TENANT_NOT_EXIST;
|
||||
LOG_WARN("tenant not exist", KR(ret), K(tenant_id));
|
||||
} else {
|
||||
ObTenantLSInfo tenant_stat(GCTX.sql_proxy_, tenant_schema, tenant_id,
|
||||
GCTX.srv_rpc_proxy_, GCTX.lst_operator_);
|
||||
/* lock SYS_LS to get accurate LS list, then fix ls status to make ls status consistency
|
||||
between __all_ls&__all_ls_status.
|
||||
Refer to ls operator, insert/update/delete of ls table are executed in the SYS_LS lock
|
||||
and normal switchover status */
|
||||
if (OB_FAIL(tenant_stat.process_ls_status_missmatch(true/* lock_sys_ls */,
|
||||
share::PREP_SWITCHING_TO_STANDBY_SWITCHOVER_STATUS))) {
|
||||
LOG_WARN("failed to process_ls_status_missmatch", KR(ret));
|
||||
} else if (OB_FAIL(ObAllTenantInfoProxy::update_tenant_role(
|
||||
tenant_id, sql_proxy_, switchover_epoch,
|
||||
share::STANDBY_TENANT_ROLE, status,
|
||||
share::SWITCHING_TO_STANDBY_SWITCHOVER_STATUS, new_switchover_epoch))) {
|
||||
LOG_WARN("failed to update tenant role", KR(ret), K(tenant_id), K(switchover_epoch));
|
||||
} else if (OB_FAIL(ObAllTenantInfoProxy::load_tenant_info(
|
||||
tenant_id, sql_proxy_, false, new_tenant_info))) {
|
||||
LOG_WARN("failed to load tenant info", KR(ret), K(tenant_id));
|
||||
} else if (OB_UNLIKELY(new_tenant_info.get_switchover_epoch() != new_switchover_epoch)) {
|
||||
ret = OB_NEED_RETRY;
|
||||
LOG_WARN("switchover is concurrency", KR(ret), K(switchover_epoch), K(new_tenant_info));
|
||||
}
|
||||
|
||||
DEBUG_SYNC(SWITCHING_TO_STANDBY);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObPrimaryStandbyService::write_upgrade_barrier_log(
|
||||
ObMySQLTransaction &trans,
|
||||
const uint64_t tenant_id,
|
||||
@ -637,5 +562,5 @@ int ObPrimaryStandbyService::write_upgrade_barrier_log(
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
}//end of share
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user