fix alloc local session with same sid leads memory damage
This commit is contained in:
		@ -109,10 +109,13 @@ int ObDesExecContext::create_my_session(uint64_t tenant_id)
 | 
				
			|||||||
        LOG_ERROR("no more memory to create sql session info");
 | 
					        LOG_ERROR("no more memory to create sql session info");
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        local_session = new (local_session) ObSQLSessionInfo();
 | 
					        local_session = new (local_session) ObSQLSessionInfo();
 | 
				
			||||||
        uint32_t tmp_sid = 123456789;
 | 
					        uint32_t tmp_sid = 0;
 | 
				
			||||||
 | 
					        uint64_t tmp_proxy_sessid = proxy_sid;
 | 
				
			||||||
        uint32_t tmp_version = 0;
 | 
					        uint32_t tmp_version = 0;
 | 
				
			||||||
        uint64_t tmp_proxy_sessid = 1234567890;
 | 
					        bool session_in_mgr = false;
 | 
				
			||||||
        if (OB_FAIL(local_session->init(tmp_version, tmp_sid, tmp_proxy_sessid, NULL))) {
 | 
					        if (OB_FAIL(GCTX.session_mgr_->create_sessid(tmp_sid, session_in_mgr))) {
 | 
				
			||||||
 | 
					          LOG_WARN("failed to mock session id", K(ret));
 | 
				
			||||||
 | 
					        } else if (OB_FAIL(local_session->init(tmp_version, tmp_sid, tmp_proxy_sessid, NULL))) {
 | 
				
			||||||
          LOG_WARN("my session init failed", K(ret));
 | 
					          LOG_WARN("my session init failed", K(ret));
 | 
				
			||||||
          local_session->~ObSQLSessionInfo();
 | 
					          local_session->~ObSQLSessionInfo();
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
 | 
				
			|||||||
@ -282,11 +282,11 @@ int ObSQLSessionMgr::inc_session_ref(const ObSQLSessionInfo* my_session)
 | 
				
			|||||||
// |Mask|          Server Id           |           Local Seq            |
 | 
					// |Mask|          Server Id           |           Local Seq            |
 | 
				
			||||||
// +----+------------------------------+--------------------------------+
 | 
					// +----+------------------------------+--------------------------------+
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// MASK: 1 means session_id is generated by observer, 0 means by proxy.
 | 
					// MASK: 1 means session_id is generated by observer, 0 means in_mgr = false.
 | 
				
			||||||
// Server Id: generated by root server, and unique in cluster.
 | 
					// Server Id: generated by root server, and unique in cluster.
 | 
				
			||||||
// Local Seq: max session number in an observer.
 | 
					// Local Seq: max session number in an observer.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
int ObSQLSessionMgr::create_sessid(uint32_t& sessid)
 | 
					int ObSQLSessionMgr::create_sessid(uint32_t &sessid, bool in_mgr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  int tmp_ret = OB_SUCCESS;
 | 
					  int tmp_ret = OB_SUCCESS;
 | 
				
			||||||
@ -297,6 +297,9 @@ int ObSQLSessionMgr::create_sessid(uint32_t& sessid)
 | 
				
			|||||||
  if (server_id > MAX_SERVER_ID) {
 | 
					  if (server_id > MAX_SERVER_ID) {
 | 
				
			||||||
    ret = OB_ERR_UNEXPECTED;
 | 
					    ret = OB_ERR_UNEXPECTED;
 | 
				
			||||||
    LOG_ERROR("server id maybe invalid", K(ret), K(server_id));
 | 
					    LOG_ERROR("server id maybe invalid", K(ret), K(server_id));
 | 
				
			||||||
 | 
					  } else if (!in_mgr) {
 | 
				
			||||||
 | 
					    sessid = (GETTID() | LOCAL_SESSID_TAG);
 | 
				
			||||||
 | 
					    sessid |= static_cast<uint32_t>(server_id << LOCAL_SEQ_LEN);  // set observer
 | 
				
			||||||
  } else if (0 == server_id) {
 | 
					  } else if (0 == server_id) {
 | 
				
			||||||
    local_seq = (ATOMIC_FAA(&abnormal_seq, 1) & MAX_LOCAL_SEQ);
 | 
					    local_seq = (ATOMIC_FAA(&abnormal_seq, 1) & MAX_LOCAL_SEQ);
 | 
				
			||||||
    uint32_t max_local_seq = MAX_LOCAL_SEQ;
 | 
					    uint32_t max_local_seq = MAX_LOCAL_SEQ;
 | 
				
			||||||
@ -307,7 +310,7 @@ int ObSQLSessionMgr::create_sessid(uint32_t& sessid)
 | 
				
			|||||||
  } else { /*do nothing*/
 | 
					  } else { /*do nothing*/
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (OB_SUCC(ret)) {
 | 
					  if (OB_SUCC(ret) && in_mgr) {
 | 
				
			||||||
    sessid = local_seq | SERVER_SESSID_TAG;                       // set observer sessid mark
 | 
					    sessid = local_seq | SERVER_SESSID_TAG;                       // set observer sessid mark
 | 
				
			||||||
    sessid |= static_cast<uint32_t>(server_id << LOCAL_SEQ_LEN);  // set observer
 | 
					    sessid |= static_cast<uint32_t>(server_id << LOCAL_SEQ_LEN);  // set observer
 | 
				
			||||||
    // high bit is reserved for server id
 | 
					    // high bit is reserved for server id
 | 
				
			||||||
 | 
				
			|||||||
@ -47,6 +47,7 @@ public:
 | 
				
			|||||||
  static const uint32_t NON_DURABLE_VALUE = 0;
 | 
					  static const uint32_t NON_DURABLE_VALUE = 0;
 | 
				
			||||||
  static const uint32_t MAX_VERSION = UINT8_MAX;  // 255
 | 
					  static const uint32_t MAX_VERSION = UINT8_MAX;  // 255
 | 
				
			||||||
  static const uint32_t SERVER_SESSID_TAG = 1ULL << 31;
 | 
					  static const uint32_t SERVER_SESSID_TAG = 1ULL << 31;
 | 
				
			||||||
 | 
					  static const uint32_t LOCAL_SESSID_TAG = 0;  // used for sessions overflow
 | 
				
			||||||
  typedef SessionInfoKey Key;
 | 
					  typedef SessionInfoKey Key;
 | 
				
			||||||
  explicit ObSQLSessionMgr(storage::ObPartitionService* partition_service)
 | 
					  explicit ObSQLSessionMgr(storage::ObPartitionService* partition_service)
 | 
				
			||||||
      :  // null_callback_(),
 | 
					      :  // null_callback_(),
 | 
				
			||||||
@ -121,11 +122,11 @@ public:
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
  static int is_need_clear_sessid(const observer::ObSMConnection* conn, bool& is_need);
 | 
					  static int is_need_clear_sessid(const observer::ObSMConnection* conn, bool& is_need);
 | 
				
			||||||
  int fetch_first_sessid();
 | 
					  int fetch_first_sessid();
 | 
				
			||||||
  int create_sessid(uint32_t& sessid);
 | 
					  //  in_mgr = false means fail back to local session allocating, avoid remote/distribute executing fail
 | 
				
			||||||
 | 
					  int create_sessid(uint32_t& sessid, bool in_mgr = true);
 | 
				
			||||||
  int mark_sessid_used(uint32_t sess_id);
 | 
					  int mark_sessid_used(uint32_t sess_id);
 | 
				
			||||||
  int mark_sessid_unused(uint32_t sess_id);
 | 
					  int mark_sessid_unused(uint32_t sess_id);
 | 
				
			||||||
  // inline ObNullEndTransCallback &get_null_callback() { return null_callback_; }
 | 
					  // inline ObNullEndTransCallback &get_null_callback() { return null_callback_; }
 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
  int create_session_by_version(
 | 
					  int create_session_by_version(
 | 
				
			||||||
      uint64_t tenant_id, uint32_t sessid, uint64_t proxy_sessid, ObSQLSessionInfo*& sess_info, uint32_t& out_version);
 | 
					      uint64_t tenant_id, uint32_t sessid, uint64_t proxy_sessid, ObSQLSessionInfo*& sess_info, uint32_t& out_version);
 | 
				
			||||||
  int get_avaiable_local_seq(uint32_t& local_seq);
 | 
					  int get_avaiable_local_seq(uint32_t& local_seq);
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user