fix alloc local session with same sid leads memory damage
This commit is contained in:
@ -282,11 +282,11 @@ int ObSQLSessionMgr::inc_session_ref(const ObSQLSessionInfo* my_session)
|
||||
// |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.
|
||||
// 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 tmp_ret = OB_SUCCESS;
|
||||
@ -297,6 +297,9 @@ int ObSQLSessionMgr::create_sessid(uint32_t& sessid)
|
||||
if (server_id > MAX_SERVER_ID) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
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) {
|
||||
local_seq = (ATOMIC_FAA(&abnormal_seq, 1) & 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*/
|
||||
}
|
||||
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_SUCC(ret) && in_mgr) {
|
||||
sessid = local_seq | SERVER_SESSID_TAG; // set observer sessid mark
|
||||
sessid |= static_cast<uint32_t>(server_id << LOCAL_SEQ_LEN); // set observer
|
||||
// high bit is reserved for server id
|
||||
|
||||
Reference in New Issue
Block a user