fix diag tenant disconnected
This commit is contained in:
		
							
								
								
									
										5
									
								
								deps/oblib/src/lib/ob_define.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								deps/oblib/src/lib/ob_define.h
									
									
									
									
										vendored
									
									
								
							@ -809,7 +809,6 @@ const double OB_DIAG_CPU = 1.0;
 | 
			
		||||
const double OB_DATA_CPU = 2.5;
 | 
			
		||||
const double OB_RS_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 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_GTS_SOURCE_TENANT_ID = 511;
 | 
			
		||||
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_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) &&
 | 
			
		||||
       (OB_EXT_LOG_TENANT_ID == tenant_id ||
 | 
			
		||||
        OB_RS_TENANT_ID == tenant_id ||
 | 
			
		||||
        OB_DIAG_TENANT_ID == tenant_id);
 | 
			
		||||
        OB_RS_TENANT_ID == tenant_id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum ObNameCaseMode
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								deps/oblib/src/lib/oblog/ob_log.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								deps/oblib/src/lib/oblog/ob_log.cpp
									
									
									
									
										vendored
									
									
								
							@ -349,6 +349,8 @@ ProbeAction probe_str2action(const char *str)
 | 
			
		||||
    action = ProbeAction::PROBE_ABORT;
 | 
			
		||||
  } else if (0 == strcmp(str, "disable")) {
 | 
			
		||||
    action = ProbeAction::PROBE_DISABLE;
 | 
			
		||||
  } else if (0 == strcmp(str, "stack")) {
 | 
			
		||||
    action = ProbeAction::PROBE_STACK;
 | 
			
		||||
  }
 | 
			
		||||
  return action;
 | 
			
		||||
}
 | 
			
		||||
@ -369,6 +371,10 @@ const char *probe_action2str(ProbeAction action)
 | 
			
		||||
    str = "disable";
 | 
			
		||||
    break;
 | 
			
		||||
    }
 | 
			
		||||
  case ProbeAction::PROBE_STACK: {
 | 
			
		||||
    str = "stack";
 | 
			
		||||
    break;
 | 
			
		||||
    }
 | 
			
		||||
  default: {
 | 
			
		||||
    str = "none";
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								deps/oblib/src/lib/oblog/ob_log.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								deps/oblib/src/lib/oblog/ob_log.h
									
									
									
									
										vendored
									
									
								
							@ -31,6 +31,7 @@
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <sys/uio.h>
 | 
			
		||||
#include <sys/statfs.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
 | 
			
		||||
#include "lib/ob_errno.h"
 | 
			
		||||
#include "ob_log_print_kv.h"
 | 
			
		||||
@ -238,6 +239,7 @@ enum class ProbeAction
 | 
			
		||||
 PROBE_BT,
 | 
			
		||||
 PROBE_ABORT,
 | 
			
		||||
 PROBE_DISABLE,
 | 
			
		||||
 PROBE_STACK,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//@class ObLogger
 | 
			
		||||
@ -1107,6 +1109,10 @@ inline void ObLogger::check_probe(
 | 
			
		||||
            disable = true;
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
          case ProbeAction::PROBE_STACK: {
 | 
			
		||||
            IGNORE_RETURN raise(60);
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
          default: {
 | 
			
		||||
            // do nothing
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
@ -422,6 +422,8 @@ int ObMPBase::setup_user_resource_group(
 | 
			
		||||
  } else if (!is_valid_tenant_id(tenant_id)) {
 | 
			
		||||
    ret = OB_INVALID_ARGUMENT;
 | 
			
		||||
    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(
 | 
			
		||||
              tenant_id, user_id, group_id))) {
 | 
			
		||||
    LOG_WARN("fail get group id by user", K(user_id), K(tenant_id), K(ret));
 | 
			
		||||
 | 
			
		||||
@ -419,50 +419,7 @@ int ObMPConnect::load_privilege_info(ObSQLSessionInfo &session)
 | 
			
		||||
 | 
			
		||||
    ObString host_name;
 | 
			
		||||
    uint64_t client_attr_cap_flags = 0;
 | 
			
		||||
    if (OB_DIAG_TENANT_ID == conn->tenant_id_) {
 | 
			
		||||
      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 {
 | 
			
		||||
    if (true) {
 | 
			
		||||
      // TODO, checker ret
 | 
			
		||||
      if (tenant_name_.empty()) {
 | 
			
		||||
        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 ret = OB_SUCCESS;
 | 
			
		||||
  const int32_t FAKE_PORT = 324;
 | 
			
		||||
  const char *IPV4_LOCAL_STR = "127.0.0.1";
 | 
			
		||||
  const char *IPV6_LOCAL_STR = "::1";
 | 
			
		||||
  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 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;
 | 
			
		||||
  if (tenant_name_.case_compare(OB_DIAG_TENANT_NAME) == 0) {
 | 
			
		||||
    tenant_name_ = user_name_;
 | 
			
		||||
    user_name_ = ObString::make_string("root");
 | 
			
		||||
    if (OB_FAIL(get_tenant_id(tenant_id))) {
 | 
			
		||||
      LOG_WARN("get_tenant_id failed", K(ret));
 | 
			
		||||
    conn.group_id_ = OBCG_DIAG_TENANT;
 | 
			
		||||
  }
 | 
			
		||||
  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 {
 | 
			
		||||
      conn.tenant_id_ = tenant_id;
 | 
			
		||||
      conn.resource_group_id_ = OB_DIAG_TENANT_ID;
 | 
			
		||||
      LOG_WARN("get_tenant_id failed", K(ret));
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
    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());
 | 
			
		||||
    conn.tenant_id_ = tenant_id;
 | 
			
		||||
    conn.resource_group_id_ = tenant_id;
 | 
			
		||||
    if (OBCG_DIAG_TENANT == conn.group_id_) {
 | 
			
		||||
      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 {
 | 
			
		||||
        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)) {
 | 
			
		||||
 | 
			
		||||
@ -643,12 +643,6 @@ int ObMultiTenant::create_virtual_tenants()
 | 
			
		||||
                         OB_RS_CPU))) {
 | 
			
		||||
    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(
 | 
			
		||||
                         OB_SVR_BLACKLIST_TENANT_ID,
 | 
			
		||||
                         OB_SVR_BLACKLIST_CPU,
 | 
			
		||||
@ -686,8 +680,6 @@ int ObMultiTenant::create_tenant_without_unit(const uint64_t tenant_id,
 | 
			
		||||
    mem_limit = INT64_MAX;
 | 
			
		||||
  } else if (OB_EXT_LOG_TENANT_ID == tenant_id) {
 | 
			
		||||
    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) {
 | 
			
		||||
    mem_limit = GCONF.rootservice_memory_limit;
 | 
			
		||||
  } else {
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
void ObThWorker::resume()
 | 
			
		||||
{
 | 
			
		||||
@ -257,7 +241,6 @@ inline void ObThWorker::process_request(rpc::ObRequest &req)
 | 
			
		||||
  bool need_wait_lock = false;
 | 
			
		||||
  int ret = OB_SUCCESS;
 | 
			
		||||
  reset_sql_throttle_current_priority();
 | 
			
		||||
  ObDiagTenantGuard diag_guard(*this, tenant_? tenant_->id(): OB_SYS_TENANT_ID);
 | 
			
		||||
  set_req_flag(&req);
 | 
			
		||||
 | 
			
		||||
  memtable::TLOCAL_NEED_WAIT_IN_LOCK_WAIT_MGR = false;
 | 
			
		||||
@ -313,6 +296,7 @@ inline void ObThWorker::process_request(rpc::ObRequest &req)
 | 
			
		||||
            pm_hold);
 | 
			
		||||
  }
 | 
			
		||||
  set_req_flag(NULL);
 | 
			
		||||
  reset_rpc_tenant();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ObThWorker::set_th_worker_thread_name(uint64_t tenant_id)
 | 
			
		||||
 | 
			
		||||
@ -14,4 +14,5 @@ CGID_DEF(OBCG_LOC_CACHE, 10)
 | 
			
		||||
CGID_DEF(OBCG_SQL_NIO, 11)
 | 
			
		||||
CGID_DEF(OBCG_MYSQL_LOGIN, 12)
 | 
			
		||||
CGID_DEF(OBCG_CDCSERVICE, 13)
 | 
			
		||||
CGID_DEF(OBCG_DIAG_TENANT, 14)
 | 
			
		||||
CGID_DEF(OBCG_LQ, 100)
 | 
			
		||||
 | 
			
		||||
@ -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()) {
 | 
			
		||||
    ret = OB_ERR_UNEXPECTED;
 | 
			
		||||
    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 服务
 | 
			
		||||
    //   // 否则有 bug:
 | 
			
		||||
    //   //
 | 
			
		||||
 | 
			
		||||
@ -223,7 +223,7 @@ int ObAdminServerExecutor::execute(int argc, char *argv[])
 | 
			
		||||
  } else {
 | 
			
		||||
    srv_proxy_.set_server(dst_server_);
 | 
			
		||||
    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);
 | 
			
		||||
    inited_ = true;
 | 
			
		||||
    COMMON_LOG(INFO, "process", K(cmd_.c_str()), K_(timeout), K(tenant_id));
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user