fix alloc local session with same sid leads memory damage

This commit is contained in:
ls0
2022-04-06 10:55:46 +08:00
committed by LINxiansheng
parent 21163c4fdb
commit 518fd3552f
3 changed files with 15 additions and 8 deletions

View File

@ -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