add sys_recovery_scn to __all_tenant_info && primary tenant iter log
This commit is contained in:
@ -18,7 +18,6 @@
|
||||
#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
|
||||
#include "share/ls/ob_ls_recovery_stat_operator.h"//ObLSRecoveryStatOperator
|
||||
#include "lib/string/ob_sql_string.h"//ObSqlString
|
||||
#include "lib/mysqlclient/ob_mysql_transaction.h"//ObMySQLTrans
|
||||
#include "common/ob_timeout_ctx.h"//ObTimeoutCtx
|
||||
@ -37,14 +36,22 @@ bool is_valid_tenant_scn(
|
||||
const SCN &sync_scn,
|
||||
const SCN &replayable_scn,
|
||||
const SCN &standby_scn,
|
||||
const SCN &recovery_until_scn)
|
||||
const SCN &recovery_until_scn,
|
||||
const SCN &sys_recovery_scn)
|
||||
{
|
||||
return standby_scn <= replayable_scn && replayable_scn <= sync_scn && sync_scn <= recovery_until_scn;
|
||||
return standby_scn <= replayable_scn && replayable_scn <= sync_scn && sync_scn <= recovery_until_scn
|
||||
&& (sys_recovery_scn.is_min() || sync_scn <= sys_recovery_scn)
|
||||
&& (sys_recovery_scn.is_min() || sys_recovery_scn <= recovery_until_scn);
|
||||
}
|
||||
|
||||
SCN gen_new_sync_scn(const SCN &cur_sync_scn, const SCN &desired_sync_scn, const SCN &cur_recovery_until_scn)
|
||||
SCN gen_new_sync_scn(const SCN &cur_sync_scn, const SCN &desired_sync_scn, const SCN &cur_recovery_until_scn,
|
||||
const SCN &sys_recovery_scn)
|
||||
{
|
||||
return MIN(MAX(cur_sync_scn, desired_sync_scn), cur_recovery_until_scn);
|
||||
SCN new_sync_scn = MIN(MAX(cur_sync_scn, desired_sync_scn), cur_recovery_until_scn);
|
||||
if (!sys_recovery_scn.is_min()) {
|
||||
new_sync_scn = MIN(new_sync_scn, sys_recovery_scn);
|
||||
}
|
||||
return new_sync_scn;
|
||||
}
|
||||
|
||||
SCN gen_new_replayable_scn(const SCN &cur_replayable_scn, const SCN &desired_replayable_scn, const SCN &new_sync_scn)
|
||||
@ -69,7 +76,8 @@ bool ObAllTenantInfo::is_valid() const
|
||||
&& tenant_role_.is_valid()
|
||||
&& switchover_status_.is_valid()
|
||||
&& log_mode_.is_valid()
|
||||
&& is_valid_tenant_scn(sync_scn_, replayable_scn_, standby_scn_, recovery_until_scn_);
|
||||
&& sys_recovery_scn_.is_valid()
|
||||
&& is_valid_tenant_scn(sync_scn_, replayable_scn_, standby_scn_, recovery_until_scn_, sys_recovery_scn_);
|
||||
}
|
||||
|
||||
int ObAllTenantInfo::init(
|
||||
@ -81,7 +89,8 @@ int ObAllTenantInfo::init(
|
||||
const SCN &replayable_scn,
|
||||
const SCN &standby_scn,
|
||||
const SCN &recovery_until_scn,
|
||||
const ObArchiveMode &log_mode)
|
||||
const ObArchiveMode &log_mode,
|
||||
const SCN &sys_recovery_scn)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (OB_UNLIKELY(OB_INVALID_TENANT_ID == tenant_id
|
||||
@ -93,11 +102,13 @@ int ObAllTenantInfo::init(
|
||||
|| !standby_scn.is_valid_and_not_min()
|
||||
|| !recovery_until_scn.is_valid_and_not_min()
|
||||
|| !log_mode.is_valid()
|
||||
|| !is_valid_tenant_scn(sync_scn, replayable_scn, standby_scn, recovery_until_scn))) {
|
||||
//sys recovery scn is valid and maybe min during upgrade
|
||||
|| !sys_recovery_scn.is_valid()
|
||||
|| !is_valid_tenant_scn(sync_scn, replayable_scn, standby_scn, recovery_until_scn, sys_recovery_scn))) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid argument", KR(ret), K(tenant_id), K(tenant_role), K(switchover_status),
|
||||
K(switchover_epoch), K(sync_scn), K(replayable_scn), K(standby_scn), K(recovery_until_scn),
|
||||
K(log_mode));
|
||||
K(log_mode), K(sys_recovery_scn));
|
||||
} else {
|
||||
tenant_id_ = tenant_id;
|
||||
tenant_role_ = tenant_role;
|
||||
@ -108,6 +119,7 @@ int ObAllTenantInfo::init(
|
||||
standby_scn_ = standby_scn;
|
||||
recovery_until_scn_ = recovery_until_scn;
|
||||
log_mode_ = log_mode;
|
||||
sys_recovery_scn_ = sys_recovery_scn;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@ -125,6 +137,7 @@ void ObAllTenantInfo::assign(const ObAllTenantInfo &other)
|
||||
standby_scn_ = other.standby_scn_;
|
||||
recovery_until_scn_ = other.recovery_until_scn_;
|
||||
log_mode_ = other.log_mode_;
|
||||
sys_recovery_scn_ = other.sys_recovery_scn_;
|
||||
}
|
||||
return ;
|
||||
}
|
||||
@ -140,10 +153,11 @@ void ObAllTenantInfo::reset()
|
||||
standby_scn_.set_min() ;
|
||||
recovery_until_scn_.set_min();
|
||||
log_mode_.reset();
|
||||
sys_recovery_scn_.set_min();
|
||||
}
|
||||
OB_SERIALIZE_MEMBER(ObAllTenantInfo, tenant_id_, tenant_role_,
|
||||
switchover_status_, switchover_epoch_, sync_scn_,
|
||||
replayable_scn_, standby_scn_, recovery_until_scn_, log_mode_);
|
||||
replayable_scn_, standby_scn_, recovery_until_scn_, log_mode_, sys_recovery_scn_);
|
||||
|
||||
ObAllTenantInfo& ObAllTenantInfo::operator= (const ObAllTenantInfo &other)
|
||||
{
|
||||
@ -178,8 +192,8 @@ int ObAllTenantInfoProxy::init_tenant_info(
|
||||
} else if (OB_FAIL(sql.assign_fmt(
|
||||
"insert into %s (tenant_id, tenant_role, "
|
||||
"switchover_status, switchover_epoch, "
|
||||
"sync_scn, replayable_scn, readable_scn, recovery_until_scn, log_mode) "
|
||||
"values(%lu, '%s', '%s', %ld, %lu, %lu, %lu, %lu, '%s')",
|
||||
"sync_scn, replayable_scn, readable_scn, recovery_until_scn, log_mode, sys_recovery_scn) "
|
||||
"values(%lu, '%s', '%s', %ld, %lu, %lu, %lu, %lu, '%s', %lu)",
|
||||
OB_ALL_TENANT_INFO_TNAME, tenant_info.get_tenant_id(),
|
||||
tenant_info.get_tenant_role().to_str(),
|
||||
tenant_info.get_switchover_status().to_str(),
|
||||
@ -188,7 +202,8 @@ int ObAllTenantInfoProxy::init_tenant_info(
|
||||
tenant_info.get_replayable_scn().get_val_for_inner_table_field(),
|
||||
tenant_info.get_standby_scn().get_val_for_inner_table_field(),
|
||||
tenant_info.get_recovery_until_scn().get_val_for_inner_table_field(),
|
||||
tenant_info.get_log_mode().to_str()))) {
|
||||
tenant_info.get_log_mode().to_str(),
|
||||
tenant_info.get_sys_recovery_scn().get_val_for_inner_table_field()))) {
|
||||
LOG_WARN("failed to assign sql", KR(ret), K(tenant_info), K(sql));
|
||||
} else if (OB_FAIL(proxy->write(exec_tenant_id, sql.ptr(), affected_rows))) {
|
||||
LOG_WARN("failed to execute sql", KR(ret), K(exec_tenant_id), K(sql));
|
||||
@ -304,8 +319,7 @@ int ObAllTenantInfoProxy::load_tenant_info(const uint64_t tenant_id,
|
||||
}
|
||||
|
||||
int ObAllTenantInfoProxy::update_tenant_recovery_status(
|
||||
const uint64_t tenant_id, ObMySQLProxy *proxy,
|
||||
ObTenantSwitchoverStatus status, const SCN &sync_scn,
|
||||
const uint64_t tenant_id, ObMySQLProxy *proxy, const SCN &sync_scn,
|
||||
const SCN &replay_scn, const SCN &readable_scn)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
@ -315,10 +329,9 @@ int ObAllTenantInfoProxy::update_tenant_recovery_status(
|
||||
common::ObMySQLTransaction trans;
|
||||
ObAllTenantInfo old_tenant_info;
|
||||
ObTimeoutCtx ctx;
|
||||
if (OB_UNLIKELY(OB_INVALID_TENANT_ID == tenant_id ||
|
||||
!status.is_valid())) {
|
||||
if (OB_UNLIKELY(OB_INVALID_TENANT_ID == tenant_id)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("tenant_info is invalid", KR(ret), K(tenant_id), K(status));
|
||||
LOG_WARN("tenant_id is invalid", KR(ret), K(tenant_id));
|
||||
} else if (OB_ISNULL(proxy)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("proxy is null", KR(ret), KP(proxy));
|
||||
@ -330,7 +343,8 @@ int ObAllTenantInfoProxy::update_tenant_recovery_status(
|
||||
} else if (OB_FAIL(load_tenant_info(tenant_id, &trans, true, old_tenant_info))) {
|
||||
LOG_WARN("failed to load all tenant info", KR(ret), K(tenant_id));
|
||||
} else {
|
||||
SCN new_sync_scn = gen_new_sync_scn(old_tenant_info.get_sync_scn(), sync_scn, old_tenant_info.get_recovery_until_scn());
|
||||
SCN new_sync_scn = gen_new_sync_scn(old_tenant_info.get_sync_scn(), sync_scn,
|
||||
old_tenant_info.get_recovery_until_scn(), old_tenant_info.get_sys_recovery_scn());
|
||||
SCN new_replay_scn = gen_new_replayable_scn(old_tenant_info.get_replayable_scn(), replay_scn, new_sync_scn);
|
||||
SCN new_scn = gen_new_standby_scn(old_tenant_info.get_standby_scn(), readable_scn, new_replay_scn);
|
||||
|
||||
@ -343,14 +357,14 @@ int ObAllTenantInfoProxy::update_tenant_recovery_status(
|
||||
} else if (OB_FAIL(sql.assign_fmt(
|
||||
"update %s set sync_scn = %ld, replayable_scn = %ld, "
|
||||
"readable_scn = %ld where tenant_id = %lu "
|
||||
"and switchover_status = '%s' and readable_scn <= replayable_scn and "
|
||||
"replayable_scn <= sync_scn and sync_scn <= recovery_until_scn", OB_ALL_TENANT_INFO_TNAME,
|
||||
"and readable_scn <= replayable_scn and "
|
||||
"replayable_scn <= sync_scn and sync_scn <= recovery_until_scn and sync_scn <= %lu",
|
||||
OB_ALL_TENANT_INFO_TNAME,
|
||||
new_sync_scn.get_val_for_inner_table_field(),
|
||||
new_replay_scn.get_val_for_inner_table_field(),
|
||||
new_scn.get_val_for_inner_table_field(),
|
||||
tenant_id, status.to_str()))) {
|
||||
LOG_WARN("failed to assign sql", KR(ret), K(tenant_id), K(status),
|
||||
K(sql));
|
||||
tenant_id, new_sync_scn.get_val_for_inner_table_field()))) {
|
||||
LOG_WARN("failed to assign sql", KR(ret), K(tenant_id), K(sql));
|
||||
} 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 (!is_single_row(affected_rows)) {
|
||||
@ -384,12 +398,14 @@ int ObAllTenantInfoProxy::fill_cell(common::sqlclient::ObMySQLResult *result, Ob
|
||||
uint64_t replay_scn_val = OB_INVALID_SCN_VAL;
|
||||
uint64_t sts_scn_val = OB_INVALID_SCN_VAL;
|
||||
uint64_t recovery_until_scn_val = OB_INVALID_SCN_VAL;
|
||||
uint64_t sys_recovery_scn_val = OB_INVALID_SCN_VAL;
|
||||
ObString log_mode_str;
|
||||
ObString log_mode_default_value("NOARCHIVELOG");
|
||||
SCN sync_scn;
|
||||
SCN replay_scn;
|
||||
SCN sts_scn;
|
||||
SCN recovery_until_scn;
|
||||
SCN sys_recovery_scn;
|
||||
EXTRACT_VARCHAR_FIELD_MYSQL(*result, "tenant_role", tenant_role_str);
|
||||
EXTRACT_VARCHAR_FIELD_MYSQL(*result, "switchover_status", status_str);
|
||||
EXTRACT_INT_FIELD_MYSQL(*result, "tenant_id", tenant_id, uint64_t);
|
||||
@ -398,6 +414,7 @@ int ObAllTenantInfoProxy::fill_cell(common::sqlclient::ObMySQLResult *result, Ob
|
||||
EXTRACT_UINT_FIELD_MYSQL(*result, "replayable_scn", replay_scn_val, uint64_t);
|
||||
EXTRACT_UINT_FIELD_MYSQL(*result, "readable_scn", sts_scn_val, uint64_t);
|
||||
EXTRACT_UINT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "recovery_until_scn", recovery_until_scn_val, uint64_t, false /* skip_null_error */, true /* skip_column_error */, OB_MAX_SCN_TS_NS);
|
||||
EXTRACT_UINT_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "sys_recovery_scn", sys_recovery_scn_val, uint64_t, false /* skip_null_error */, true /* skip_column_error */, OB_MIN_SCN_TS_NS);
|
||||
EXTRACT_VARCHAR_FIELD_MYSQL_WITH_DEFAULT_VALUE(*result, "log_mode", log_mode_str,
|
||||
false /* skip_null_error */, true /* skip_column_error */, log_mode_default_value);
|
||||
ObTenantRole tmp_tenant_role(tenant_role_str);
|
||||
@ -414,13 +431,15 @@ int ObAllTenantInfoProxy::fill_cell(common::sqlclient::ObMySQLResult *result, Ob
|
||||
LOG_WARN("failed to convert_for_inner_table_field", KR(ret), K(sts_scn_val));
|
||||
} else if (OB_FAIL(recovery_until_scn.convert_for_inner_table_field(recovery_until_scn_val))) {
|
||||
LOG_WARN("failed to convert_for_inner_table_field", KR(ret), K(recovery_until_scn_val));
|
||||
} else if (OB_FAIL(sys_recovery_scn.convert_for_inner_table_field(sys_recovery_scn_val))) {
|
||||
LOG_WARN("failed to conver for inner table field", KR(ret), K(sys_recovery_scn_val));
|
||||
} else if (OB_FAIL(tenant_info.init(
|
||||
tenant_id, tmp_tenant_role,
|
||||
tmp_tenant_sw_status, switchover_epoch,
|
||||
sync_scn, replay_scn, sts_scn, recovery_until_scn, tmp_log_mode))) {
|
||||
sync_scn, replay_scn, sts_scn, recovery_until_scn, tmp_log_mode, sys_recovery_scn))) {
|
||||
LOG_WARN("failed to init tenant info", KR(ret), K(tenant_id), K(tmp_tenant_role), K(tenant_role_str),
|
||||
K(tmp_tenant_sw_status), K(status_str), K(switchover_epoch), K(sync_scn), K(recovery_until_scn),
|
||||
K(log_mode_str), K(tmp_log_mode));
|
||||
K(log_mode_str), K(tmp_log_mode), K(sys_recovery_scn));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
@ -551,8 +570,6 @@ int ObAllTenantInfoProxy::update_tenant_recovery_until_scn(
|
||||
ObSqlString sql;
|
||||
int64_t affected_rows = 0;
|
||||
ObTimeoutCtx ctx;
|
||||
ObLSRecoveryStatOperator ls_recovery_operator;
|
||||
ObLSRecoveryStat sys_ls_recovery;
|
||||
ObLogRestoreSourceMgr restore_source_mgr;
|
||||
uint64_t compat_version = 0;
|
||||
|
||||
@ -568,27 +585,26 @@ int ObAllTenantInfoProxy::update_tenant_recovery_until_scn(
|
||||
} else if (OB_UNLIKELY(!recovery_until_scn.is_valid_and_not_min())) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("recovery_until_scn invalid", KR(ret), K(recovery_until_scn));
|
||||
} 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 (recovery_until_scn < sys_ls_recovery.get_sync_scn()) {
|
||||
ret = OB_OP_NOT_ALLOW;
|
||||
LOG_WARN("recover before SYS LS sync_scn is not allowed", KR(ret), K(tenant_id), K(recovery_until_scn), K(sys_ls_recovery));
|
||||
LOG_USER_ERROR(OB_OP_NOT_ALLOW, "recover before SYS LS sync_scn is");
|
||||
} else if (OB_FAIL(rootserver::ObRootUtils::get_rs_default_timeout_ctx(ctx))) {
|
||||
LOG_WARN("fail to get timeout ctx", KR(ret), K(ctx));
|
||||
} else if (OB_FAIL(sql.assign_fmt(
|
||||
"update %s set recovery_until_scn = %lu where tenant_id = %lu and sync_scn <= %lu and switchover_epoch = %ld",
|
||||
OB_ALL_TENANT_INFO_TNAME, recovery_until_scn.get_val_for_inner_table_field(), tenant_id,
|
||||
recovery_until_scn.get_val_for_inner_table_field(), switchover_epoch))) {
|
||||
"update %s set recovery_until_scn = %lu where tenant_id = %lu "
|
||||
"and sync_scn <= %lu and switchover_epoch = %ld and sys_recovery_scn <= %lu",
|
||||
OB_ALL_TENANT_INFO_TNAME,
|
||||
recovery_until_scn.get_val_for_inner_table_field(), tenant_id,
|
||||
recovery_until_scn.get_val_for_inner_table_field(),
|
||||
switchover_epoch,
|
||||
recovery_until_scn.get_val_for_inner_table_field()))) {
|
||||
LOG_WARN("failed to assign sql", KR(ret), K(tenant_id), K(recovery_until_scn), K(sql));
|
||||
} 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_OP_NOT_ALLOW;
|
||||
LOG_WARN("state changed, check sync_scn and switchover status", KR(ret), K(tenant_id),
|
||||
LOG_WARN("state changed, check sync_scn, switchover status and sys_recovery_scn", KR(ret), K(tenant_id),
|
||||
K(switchover_epoch), K(recovery_until_scn), K(sql));
|
||||
LOG_USER_ERROR(OB_OP_NOT_ALLOW, "state changed, check sync_scn and switchover status, recover is");
|
||||
LOG_USER_ERROR(OB_OP_NOT_ALLOW,
|
||||
"state changed, check sync_scn, sys_recovery_scn and "
|
||||
"switchover status, recover is");
|
||||
} else if (!is_single_row(affected_rows)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("expect updating one row", KR(ret), K(affected_rows),
|
||||
@ -601,10 +617,10 @@ int ObAllTenantInfoProxy::update_tenant_recovery_until_scn(
|
||||
}
|
||||
|
||||
int64_t cost = ObTimeUtility::current_time() - begin_time;
|
||||
LOG_INFO("update_recovery_until_scn finish", KR(ret), K(tenant_id), K(sys_ls_recovery),
|
||||
LOG_INFO("update_recovery_until_scn finish", KR(ret), K(tenant_id),
|
||||
K(recovery_until_scn), K(affected_rows), K(switchover_epoch), K(sql), K(cost));
|
||||
ROOTSERVICE_EVENT_ADD("tenant_info", "update_recovery_until_scn", K(ret), K(tenant_id),
|
||||
K(recovery_until_scn), K(affected_rows), K(switchover_epoch), K(sys_ls_recovery));
|
||||
K(recovery_until_scn), K(affected_rows), K(switchover_epoch));
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -618,6 +634,7 @@ int ObAllTenantInfoProxy::update_tenant_status(
|
||||
const share::SCN &replayable_scn,
|
||||
const share::SCN &readable_scn,
|
||||
const share::SCN &recovery_until_scn,
|
||||
const share::SCN &sys_recovery_scn,
|
||||
const int64_t old_switchover_epoch)
|
||||
{
|
||||
int64_t begin_time = ObTimeUtility::current_time();
|
||||
@ -628,6 +645,7 @@ int ObAllTenantInfoProxy::update_tenant_status(
|
||||
ObTimeoutCtx ctx;
|
||||
int64_t new_switchover_epoch = OB_INVALID_VERSION;
|
||||
ObLogRestoreSourceMgr restore_source_mgr;
|
||||
ObAllTenantInfo tenant_info;
|
||||
|
||||
if (OB_UNLIKELY(!is_user_tenant(tenant_id)
|
||||
|| !new_role.is_valid()
|
||||
@ -638,15 +656,24 @@ int ObAllTenantInfoProxy::update_tenant_status(
|
||||
|| !replayable_scn.is_valid_and_not_min()
|
||||
|| !readable_scn.is_valid_and_not_min()
|
||||
|| !recovery_until_scn.is_valid_and_not_min()
|
||||
|| !sys_recovery_scn.is_valid_and_not_min()
|
||||
|| OB_INVALID_VERSION == old_switchover_epoch)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("tenant_info is invalid", KR(ret), K(tenant_id), K(new_role), K(old_status),
|
||||
K(new_status), K(sync_scn), K(replayable_scn), K(readable_scn), K(recovery_until_scn),
|
||||
K(old_switchover_epoch));
|
||||
//use tenant_info check parameters valid
|
||||
} else if (OB_FAIL(get_new_switchover_epoch_(old_switchover_epoch, old_status, new_status,
|
||||
new_switchover_epoch))) {
|
||||
LOG_WARN("fail to get_new_switchover_epoch_", KR(ret), K(old_switchover_epoch), K(old_status),
|
||||
K(new_status));
|
||||
} else if (OB_FAIL(tenant_info.init(tenant_id, new_role, new_status, new_switchover_epoch,
|
||||
sync_scn, replayable_scn, readable_scn,
|
||||
recovery_until_scn, NOARCHIVE_MODE, sys_recovery_scn))) {
|
||||
LOG_WARN("failed to init tenant_info", KR(ret), K(tenant_id), K(new_role),
|
||||
K(new_status), K(new_switchover_epoch), K(sync_scn),
|
||||
K(replayable_scn), K(readable_scn), K(recovery_until_scn),
|
||||
K(sys_recovery_scn));
|
||||
} else if (OB_UNLIKELY(OB_INVALID_VERSION == new_switchover_epoch)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("new_switchover_ts is invalid", KR(ret), K(new_switchover_epoch),
|
||||
@ -656,20 +683,22 @@ int ObAllTenantInfoProxy::update_tenant_status(
|
||||
} else if (OB_FAIL(sql.assign_fmt(
|
||||
"update %s set tenant_role = '%s', switchover_status = '%s', "
|
||||
"switchover_epoch = %ld, sync_scn = %lu, replayable_scn = %lu, "
|
||||
"readable_scn = %lu, recovery_until_scn = %lu where tenant_id = %lu "
|
||||
"readable_scn = %lu, recovery_until_scn = %lu ,sys_recovery_scn = %lu where tenant_id = %lu "
|
||||
"and switchover_status = '%s' and switchover_epoch = %ld "
|
||||
"and readable_scn <= replayable_scn and replayable_scn <= sync_scn and sync_scn <= recovery_until_scn "
|
||||
"and sync_scn <= %lu and replayable_scn <= %lu and readable_scn <= %lu ",
|
||||
"and sync_scn <= %lu and replayable_scn <= %lu and readable_scn <= %lu and sys_recovery_scn <= %lu",
|
||||
OB_ALL_TENANT_INFO_TNAME, new_role.to_str(), new_status.to_str(),
|
||||
new_switchover_epoch,
|
||||
sync_scn.get_val_for_inner_table_field(),
|
||||
replayable_scn.get_val_for_inner_table_field(),
|
||||
readable_scn.get_val_for_inner_table_field(),
|
||||
recovery_until_scn.get_val_for_inner_table_field(),
|
||||
sys_recovery_scn.get_val_for_inner_table_field(),
|
||||
tenant_id, old_status.to_str(), old_switchover_epoch,
|
||||
sync_scn.get_val_for_inner_table_field(),
|
||||
replayable_scn.get_val_for_inner_table_field(),
|
||||
readable_scn.get_val_for_inner_table_field()))) {
|
||||
readable_scn.get_val_for_inner_table_field(),
|
||||
sys_recovery_scn.get_val_for_inner_table_field()))) {
|
||||
LOG_WARN("failed to assign sql", KR(ret), K(tenant_id), K(sql));
|
||||
} 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));
|
||||
@ -686,22 +715,6 @@ int ObAllTenantInfoProxy::update_tenant_status(
|
||||
LOG_WARN("failed to update_recovery_until_scn", KR(ret), K(tenant_id), K(recovery_until_scn));
|
||||
}
|
||||
|
||||
ObAllTenantInfo tenant_info;
|
||||
int tmp_ret = OB_SUCCESS;
|
||||
if (OB_SUCCESS != (tmp_ret = tenant_info.init(tenant_id,
|
||||
new_role,
|
||||
new_status,
|
||||
new_switchover_epoch,
|
||||
sync_scn,
|
||||
replayable_scn,
|
||||
readable_scn,
|
||||
recovery_until_scn))) {
|
||||
LOG_WARN("failed to init tenant_info", KR(ret), KR(tmp_ret), K(tenant_id), K(new_role),
|
||||
K(new_status), K(new_switchover_epoch), K(sync_scn),
|
||||
K(replayable_scn), K(readable_scn), K(recovery_until_scn));
|
||||
ret = OB_SUCC(ret) ? tmp_ret : ret;
|
||||
}
|
||||
|
||||
int64_t cost = ObTimeUtility::current_time() - begin_time;
|
||||
ROOTSERVICE_EVENT_ADD("tenant_info", "update_tenant_role", K(ret), K(tenant_id),
|
||||
K(tenant_info), K(old_status), K(old_switchover_epoch), K(cost));
|
||||
@ -770,6 +783,71 @@ int ObAllTenantInfoProxy::update_tenant_log_mode(
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
int ObAllTenantInfoProxy::update_tenant_sys_recovery_scn(
|
||||
const uint64_t tenant_id,
|
||||
const share::SCN &sys_recovery_scn,
|
||||
bool update_sync_scn, ObISQLClient *proxy)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
const uint64_t exec_tenant_id = gen_meta_tenant_id(tenant_id);
|
||||
|
||||
if (OB_UNLIKELY(!is_user_tenant(tenant_id)
|
||||
|| !sys_recovery_scn.is_valid())) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid argument", KR(ret), K(tenant_id), K(sys_recovery_scn));
|
||||
} else {
|
||||
TAKE_IN_TRANS(update_tenant_sys_recovery_scn, proxy, exec_tenant_id,
|
||||
tenant_id, sys_recovery_scn, update_sync_scn);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObAllTenantInfoProxy::update_tenant_sys_recovery_scn_in_trans(
|
||||
const uint64_t tenant_id,
|
||||
const share::SCN &sys_recovery_scn,
|
||||
bool update_sync_scn, common::ObMySQLTransaction &trans)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
const uint64_t exec_tenant_id = gen_meta_tenant_id(tenant_id);
|
||||
ObSqlString sql;
|
||||
int64_t affected_rows = 0;
|
||||
ObTimeoutCtx ctx;
|
||||
ObAllTenantInfo tenant_info;
|
||||
|
||||
if (OB_UNLIKELY(!is_user_tenant(tenant_id)
|
||||
|| !sys_recovery_scn.is_valid())) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid argument", KR(ret), K(tenant_id), K(sys_recovery_scn));
|
||||
} else if (OB_FAIL(rootserver::ObRootUtils::get_rs_default_timeout_ctx(ctx))) {
|
||||
LOG_WARN("fail to get timeout ctx", KR(ret), K(ctx));
|
||||
} else if (OB_FAIL(load_tenant_info(tenant_id, &trans, true, tenant_info))) {
|
||||
LOG_WARN("failed to load tenant info", KR(ret), K(tenant_id));
|
||||
} else if (!tenant_info.get_switchover_status().can_report_recovery_status()
|
||||
|| sys_recovery_scn <= tenant_info.get_sys_recovery_scn()
|
||||
|| sys_recovery_scn > tenant_info.get_recovery_until_scn()
|
||||
|| sys_recovery_scn < tenant_info.get_sync_scn()) {
|
||||
ret = OB_NEED_RETRY;
|
||||
LOG_WARN("can not report recovery status", KR(ret),
|
||||
K(tenant_info), K(sys_recovery_scn));
|
||||
} else if (OB_FAIL(sql.assign_fmt(
|
||||
"update %s set sys_recovery_scn = %lu ",
|
||||
OB_ALL_TENANT_INFO_TNAME, sys_recovery_scn.get_val_for_inner_table_field()))) {
|
||||
LOG_WARN("failed to assign sql", KR(ret), K(tenant_id), K(sys_recovery_scn), K(sql));
|
||||
} else if (update_sync_scn && OB_FAIL(sql.append_fmt(", sync_scn = %lu ",
|
||||
sys_recovery_scn.get_val_for_inner_table_field()))) {
|
||||
LOG_WARN("failed to append sql", KR(ret), K(sys_recovery_scn), K(sql));
|
||||
} 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 (!is_single_row(affected_rows)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("expect updating one row", KR(ret), K(affected_rows), K(sql));
|
||||
}
|
||||
return ret;
|
||||
|
||||
LOG_TRACE("update sys_recovery_scn", KR(ret), K(tenant_id), K(sys_recovery_scn),
|
||||
K(update_sync_scn));
|
||||
}
|
||||
|
||||
} // namespace share
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user