[NetStandby] Optimize restore proxy

This commit is contained in:
obdev
2023-11-22 06:40:49 +00:00
committed by ob-robot
parent 8cb4dbadbd
commit 0e5dc3cd30
2 changed files with 58 additions and 17 deletions

View File

@ -69,6 +69,9 @@ namespace share
case OB_ERR_TENANT_IS_LOCKED: \
LOG_USER_ERROR(OB_INVALID_ARGUMENT, "get primary " args ", primary tenant is locked"); \
break; \
case OB_CONNECT_ERROR: \
LOG_USER_ERROR(OB_INVALID_ARGUMENT, "get primary " args ", all servers are unreachable"); \
break; \
default: \
LOG_USER_ERROR(OB_INVALID_ARGUMENT, "get primary " args); \
} \
@ -324,13 +327,16 @@ int ObLogRestoreProxyUtil::try_init(const uint64_t tenant_id,
int ret = OB_SUCCESS;
const char *db_name = nullptr;
ObLogRestoreMySQLProvider tmp_server_prover;
common::ObArray<common::ObAddr> fixed_server_list;
if (OB_FAIL(tmp_server_prover.init(server_list))) {
LOG_WARN("server_prover_ init failed", K(tenant_id), K(server_list));
} else if (OB_FAIL(detect_tenant_mode_(&tmp_server_prover, user_name, user_password))) {
if (OB_FAIL(fixed_server_list.assign(server_list))) {
LOG_WARN("fail to assign fixed server list", K(tenant_id), K(server_list));
} else if (OB_FAIL(tmp_server_prover.init(server_list))) {
LOG_WARN("tmp_server_prover_ init failed", K(tenant_id), K(server_list));
} else if (OB_FAIL(detect_tenant_mode_(&tmp_server_prover, user_name, user_password, &fixed_server_list))) {
LOG_WARN("detect tenant mode failed", KR(ret), K_(user_name));
} else if (OB_FALSE_IT(db_name = is_oracle_mode_ ? OB_ORA_SYS_SCHEMA_NAME : OB_SYS_DATABASE_NAME)) {
} else if (OB_FAIL(init(tenant_id, server_list, user_name, user_password, db_name))) {
} else if (OB_FAIL(init(tenant_id, fixed_server_list, user_name, user_password, db_name))) {
LOG_WARN("[RESTORE PROXY] fail to init restore proxy");
}
@ -726,10 +732,12 @@ void ObLogRestoreProxyUtil::destroy_tg_()
int ObLogRestoreProxyUtil::detect_tenant_mode_(common::sqlclient::ObMySQLServerProvider *server_provider,
const char *user_name,
const char *user_password)
const char *user_password,
common::ObIArray<common::ObAddr> *fixed_server_list)
{
LOG_INFO("start to detec tenant mode");
int ret = OB_SUCCESS;
common::ObArray<int64_t> invalid_ip_array;
if (OB_ISNULL(server_provider)) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("[RESTORE PROXY] invalid server_provider", KR(ret));
@ -740,8 +748,7 @@ int ObLogRestoreProxyUtil::detect_tenant_mode_(common::sqlclient::ObMySQLServerP
LOG_WARN("[RESTORE PROXY] expect valid svr_cnt", K(svr_cnt));
} else {
bool detect_succ = false;
for (int idx = 0; OB_SUCC(ret) && ! detect_succ && idx < svr_cnt; idx++) {
for (int idx = 0; idx < svr_cnt; idx++) {
MYSQL *mysql;
common::ObAddr server;
if (OB_FAIL(server_provider->get_server(idx, server))) {
@ -756,11 +763,17 @@ int ObLogRestoreProxyUtil::detect_tenant_mode_(common::sqlclient::ObMySQLServerP
ret = OB_BUF_NOT_ENOUGH;
LOG_WARN("fail to get host.", K(server), K(ret));
} else if (NULL == (mysql = mysql_init(NULL))) {
LOG_ERROR("mysql_init fail", KR(ret));
ret = OB_ERR_UNEXPECTED;
LOG_ERROR("mysql_init fail", KR(ret));
} else {
int64_t final_timeout = cal_timeout_();
mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT, &final_timeout);
if (mysql != mysql_real_connect(mysql, host, user_name, user_password, default_db_name, port, NULL, 0)) {
LOG_WARN("mysql connect failed", "mysql_error", mysql_error(mysql), K(host), K(port));
int mysql_error_code = mysql_errno(mysql); // remove invalid ip if mysql error code is ER_CONNECT_FAILED
if ((ER_CONNECT_FAILED == mysql_error_code) && OB_FAIL(invalid_ip_array.push_back(idx))) {
LOG_WARN("[RESTORE PROXY] fail to push back invalid_ip_array", K(invalid_ip_array), K(idx));
}
LOG_WARN("[RESTORE PROXY] mysql connect failed", "mysql_error", mysql_error(mysql), K(mysql_error_code), K(host), K(port));
} else {
#ifdef OB_BUILD_ORACLE_PARSER
is_oracle_mode_ = mysql->oracle_mode;
@ -768,24 +781,48 @@ int ObLogRestoreProxyUtil::detect_tenant_mode_(common::sqlclient::ObMySQLServerP
is_oracle_mode_ = false;
#endif
detect_succ = true;
LOG_INFO("[RESTORE PROXY][DETECT_TENANT_MODE] detect tenant mode success", KR(ret));
LOG_INFO("[RESTORE PROXY] detect tenant mode success", KR(ret), K(host), K(port));
}
if (OB_NOT_NULL(mysql)) {
mysql_close(mysql);
}
}
}
if (OB_SUCC(ret) && OB_NOT_NULL(mysql)) {
mysql_close(mysql);
mysql = NULL;
}
mysql = NULL;
}
if (OB_UNLIKELY(!detect_succ)) {
ret = OB_CONNECT_ERROR;
LOG_WARN("[RESTORE PROXY][DETECT_TENANT_MODE] connect to all server in tenant endpoint list failed", KR(ret), K(svr_cnt));
} else if (!invalid_ip_array.empty()) {
for (int64_t idx = invalid_ip_array.count() - 1; idx >= 0; idx--) {
if (OB_FAIL(fixed_server_list->remove(invalid_ip_array.at(idx)))) {
LOG_WARN("[RESTORE PROXY] fail to remove from fixed_server_list", K(invalid_ip_array), K(*fixed_server_list), K(idx));
}
}
LOG_INFO("[RESTORE PROXY] fixed server list", K_(tenant_id), K(*fixed_server_list));
}
if (fixed_server_list->count() <= 0) {
ret = OB_CONNECT_ERROR;
LOG_WARN("[RESTORE PROXY] all servers are unreachable", K_(tenant_id), K(ret));
}
}
}
return ret;
}
int64_t ObLogRestoreProxyUtil::cal_timeout_() {
const int64_t DEFAULT_MAX_TIMEOUT = 10; // default max time is 10s
int64_t final_timeout = DEFAULT_MAX_TIMEOUT;
int64_t abs_timeout_ts = THIS_WORKER.get_timeout_ts();
int64_t curr_ts = ObTimeUtility::fast_current_time();
int64_t abs_timeout = (abs_timeout_ts - curr_ts) /1000 /1000 /2; // half of the total timeout
if (abs_timeout > 0) {
final_timeout = abs_timeout < DEFAULT_MAX_TIMEOUT ? abs_timeout : DEFAULT_MAX_TIMEOUT;
}
LOG_INFO("[RESTORE PROXY] set time out,",
K(abs_timeout_ts), K(curr_ts), K(abs_timeout), K(final_timeout), K(DEFAULT_MAX_TIMEOUT));
return final_timeout;
}
} // namespace share
} // namespace oceanbase

View File

@ -154,7 +154,11 @@ private:
// check if user or password changed
bool is_user_changed_(const char *user_name, const char *user_password);
void destroy_tg_();
int detect_tenant_mode_(common::sqlclient::ObMySQLServerProvider *server_provider, const char *user_name, const char *user_password);
int detect_tenant_mode_(common::sqlclient::ObMySQLServerProvider *server_provider,
const char *user_name,
const char *user_password,
common::ObIArray<common::ObAddr> *new_server_list);
int64_t cal_timeout_();
private:
int construct_server_ip_list(const common::ObSqlString &sql, common::ObIArray<common::ObAddr> &addrs);
bool inited_;