在备租户同步到普通日志流创建后,尽早返回创建租户命令

This commit is contained in:
obdev
2023-05-15 11:11:32 +00:00
committed by ob-robot
parent 2f6eea23d6
commit 88b861540e
6 changed files with 93 additions and 9 deletions

View File

@ -137,7 +137,6 @@ int ObCreateStandbyFromNetActor::check_has_user_ls(const uint64_t tenant_id, com
int ObCreateStandbyFromNetActor::finish_restore_if_possible_() int ObCreateStandbyFromNetActor::finish_restore_if_possible_()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ObLSRecoveryStat recovery_stat;
ObLSRecoveryStatOperator ls_recovery_operator; ObLSRecoveryStatOperator ls_recovery_operator;
rootserver::ObTenantInfoLoader *tenant_info_loader = MTL(rootserver::ObTenantInfoLoader*); rootserver::ObTenantInfoLoader *tenant_info_loader = MTL(rootserver::ObTenantInfoLoader*);
obrpc::ObCreateTenantEndArg arg; obrpc::ObCreateTenantEndArg arg;
@ -145,29 +144,30 @@ int ObCreateStandbyFromNetActor::finish_restore_if_possible_()
arg.tenant_id_ = tenant_id_; arg.tenant_id_ = tenant_id_;
obrpc::ObCommonRpcProxy *rs_rpc_proxy = GCTX.rs_rpc_proxy_; obrpc::ObCommonRpcProxy *rs_rpc_proxy = GCTX.rs_rpc_proxy_;
ObAllTenantInfo tenant_info; ObAllTenantInfo tenant_info;
SCN min_user_ls_create_scn = SCN::base_scn();
if (OB_ISNULL(rs_rpc_proxy)) { if (OB_ISNULL(rs_rpc_proxy)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
WSTAT("rs_rpc_proxy is null", KP(rs_rpc_proxy)); WSTAT("rs_rpc_proxy is null", KP(rs_rpc_proxy));
} else if (OB_FAIL(check_inner_stat_())) { } else if (OB_FAIL(check_inner_stat_())) {
WSTAT("error unexpected", KR(ret), K(tenant_id_), KP(sql_proxy_)); WSTAT("error unexpected", KR(ret), K(tenant_id_), KP(sql_proxy_));
} else if (OB_FAIL(ls_recovery_operator.get_ls_recovery_stat(tenant_id_, SYS_LS, } else if (OB_FAIL(ls_recovery_operator.get_tenant_min_user_ls_create_scn(tenant_id_, *sql_proxy_,
false/*for_update*/, recovery_stat, *sql_proxy_))) { min_user_ls_create_scn))) {
WSTAT("failed to get ls recovery stat", KR(ret), K_(tenant_id)); WSTAT("failed to get tenant min_user_ls_create_scn", KR(ret), K_(tenant_id));
} else if (OB_ISNULL(tenant_info_loader)) { } else if (OB_ISNULL(tenant_info_loader)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
WSTAT("tenant info loader should not be NULL", KR(ret), KP(tenant_info_loader)); WSTAT("tenant info loader should not be NULL", KR(ret), KP(tenant_info_loader));
} else { } else {
ISTAT("start to wait whether can finish restore", K_(tenant_id), K(recovery_stat)); ISTAT("start to wait whether can finish restore", K_(tenant_id), K(min_user_ls_create_scn));
// wait 1 minute, sleep 1s and retry 60 times // wait 1 minute, sleep 1s and retry 60 times
for (int64_t retry_cnt = 60; OB_SUCC(ret) && retry_cnt > 0 && !has_set_stop(); --retry_cnt) { for (int64_t retry_cnt = 60; OB_SUCC(ret) && retry_cnt > 0 && !has_set_stop(); --retry_cnt) {
if (OB_FAIL(tenant_info_loader->get_tenant_info(tenant_info))) { if (OB_FAIL(tenant_info_loader->get_tenant_info(tenant_info))) {
WSTAT("failed to get tenant info", KR(ret)); WSTAT("failed to get tenant info", KR(ret));
} else if (tenant_info.get_standby_scn() >= recovery_stat.get_sync_scn()) { } else if (tenant_info.get_standby_scn() >= min_user_ls_create_scn) {
ISTAT("tenant readable scn can read inner table", K(tenant_info), K(recovery_stat)); ISTAT("tenant readable scn can read inner table", K(tenant_info), K(min_user_ls_create_scn));
if (OB_FAIL(ObRestoreService::reset_schema_status(tenant_id_, sql_proxy_))) { if (OB_FAIL(ObRestoreService::reset_schema_status(tenant_id_, sql_proxy_))) {
WSTAT("failed to reset schema status", KR(ret), K_(tenant_id), K(tenant_info), K(recovery_stat)); WSTAT("failed to reset schema status", KR(ret), K_(tenant_id), K(tenant_info), K(min_user_ls_create_scn));
} else if (OB_FAIL(rs_rpc_proxy->create_tenant_end(arg))) { } else if (OB_FAIL(rs_rpc_proxy->create_tenant_end(arg))) {
WSTAT("fail to execute create tenant end", KR(ret), K_(tenant_id), K(arg)); WSTAT("fail to execute create tenant end", KR(ret), K_(tenant_id), K(arg));
} else { } else {
@ -179,7 +179,7 @@ int ObCreateStandbyFromNetActor::finish_restore_if_possible_()
} }
} }
ISTAT("finish_restore_if_possible", K(ret), K_(tenant_id), K(recovery_stat), K(arg), K(tenant_info)); ISTAT("finish_restore_if_possible", K(ret), K_(tenant_id), K(min_user_ls_create_scn), K(arg), K(tenant_info));
return ret; return ret;
} }

View File

@ -732,6 +732,7 @@ int ObRecoveryLSService::create_new_ls_(const share::ObLSAttr &ls_attr,
LOG_WARN("ls not create pre operation", KR(ret), K(ls_attr)); LOG_WARN("ls not create pre operation", KR(ret), K(ls_attr));
} else { } else {
//create new ls; //create new ls;
DEBUG_SYNC(BEFORE_RECOVER_USER_LS);
share::schema::ObSchemaGetterGuard schema_guard; share::schema::ObSchemaGetterGuard schema_guard;
const share::schema::ObTenantSchema *tenant_schema = NULL; const share::schema::ObTenantSchema *tenant_schema = NULL;
if (OB_ISNULL(GCTX.schema_service_)) { if (OB_ISNULL(GCTX.schema_service_)) {

View File

@ -486,6 +486,7 @@ int ObAllTenantInfoCache::refresh_tenant_info(const uint64_t tenant_id,
// update last_sql_update_time_ after sql refresh // update last_sql_update_time_ after sql refresh
last_sql_update_time_ = new_refresh_time_us; last_sql_update_time_ = new_refresh_time_us;
} else { } else {
ret = OB_EAGAIN;
LOG_WARN("refresh tenant info conflict", K(new_tenant_info), K(new_refresh_time_us), LOG_WARN("refresh tenant info conflict", K(new_tenant_info), K(new_refresh_time_us),
K(tenant_id), K(tenant_info_), K(last_sql_update_time_), K(ora_rowscn_), K(ora_rowscn)); K(tenant_id), K(tenant_info_), K(last_sql_update_time_), K(ora_rowscn_), K(ora_rowscn));
} }

View File

@ -385,6 +385,69 @@ int ObLSRecoveryStatOperator::get_tenant_recovery_stat(const uint64_t tenant_id,
return ret; return ret;
} }
int ObLSRecoveryStatOperator::get_tenant_min_user_ls_create_scn(const uint64_t tenant_id,
ObISQLClient &client,
SCN &min_user_ls_create_scn)
{
int ret = OB_SUCCESS;
min_user_ls_create_scn = SCN::base_scn();
if (OB_UNLIKELY(OB_INVALID_TENANT_ID == tenant_id)) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid_argument", KR(ret), K(tenant_id));
} else {
common::ObSqlString sql;
const uint64_t exec_tenant_id = get_exec_tenant_id(tenant_id);
ObSEArray<ObLSRecoveryStat, 1> ls_recovery_array;
if (OB_FAIL(sql.assign_fmt(
"select min(create_scn) as min_create_scn from %s where tenant_id = %lu and ls_id != %ld",
OB_ALL_LS_RECOVERY_STAT_TNAME, tenant_id, SYS_LS.id()))) {
LOG_WARN("failed to assign sql", KR(ret), K(sql), K(tenant_id));
} else if (OB_FAIL(get_min_create_scn_(tenant_id, sql, client, min_user_ls_create_scn))) {
LOG_WARN("failed to get min_create_scn", KR(ret), K(tenant_id), K(sql));
}
}
return ret;
}
int ObLSRecoveryStatOperator::get_min_create_scn_(
const uint64_t tenant_id,
const common::ObSqlString &sql,
ObISQLClient &client,
SCN &min_create_scn)
{
int ret = OB_SUCCESS;
min_create_scn = SCN::base_scn();
if (OB_UNLIKELY(OB_INVALID_TENANT_ID == tenant_id)) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid_argument", KR(ret), K(tenant_id));
} else {
const uint64_t exec_tenant_id = get_exec_tenant_id(tenant_id);
HEAP_VAR(ObMySQLProxy::MySQLResult, res) {
common::sqlclient::ObMySQLResult *result = NULL;
if (OB_FAIL(client.read(res, exec_tenant_id, sql.ptr()))) {
LOG_WARN("failed to read", KR(ret), K(exec_tenant_id), K(tenant_id), K(sql));
} else if (OB_ISNULL(result = res.get_result())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("failed to get sql result", KR(ret));
} else if (OB_FAIL(result->next())) {
LOG_WARN("failed to get next", KR(ret), K(sql));
} else if (OB_ISNULL(result)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("result is null", KR(ret), K(tenant_id), K(exec_tenant_id), K(sql));
} else {
uint64_t min_create_scn_val = OB_INVALID_SCN_VAL;
EXTRACT_UINT_FIELD_MYSQL(*result, "min_create_scn", min_create_scn_val, uint64_t);
if (OB_FAIL(ret)) {
LOG_WARN("failed to get min_create_scn", KR(ret), K(tenant_id), K(exec_tenant_id), K(sql));
} else if (OB_FAIL(min_create_scn.convert_for_inner_table_field(min_create_scn_val))) {
LOG_WARN("failed to convert_for_inner_table_field", KR(ret), K(min_create_scn_val), K(tenant_id), K(exec_tenant_id), K(sql));
}
}
}
}
return ret;
}
int ObLSRecoveryStatOperator::get_tenant_max_sync_scn(const uint64_t tenant_id, int ObLSRecoveryStatOperator::get_tenant_max_sync_scn(const uint64_t tenant_id,
ObISQLClient &client, ObISQLClient &client,
SCN &max_sync_scn) SCN &max_sync_scn)

View File

@ -206,6 +206,18 @@ public:
SCN &sync_scn, SCN &sync_scn,
SCN &min_wrs); SCN &min_wrs);
/**
* @description:
* get tenant min user ls create scn
* @param[in] tenant_id
* @param[in] client
* @param[out] min_user_ls_create_scn
* @return return code
*/
int get_tenant_min_user_ls_create_scn(const uint64_t tenant_id,
ObISQLClient &client,
SCN &min_user_ls_create_scn);
/* /*
* description: get tenant max sync_scn across all ls * description: get tenant max sync_scn across all ls
* @param[in] tenant_id * @param[in] tenant_id
@ -226,6 +238,12 @@ public:
ObISQLClient &client, ObISQLClient &client,
SCN &sync_scn); SCN &sync_scn);
private: private:
int get_min_create_scn_(const uint64_t tenant_id,
const common::ObSqlString &sql,
ObISQLClient &client,
SCN &min_create_scn);
bool need_update_ls_recovery_(const ObLSRecoveryStat &old_recovery, bool need_update_ls_recovery_(const ObLSRecoveryStat &old_recovery,
const ObLSRecoveryStat &new_recovery); const ObLSRecoveryStat &new_recovery);
int get_all_ls_recovery_stat_(const uint64_t tenant_id, int get_all_ls_recovery_stat_(const uint64_t tenant_id,

View File

@ -396,6 +396,7 @@ class ObString;
ACT(BEFORE_DO_FLASHBACK,)\ ACT(BEFORE_DO_FLASHBACK,)\
ACT(PREPARE_FLASHBACK_FOR_SWITCH_TO_PRIMARY,)\ ACT(PREPARE_FLASHBACK_FOR_SWITCH_TO_PRIMARY,)\
ACT(SWITCHING_TO_STANDBY,)\ ACT(SWITCHING_TO_STANDBY,)\
ACT(BEFORE_RECOVER_USER_LS,)\
ACT(BEFORE_PREPARE_FLASHBACK,)\ ACT(BEFORE_PREPARE_FLASHBACK,)\
ACT(BEFORE_LS_RESTORE_SYS_TABLETS,)\ ACT(BEFORE_LS_RESTORE_SYS_TABLETS,)\
ACT(BEFORE_WAIT_RESTORE_SYS_TABLETS,)\ ACT(BEFORE_WAIT_RESTORE_SYS_TABLETS,)\