diff --git a/src/common/backend/lib/dllist.cpp b/src/common/backend/lib/dllist.cpp index 7f98f3e6b..c781ec648 100644 --- a/src/common/backend/lib/dllist.cpp +++ b/src/common/backend/lib/dllist.cpp @@ -288,3 +288,22 @@ bool DllistWithLock::IsEmpty() END_CRIT_SECTION(); return ret; } + +Dlelem* DllistWithLock::GetHead() +{ + Dlelem* head = NULL; + head = m_list.dll_head; + return head; +} + +void DllistWithLock::GetLock() +{ + START_CRIT_SECTION(); + SpinLockAcquire(&(m_lock)); +} + +void DllistWithLock::ReleaseLock() +{ + SpinLockRelease(&(m_lock)); + END_CRIT_SECTION(); +} diff --git a/src/common/backend/libpq/hba.cpp b/src/common/backend/libpq/hba.cpp index 1a6ecec0f..0937b068d 100644 --- a/src/common/backend/libpq/hba.cpp +++ b/src/common/backend/libpq/hba.cpp @@ -1384,20 +1384,12 @@ DIRECT_TRUST: */ bool IsLoopBackAddr(Port* port) { - struct sockaddr* remote_addr = (struct sockaddr*)&(port->raddr.addr); + const SockAddr remote_addr = port->raddr; char remote_ip[IP_LEN] = {0}; - char* result = NULL; - /* parse the remote ip address */ - if (AF_INET6 == remote_addr->sa_family) { - result = inet_net_ntop(AF_INET6, &((struct sockaddr_in*)remote_addr)->sin_addr, IPV6_MAXLEN, remote_ip, IP_LEN); - } else if (AF_INET == remote_addr->sa_family) { - result = inet_net_ntop(AF_INET, &((struct sockaddr_in*)remote_addr)->sin_addr, IPV4_MAXLEN, remote_ip, IP_LEN); - } + (void)pg_getnameinfo_all(&remote_addr.addr, remote_addr.salen, remote_ip, sizeof(remote_ip), NULL, 0, + NI_NUMERICHOST | NI_NUMERICSERV); - if (result == NULL) { - ereport(WARNING, (errmsg("inet_net_ntop remote failed, error: %d", EAFNOSUPPORT))); - } /* only the remote ip equal to 127.0.0.1 or ::1, return true */ if (strlen(remote_ip) != 0 && (strcmp(remote_ip, LOOP_IP_STRING) == 0 || strcmp(remote_ip, LOOP_IPV6_IP) == 0)) { return true; diff --git a/src/common/backend/utils/misc/guc.cpp b/src/common/backend/utils/misc/guc.cpp index d3c3835ac..26bd07611 100644 --- a/src/common/backend/utils/misc/guc.cpp +++ b/src/common/backend/utils/misc/guc.cpp @@ -9985,7 +9985,7 @@ static void InitializeGUCOptionsFromEnvironment(void) * the same. If we can identify the platform stack depth rlimit, increase * default stack depth setting up to whatever is safe (but at most 2MB). */ - stack_rlimit = DEFUALT_STACK_SIZE * 1024L; + stack_rlimit = get_stack_depth_rlimit(); if (stack_rlimit > 0) { long new_limit = (stack_rlimit - STACK_DEPTH_SLOP) / 1024L; diff --git a/src/gausskernel/optimizer/commands/indexcmds.cpp b/src/gausskernel/optimizer/commands/indexcmds.cpp index df823ceb7..e9919d894 100644 --- a/src/gausskernel/optimizer/commands/indexcmds.cpp +++ b/src/gausskernel/optimizer/commands/indexcmds.cpp @@ -3191,11 +3191,17 @@ static bool CheckSimpleAttrsConsistency(HeapTuple tarTuple, const int16* currAtt Form_pg_index indexTuple = (Form_pg_index)GETSTRUCT(tarTuple); int tarKeyNum = GetIndexKeyAttsByTuple(NULL, tarTuple); bool ret = true; + AttrNumber* indkeyValues = NULL; int i; if (tarKeyNum == currKeyNum) { - qsort(indexTuple->indkey.values, currKeyNum, sizeof(int16), AttrComparator); + size_t indkeyValuesSize = sizeof(AttrNumber) * currKeyNum; + indkeyValues = (AttrNumber*)palloc0(indkeyValuesSize); + errno_t rc = memcpy_s(indkeyValues, indkeyValuesSize, indexTuple->indkey.values, indkeyValuesSize); + securec_check(rc, "\0", "\0"); + + qsort(indkeyValues, currKeyNum, sizeof(AttrNumber), AttrComparator); for (i = 0; i < currKeyNum; i++) { - if (indexTuple->indkey.values[i] != currAttrsArray[i]) { + if (indkeyValues[i] != currAttrsArray[i]) { break; } } @@ -3203,6 +3209,7 @@ static bool CheckSimpleAttrsConsistency(HeapTuple tarTuple, const int16* currAtt ret = false; } } + pfree_ext(indkeyValues); return ret; } diff --git a/src/gausskernel/process/threadpool/threadpool_group.cpp b/src/gausskernel/process/threadpool/threadpool_group.cpp index 5df2f777c..0714a060a 100644 --- a/src/gausskernel/process/threadpool/threadpool_group.cpp +++ b/src/gausskernel/process/threadpool/threadpool_group.cpp @@ -352,15 +352,7 @@ bool ThreadPoolGroup::IsGroupHang() m_idleWorkerNum != 0) return false; - bool ishang = true; - AutoMutexLock alock(&m_mutex); - alock.lock(); - for (int i = 0; i < m_expectWorkerNum; i++) { - if (m_workers[i].stat.slotStatus != THREAD_SLOT_UNUSE) { - ishang = ishang && WORKER_MAY_HANG(m_workers[i].worker->m_waitState); - } - } - alock.unLock(); + bool ishang = m_listener->GetSessIshang(&m_current_time, &m_sessionId); return ishang; } diff --git a/src/gausskernel/process/threadpool/threadpool_listener.cpp b/src/gausskernel/process/threadpool/threadpool_listener.cpp index c36e0030c..53cb8fdfe 100644 --- a/src/gausskernel/process/threadpool/threadpool_listener.cpp +++ b/src/gausskernel/process/threadpool/threadpool_listener.cpp @@ -321,6 +321,8 @@ void ThreadPoolListener::DispatchSession(knl_session_context* session) break; } } else { + INSTR_TIME_SET_CURRENT(session->last_access_time); + /* Add new session to the head so the connection request can be quickly processed. */ if (session->status == KNL_SESS_UNINIT) { m_readySessionList->AddHead(&session->elem); @@ -344,3 +346,26 @@ void ThreadPoolListener::RemoveWorkerFromList(ThreadPoolWorker* worker) { m_freeWorkerList->Remove(&worker->m_elem); } + +bool ThreadPoolListener::GetSessIshang(instr_time* current_time, uint64* sessionId) +{ + bool ishang = true; + m_readySessionList->GetLock(); + + Dlelem* elem = m_readySessionList->GetHead(); + if (elem == NULL) { + m_readySessionList->ReleaseLock(); + return false; + } + knl_session_context* head_sess = (knl_session_context *)(elem->dle_val); + if (INSTR_TIME_GET_MICROSEC(head_sess->last_access_time) == INSTR_TIME_GET_MICROSEC(*current_time) && + head_sess->session_id == *sessionId) { + ishang = true; + } else { + *current_time = head_sess->last_access_time; + *sessionId = head_sess->session_id; + ishang = false; + } + m_readySessionList->ReleaseLock(); + return ishang; +} diff --git a/src/gausskernel/storage/buffer/bufmgr.cpp b/src/gausskernel/storage/buffer/bufmgr.cpp index 46155027a..c317fab89 100644 --- a/src/gausskernel/storage/buffer/bufmgr.cpp +++ b/src/gausskernel/storage/buffer/bufmgr.cpp @@ -2168,7 +2168,6 @@ static Buffer ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumb bufBlock = isLocalBuf ? LocalBufHdrGetBlock(bufHdr) : BufHdrGetBlock(bufHdr); - bool block_exist = true; bool needputtodirty = ReadBuffer_common_ReadBlock(smgr, relpersistence, forkNum, blockNum, mode, isExtend, bufBlock); if (needputtodirty) { diff --git a/src/gausskernel/storage/ipc/ipc.cpp b/src/gausskernel/storage/ipc/ipc.cpp index 57adbffed..9608d6482 100644 --- a/src/gausskernel/storage/ipc/ipc.cpp +++ b/src/gausskernel/storage/ipc/ipc.cpp @@ -633,12 +633,9 @@ void CloseClientSocket(knl_session_context* sess, bool closesock) * GUC configuration, it will leave socket open. So double check it here. */ pgsocket tmpsock = -1; - if (sess->proc_cxt.MyProcPort != NULL) { + if (sess->proc_cxt.MyProcPort != NULL && closesock) { /* if gs_sock is NULL, just clean gs_poll hash table. */ - MemoryContext oldcontext = - MemoryContextSwitchTo(SESS_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_COMMUNICATION)); pfree_ext(sess->proc_cxt.MyProcPort->msgLog); - MemoryContextSwitchTo(oldcontext); gs_close_gsocket(&(sess->proc_cxt.MyProcPort->gs_sock)); } if (t_thrd.postmaster_cxt.KeepSocketOpenForStream == false && (sess->proc_cxt.MyProcPort != NULL) && diff --git a/src/include/knl/knl_session.h b/src/include/knl/knl_session.h index b8e45baef..7632ed2d0 100644 --- a/src/include/knl/knl_session.h +++ b/src/include/knl/knl_session.h @@ -2369,6 +2369,8 @@ typedef struct knl_session_context { knl_u_gtt_context gtt_ctx; /* extension streaming */ knl_u_streaming_context streaming_cxt; + + instr_time last_access_time; } knl_session_context; enum stp_xact_err_type { diff --git a/src/include/lib/dllist.h b/src/include/lib/dllist.h index 133850cf6..985b3ff65 100644 --- a/src/include/lib/dllist.h +++ b/src/include/lib/dllist.h @@ -67,6 +67,9 @@ public: void AddTail(Dlelem* e); Dlelem* RemoveHead(); bool IsEmpty(); + Dlelem* GetHead(); + void GetLock(); + void ReleaseLock(); inline uint64 GetLength() { diff --git a/src/include/threadpool/threadpool_group.h b/src/include/threadpool/threadpool_group.h index 173e4127b..d5516b2f5 100644 --- a/src/include/threadpool/threadpool_group.h +++ b/src/include/threadpool/threadpool_group.h @@ -159,6 +159,9 @@ private: ThreadStreamSentry* m_streams; DllistWithLock* m_freeStreamList; + + instr_time m_current_time; + uint64 m_sessionId; }; #endif /* THREAD_POOL_GROUP_H */ diff --git a/src/include/threadpool/threadpool_listener.h b/src/include/threadpool/threadpool_listener.h index b199dec48..bc351568f 100644 --- a/src/include/threadpool/threadpool_listener.h +++ b/src/include/threadpool/threadpool_listener.h @@ -50,6 +50,7 @@ public: void SendShutDown(); void ReaperAllSession(); void ShutDown() const; + bool GetSessIshang(instr_time* current_time, uint64* sessionId); inline ThreadPoolGroup* GetGroup() {