Fix unlimited number of Oracle tenant connections
This commit is contained in:
@ -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(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(MAX_SESSION_NUM, "max session num", ObStatClassIds::RESOURCE, 140017, false, true)
|
||||
|
||||
//CLOG
|
||||
|
||||
|
||||
@ -1826,10 +1826,19 @@ int ObMPConnect::verify_connection(const uint64_t tenant_id) const
|
||||
LOG_WARN("failed to verify_ip_white_list", K(ret));
|
||||
} else {
|
||||
const int64_t tenant_id = conn->tenant_id_;
|
||||
if (OB_SYS_TENANT_ID == tenant_id ||
|
||||
0 == user_name_.compare(OB_SYS_USER_NAME)) {
|
||||
// sys tenant or root user is considered as vip
|
||||
} else {
|
||||
// sys tenant or root(SYS) user is considered as vip
|
||||
bool check_max_sess = tenant_id != OB_SYS_TENANT_ID;
|
||||
if (check_max_sess) {
|
||||
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));
|
||||
if (tenant_config.is_valid()) {
|
||||
int64_t max_sess_num = 0;
|
||||
@ -1848,7 +1857,7 @@ int ObMPConnect::verify_connection(const uint64_t tenant_id) const
|
||||
cur_connections))) {
|
||||
LOG_WARN("fail to get session count", K(ret));
|
||||
} 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),
|
||||
K(tenant_name_), K(user_name_));
|
||||
}
|
||||
|
||||
@ -247,6 +247,19 @@ int ObAllVirtualSysStat::update_all_stats_(const int64_t tenant_id, ObStatEventS
|
||||
} else {
|
||||
// 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;
|
||||
}
|
||||
return ret;
|
||||
|
||||
@ -343,6 +343,14 @@ int ObConnectResourceMgr::on_user_connect(
|
||||
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user