fix diag tenant disconnected

This commit is contained in:
nroskill
2023-03-22 03:41:58 +00:00
committed by ob-robot
parent 7a508b40d6
commit 5ac4cddd5c
10 changed files with 38 additions and 112 deletions

View File

@ -809,7 +809,6 @@ const double OB_DIAG_CPU = 1.0;
const double OB_DATA_CPU = 2.5; const double OB_DATA_CPU = 2.5;
const double OB_RS_CPU = 1.0; const double OB_RS_CPU = 1.0;
const double OB_SVR_BLACKLIST_CPU = 1.0; const double OB_SVR_BLACKLIST_CPU = 1.0;
const int64_t OB_DIAG_MEMORY = 2L << 30;
const int64_t OB_RS_MEMORY = 2L << 30; const int64_t OB_RS_MEMORY = 2L << 30;
const uint64_t OB_INVALID_TENANT_ID = 0; const uint64_t OB_INVALID_TENANT_ID = 0;
@ -824,7 +823,6 @@ const uint64_t OB_DATA_TENANT_ID = 509;
const uint64_t OB_RS_TENANT_ID = 510; const uint64_t OB_RS_TENANT_ID = 510;
const uint64_t OB_GTS_SOURCE_TENANT_ID = 511; const uint64_t OB_GTS_SOURCE_TENANT_ID = 511;
const uint64_t OB_SVR_BLACKLIST_TENANT_ID = 512; const uint64_t OB_SVR_BLACKLIST_TENANT_ID = 512;
const uint64_t OB_DIAG_TENANT_ID = 999;
const uint64_t OB_MAX_RESERVED_TENANT_ID = 1000; const uint64_t OB_MAX_RESERVED_TENANT_ID = 1000;
const uint64_t OB_USER_TENANT_ID = 1000; const uint64_t OB_USER_TENANT_ID = 1000;
@ -1854,8 +1852,7 @@ OB_INLINE bool is_virtual_tenant_for_memory(const uint64_t tenant_id)
{ {
return is_virtual_tenant_id(tenant_id) && return is_virtual_tenant_id(tenant_id) &&
(OB_EXT_LOG_TENANT_ID == tenant_id || (OB_EXT_LOG_TENANT_ID == tenant_id ||
OB_RS_TENANT_ID == tenant_id || OB_RS_TENANT_ID == tenant_id);
OB_DIAG_TENANT_ID == tenant_id);
} }
enum ObNameCaseMode enum ObNameCaseMode

View File

@ -349,6 +349,8 @@ ProbeAction probe_str2action(const char *str)
action = ProbeAction::PROBE_ABORT; action = ProbeAction::PROBE_ABORT;
} else if (0 == strcmp(str, "disable")) { } else if (0 == strcmp(str, "disable")) {
action = ProbeAction::PROBE_DISABLE; action = ProbeAction::PROBE_DISABLE;
} else if (0 == strcmp(str, "stack")) {
action = ProbeAction::PROBE_STACK;
} }
return action; return action;
} }
@ -369,6 +371,10 @@ const char *probe_action2str(ProbeAction action)
str = "disable"; str = "disable";
break; break;
} }
case ProbeAction::PROBE_STACK: {
str = "stack";
break;
}
default: { default: {
str = "none"; str = "none";
break; break;

View File

@ -31,6 +31,7 @@
#include <cstring> #include <cstring>
#include <sys/uio.h> #include <sys/uio.h>
#include <sys/statfs.h> #include <sys/statfs.h>
#include <signal.h>
#include "lib/ob_errno.h" #include "lib/ob_errno.h"
#include "ob_log_print_kv.h" #include "ob_log_print_kv.h"
@ -238,6 +239,7 @@ enum class ProbeAction
PROBE_BT, PROBE_BT,
PROBE_ABORT, PROBE_ABORT,
PROBE_DISABLE, PROBE_DISABLE,
PROBE_STACK,
}; };
//@class ObLogger //@class ObLogger
@ -1107,6 +1109,10 @@ inline void ObLogger::check_probe(
disable = true; disable = true;
break; break;
} }
case ProbeAction::PROBE_STACK: {
IGNORE_RETURN raise(60);
break;
}
default: { default: {
// do nothing // do nothing
break; break;

View File

@ -422,6 +422,8 @@ int ObMPBase::setup_user_resource_group(
} else if (!is_valid_tenant_id(tenant_id)) { } else if (!is_valid_tenant_id(tenant_id)) {
ret = OB_INVALID_ARGUMENT; ret = OB_INVALID_ARGUMENT;
LOG_WARN("Invalid tenant", K(tenant_id), K(ret)); LOG_WARN("Invalid tenant", K(tenant_id), K(ret));
} else if (conn.group_id_ == OBCG_DIAG_TENANT) {
// OBCG_DIAG_TENANT was set in check_update_tenant_id, DO NOT overlap it.
} else if (OB_FAIL(G_RES_MGR.get_mapping_rule_mgr().get_group_id_by_user( } else if (OB_FAIL(G_RES_MGR.get_mapping_rule_mgr().get_group_id_by_user(
tenant_id, user_id, group_id))) { tenant_id, user_id, group_id))) {
LOG_WARN("fail get group id by user", K(user_id), K(tenant_id), K(ret)); LOG_WARN("fail get group id by user", K(user_id), K(tenant_id), K(ret));

View File

@ -419,50 +419,7 @@ int ObMPConnect::load_privilege_info(ObSQLSessionInfo &session)
ObString host_name; ObString host_name;
uint64_t client_attr_cap_flags = 0; uint64_t client_attr_cap_flags = 0;
if (OB_DIAG_TENANT_ID == conn->tenant_id_) { if (true) {
const ObString scramble_str(conn->scramble_buf_);
if (OB_FAIL(GCTX.diag_->check_passwd(hsr_.get_auth_response(), scramble_str))) {
LOG_WARN("diag password mismatch", K(ret));
} else {
// Attention!! must set session capability firstly
share::schema::ObSessionPrivInfo session_priv;
uint64_t db_id = OB_INVALID_ID;
if (ORACLE_MODE == session.get_compatibility_mode()) {
//
hsr_.set_client_found_rows();
}
session.set_capability(hsr_.get_capability_flags());
session.set_user_priv_set(OB_PRIV_ALL);
session.set_db_priv_set(OB_PRIV_ALL);
host_name.assign_ptr(OB_SYS_HOST_NAME, static_cast<int32_t>(strlen(OB_SYS_HOST_NAME)));
if (OB_FAIL(session.init_tenant(OB_SYS_TENANT_NAME, OB_SYS_TENANT_ID))) {
LOG_WARN("failed to init_tenant", K(ret));
} else if (OB_FAIL(session.set_tenant(tenant_name_, OB_DIAG_TENANT_ID))) {
LOG_WARN("failed to set_tenant", K(ret));
} else if (OB_FAIL(session.set_user(user_name_, OB_SYS_HOST_NAME, 0))) {
LOG_WARN("failed to set_user", K(ret));
} else if (OB_FAIL(session.set_real_client_ip(client_ip_))) {
LOG_WARN("failed to set_real_client_ip", K(ret));
} else if (OB_FAIL(session.set_default_database(session_priv.db_))) {
LOG_WARN("failed to set default database", K(ret), K(session_priv.db_));
} else if (OB_FAIL(session.load_default_sys_variable(false, true))) {
LOG_WARN("failed to load system variables", K(ret));
} else if (OB_FAIL(session.update_database_variables(&schema_guard))) {
LOG_WARN("failed to update database variables", K(ret));
} else if (OB_FAIL(session.update_max_packet_size())) {
LOG_WARN("failed to update max packet size", K(ret));
} else if (OB_FAIL(schema_guard.get_database_id(session.get_effective_tenant_id(),
session.get_database_name(),
db_id))) {
LOG_WARN("failed to get database id", K(ret));
} else if (OB_FAIL(get_client_attribute_capability(client_attr_cap_flags))) {
LOG_WARN("failed to get client attribute capability", K(ret));
} else {
session.set_database_id(db_id);
session.set_client_attrbuite_capability(client_attr_cap_flags);
}
}
} else {
// TODO, checker ret // TODO, checker ret
if (tenant_name_.empty()) { if (tenant_name_.empty()) {
tenant_name_ = ObString::make_string(OB_SYS_TENANT_NAME); tenant_name_ = ObString::make_string(OB_SYS_TENANT_NAME);
@ -1741,33 +1698,9 @@ int ObMPConnect::extract_real_scramble(const ObString &proxy_scramble)
int ObMPConnect::verify_connection(const uint64_t tenant_id) const int ObMPConnect::verify_connection(const uint64_t tenant_id) const
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
const int32_t FAKE_PORT = 324;
const char *IPV4_LOCAL_STR = "127.0.0.1"; const char *IPV4_LOCAL_STR = "127.0.0.1";
const char *IPV6_LOCAL_STR = "::1"; const char *IPV6_LOCAL_STR = "::1";
ObSMConnection *conn = get_conn(); ObSMConnection *conn = get_conn();
ObAddr ipv4_local, ipv6_local;
// The monitor and the diagnose are not allowed to login by remote
// client. Here we check whether peer is local address(127.0.0.1 or ::1)
// or public address for self. If client connects to server with IP of
// 127.0.0.1 we'll get peer IP of 127.0.0.1, it is server's public
// address otherwise. It all depends upon which interface the client
// is using.
if (OB_ISNULL(conn)) {
ret = OB_INVALID_ARGUMENT;
LOG_ERROR("connection is NULL", K(ret));
} else if (!ipv4_local.set_ip_addr(IPV4_LOCAL_STR, FAKE_PORT)
|| !ipv6_local.set_ip_addr(IPV6_LOCAL_STR, FAKE_PORT)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("set ObAddr failed", K(ret), K(IPV4_LOCAL_STR), K(IPV6_LOCAL_STR), K(FAKE_PORT));
} else if (OB_DIAG_TENANT_ID == conn->tenant_id_) {
if (!(get_peer().is_equal_except_port(ipv4_local)
|| get_peer().is_equal_except_port(ipv6_local)
|| get_peer().is_equal_except_port(GCTX.self_addr()))) {
ret = OB_ERR_NO_PRIVILEGE;
LOG_WARN("The diagnose isn't allowed to login by remote client", K(get_peer()), K(ret));
}
}
if (OB_SUCC(ret)) { if (OB_SUCC(ret)) {
//if normal tenant can not login with error variables, sys tenant can recover the error variables //if normal tenant can not login with error variables, sys tenant can recover the error variables
@ -1824,24 +1757,29 @@ int ObMPConnect::check_update_tenant_id(ObSMConnection &conn, uint64_t &tenant_i
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
if (tenant_name_.case_compare(OB_DIAG_TENANT_NAME) == 0) { if (tenant_name_.case_compare(OB_DIAG_TENANT_NAME) == 0) {
tenant_name_ = user_name_; tenant_name_ = user_name_;
user_name_ = ObString::make_string("root"); conn.group_id_ = OBCG_DIAG_TENANT;
if (OB_FAIL(get_tenant_id(tenant_id))) { }
LOG_WARN("get_tenant_id failed", K(ret)); if (OB_FAIL(get_tenant_id(tenant_id))) {
if (OB_ERR_TENANT_IS_LOCKED == ret) {
LOG_WARN("tenant is locked", K(ret), K_(tenant_name));
LOG_USER_ERROR(OB_ERR_TENANT_IS_LOCKED, tenant_name_.length(), tenant_name_.ptr());
} else { } else {
conn.tenant_id_ = tenant_id; LOG_WARN("get_tenant_id failed", K(ret));
conn.resource_group_id_ = OB_DIAG_TENANT_ID;
} }
} else { } else {
if (OB_FAIL(get_tenant_id(tenant_id))) { conn.tenant_id_ = tenant_id;
if (OB_ERR_TENANT_IS_LOCKED == ret) { conn.resource_group_id_ = tenant_id;
LOG_WARN("tenant is locked", K(ret), K_(tenant_name)); if (OBCG_DIAG_TENANT == conn.group_id_) {
LOG_USER_ERROR(OB_ERR_TENANT_IS_LOCKED, tenant_name_.length(), tenant_name_.ptr()); 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) {
user_name_ = ObString::make_string(OB_SYS_USER_NAME);
} else if (Worker::CompatMode::ORACLE == compat_mode) {
user_name_ = ObString::make_string(OB_ORA_SYS_USER_NAME);
} else { } else {
LOG_WARN("get_tenant_id failed", K(ret)); LOG_WARN("invalid compat mode", K(ret), K(tenant_id), K(compat_mode));
} }
} else {
conn.tenant_id_ = tenant_id;
conn.resource_group_id_ = tenant_id;
} }
} }
if (OB_SUCC(ret)) { if (OB_SUCC(ret)) {

View File

@ -643,12 +643,6 @@ int ObMultiTenant::create_virtual_tenants()
OB_RS_CPU))) { OB_RS_CPU))) {
LOG_ERROR("add RS tenant fail", K(ret)); LOG_ERROR("add RS tenant fail", K(ret));
} else if (OB_FAIL(create_tenant_without_unit(
OB_DIAG_TENANT_ID,
OB_DIAG_CPU,
OB_DIAG_CPU))) {
LOG_ERROR("add diag tenant fail", K(ret));
} else if (OB_FAIL(create_tenant_without_unit( } else if (OB_FAIL(create_tenant_without_unit(
OB_SVR_BLACKLIST_TENANT_ID, OB_SVR_BLACKLIST_TENANT_ID,
OB_SVR_BLACKLIST_CPU, OB_SVR_BLACKLIST_CPU,
@ -686,8 +680,6 @@ int ObMultiTenant::create_tenant_without_unit(const uint64_t tenant_id,
mem_limit = INT64_MAX; mem_limit = INT64_MAX;
} else if (OB_EXT_LOG_TENANT_ID == tenant_id) { } else if (OB_EXT_LOG_TENANT_ID == tenant_id) {
mem_limit = EXT_LOG_TENANT_MEMORY_LIMIT; mem_limit = EXT_LOG_TENANT_MEMORY_LIMIT;
} else if (OB_DIAG_TENANT_ID == tenant_id) {
mem_limit = OB_DIAG_MEMORY;
} else if (OB_RS_TENANT_ID == tenant_id) { } else if (OB_RS_TENANT_ID == tenant_id) {
mem_limit = GCONF.rootservice_memory_limit; mem_limit = GCONF.rootservice_memory_limit;
} else { } else {

View File

@ -140,22 +140,6 @@ void ObThWorker::destroy()
} }
} }
class ObDiagTenantGuard
{
public:
ObDiagTenantGuard(ObThWorker& worker, uint64_t tenant_id): worker_(worker) {
if (OB_DIAG_TENANT_ID == tenant_id) {
worker.set_rpc_tenant(tenant_id);
LOG_INFO("set_rpc_tenant", K(tenant_id));
}
}
~ObDiagTenantGuard() {
worker_.reset_rpc_tenant();
}
private:
ObThWorker& worker_;
};
// by other thread // by other thread
void ObThWorker::resume() void ObThWorker::resume()
{ {
@ -257,7 +241,6 @@ inline void ObThWorker::process_request(rpc::ObRequest &req)
bool need_wait_lock = false; bool need_wait_lock = false;
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
reset_sql_throttle_current_priority(); reset_sql_throttle_current_priority();
ObDiagTenantGuard diag_guard(*this, tenant_? tenant_->id(): OB_SYS_TENANT_ID);
set_req_flag(&req); set_req_flag(&req);
memtable::TLOCAL_NEED_WAIT_IN_LOCK_WAIT_MGR = false; memtable::TLOCAL_NEED_WAIT_IN_LOCK_WAIT_MGR = false;
@ -313,6 +296,7 @@ inline void ObThWorker::process_request(rpc::ObRequest &req)
pm_hold); pm_hold);
} }
set_req_flag(NULL); set_req_flag(NULL);
reset_rpc_tenant();
} }
void ObThWorker::set_th_worker_thread_name(uint64_t tenant_id) void ObThWorker::set_th_worker_thread_name(uint64_t tenant_id)

View File

@ -14,4 +14,5 @@ CGID_DEF(OBCG_LOC_CACHE, 10)
CGID_DEF(OBCG_SQL_NIO, 11) CGID_DEF(OBCG_SQL_NIO, 11)
CGID_DEF(OBCG_MYSQL_LOGIN, 12) CGID_DEF(OBCG_MYSQL_LOGIN, 12)
CGID_DEF(OBCG_CDCSERVICE, 13) CGID_DEF(OBCG_CDCSERVICE, 13)
CGID_DEF(OBCG_DIAG_TENANT, 14)
CGID_DEF(OBCG_LQ, 100) CGID_DEF(OBCG_LQ, 100)

View File

@ -419,7 +419,7 @@ int ObDfcServer::get_current_tenant_dfc(uint64_t tenant_id, ObTenantDfc *&tenant
} else if (tenant_id != tenant_dfc->get_tenant_id()) { } else if (tenant_id != tenant_dfc->get_tenant_id()) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_ERROR("unexpected tenant mtl", K(tenant_id), K(tenant_dfc->get_tenant_id())); LOG_ERROR("unexpected tenant mtl", K(tenant_id), K(tenant_dfc->get_tenant_id()));
// if (OB_SYS_TENANT_ID == tenant_dfc->get_tenant_id() || OB_DIAG_TENANT_ID == tenant_dfc->get_tenant_id()) { // if (OB_SYS_TENANT_ID == tenant_dfc->get_tenant_id()) {
// // 这里是为了解决 sys 租户 change tenant 到其它租户后,要求能使用 dtl 服务 // // 这里是为了解决 sys 租户 change tenant 到其它租户后,要求能使用 dtl 服务
// // 否则有 bug: // // 否则有 bug:
// // // //

View File

@ -223,7 +223,7 @@ int ObAdminServerExecutor::execute(int argc, char *argv[])
} else { } else {
srv_proxy_.set_server(dst_server_); srv_proxy_.set_server(dst_server_);
srv_proxy_.set_timeout(timeout_); srv_proxy_.set_timeout(timeout_);
int64_t tenant_id = atoll(getenv("tenant")?:"0")?:OB_DIAG_TENANT_ID; int64_t tenant_id = atoll(getenv("tenant")?:"0")?:OB_SYS_TENANT_ID;
srv_proxy_.set_tenant(tenant_id); srv_proxy_.set_tenant(tenant_id);
inited_ = true; inited_ = true;
COMMON_LOG(INFO, "process", K(cmd_.c_str()), K_(timeout), K(tenant_id)); COMMON_LOG(INFO, "process", K(cmd_.c_str()), K_(timeout), K(tenant_id));