Fix unlimited number of Oracle tenant connections

This commit is contained in:
obdev
2023-09-08 12:25:54 +08:00
committed by ob-robot
parent 806419da22
commit 9592bdb48f
4 changed files with 36 additions and 5 deletions

View File

@ -529,6 +529,7 @@ STAT_EVENT_SET_DEF(CPU_TIME, "cpu time", ObStatClassIds::RESOURCE, 140013, false
STAT_EVENT_SET_DEF(MEMORY_LIMIT, "effective observer memory limit", ObStatClassIds::RESOURCE, 140014, false, true) STAT_EVENT_SET_DEF(MEMORY_LIMIT, "effective observer memory limit", ObStatClassIds::RESOURCE, 140014, false, true)
STAT_EVENT_SET_DEF(SYSTEM_MEMORY, "effective system memory", ObStatClassIds::RESOURCE, 140015, false, true) STAT_EVENT_SET_DEF(SYSTEM_MEMORY, "effective system memory", ObStatClassIds::RESOURCE, 140015, false, true)
STAT_EVENT_SET_DEF(HIDDEN_SYS_MEMORY, "effective hidden sys memory", ObStatClassIds::RESOURCE, 140016, false, true) STAT_EVENT_SET_DEF(HIDDEN_SYS_MEMORY, "effective hidden sys memory", ObStatClassIds::RESOURCE, 140016, false, true)
STAT_EVENT_SET_DEF(MAX_SESSION_NUM, "max session num", ObStatClassIds::RESOURCE, 140017, false, true)
//CLOG //CLOG

View File

@ -1826,10 +1826,19 @@ int ObMPConnect::verify_connection(const uint64_t tenant_id) const
LOG_WARN("failed to verify_ip_white_list", K(ret)); LOG_WARN("failed to verify_ip_white_list", K(ret));
} else { } else {
const int64_t tenant_id = conn->tenant_id_; const int64_t tenant_id = conn->tenant_id_;
if (OB_SYS_TENANT_ID == tenant_id || // sys tenant or root(SYS) user is considered as vip
0 == user_name_.compare(OB_SYS_USER_NAME)) { bool check_max_sess = tenant_id != OB_SYS_TENANT_ID;
// sys tenant or root user is considered as vip if (check_max_sess) {
} else { lib::Worker::CompatMode compat_mode = lib::Worker::CompatMode::INVALID;
if (OB_FAIL(ObCompatModeGetter::get_tenant_mode(tenant_id, compat_mode))) {
LOG_WARN("get_compat_mode failed", K(ret), K(tenant_id));
} else if (Worker::CompatMode::MYSQL == compat_mode) {
check_max_sess = user_name_.compare(OB_SYS_USER_NAME) != 0;
} else if (Worker::CompatMode::ORACLE == compat_mode) {
check_max_sess = user_name_.compare(OB_ORA_SYS_USER_NAME) != 0;
}
}
if (OB_SUCC(ret) && check_max_sess) {
omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id)); omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id));
if (tenant_config.is_valid()) { if (tenant_config.is_valid()) {
int64_t max_sess_num = 0; int64_t max_sess_num = 0;
@ -1848,7 +1857,7 @@ int ObMPConnect::verify_connection(const uint64_t tenant_id) const
cur_connections))) { cur_connections))) {
LOG_WARN("fail to get session count", K(ret)); LOG_WARN("fail to get session count", K(ret));
} else if (tenant_exists && cur_connections >= max_sess_num) { } else if (tenant_exists && cur_connections >= max_sess_num) {
ret = OB_RESOURCE_OUT; ret = OB_ERR_CON_COUNT_ERROR;
LOG_WARN("too much sessions", K(ret), K(tenant_id), K(cur_connections), K(max_sess_num), LOG_WARN("too much sessions", K(ret), K(tenant_id), K(cur_connections), K(max_sess_num),
K(tenant_name_), K(user_name_)); K(tenant_name_), K(user_name_));
} }

View File

@ -247,6 +247,19 @@ int ObAllVirtualSysStat::update_all_stats_(const int64_t tenant_id, ObStatEventS
} else { } else {
// it is ok to not have any records // it is ok to not have any records
} }
{
omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id));
if (tenant_config.is_valid()) {
MTL_SWITCH(tenant_id) {
auto *tenant_base = MTL_CTX();
int64_t max_sess_num = tenant_base->get_max_session_num(tenant_config->_resource_limit_max_session_num);
stat_events.get(ObStatEventIds::MAX_SESSION_NUM - ObStatEventIds::STAT_EVENT_ADD_END - 1)->stat_value_
= max_sess_num;
}
}
}
ret = ret_bk; ret = ret_bk;
} }
return ret; return ret;

View File

@ -343,6 +343,14 @@ int ObConnectResourceMgr::on_user_connect(
session.set_conn_res_user_id(user_id); session.set_conn_res_user_id(user_id);
} }
} }
} else {
if (!session.has_got_tenant_conn_res()) {
if (OB_FAIL(apply_for_tenant_conn_resource(tenant_id, priv, UINT64_MAX))) {
LOG_WARN("reach teannt max connections", K(ret));
} else {
session.set_got_tenant_conn_res(true);
}
}
} }
return ret; return ret;
} }