From 11c41c967b27bb40a04eea0c8177627ae86de4e2 Mon Sep 17 00:00:00 2001 From: lukeman Date: Fri, 10 May 2024 15:41:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86issue=EF=BC=9AThreadPoolListe?= =?UTF-8?q?ner=20readySession=E6=B3=84=E9=9C=B2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../process/threadpool/threadpool_listener.cpp | 15 ++++++++++++--- src/include/threadpool/threadpool_listener.h | 1 + 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/gausskernel/process/threadpool/threadpool_listener.cpp b/src/gausskernel/process/threadpool/threadpool_listener.cpp index eff445d47..09a21aa49 100644 --- a/src/gausskernel/process/threadpool/threadpool_listener.cpp +++ b/src/gausskernel/process/threadpool/threadpool_listener.cpp @@ -533,17 +533,26 @@ void ThreadPoolListener::WakeupForHang() { gs_signal_send(m_tid, SIGUSR2); } +Dlelem* ThreadPoolListener::TryRemoveReadySessListHead() +{ + Dlelem *elem = NULL; + if (m_group->m_idleWorkerNum > 0) { + elem = m_readySessionList->RemoveHead(); + } + return elem; +} + void ThreadPoolListener::WakeupReadySessionList() { - Dlelem *elem = m_readySessionList->RemoveHead(); + Dlelem *elem = TryRemoveReadySessListHead(); knl_session_context *sess = NULL; // last time WakeupReadySession() is not finished, but m_isHang is set again - while (elem != NULL && m_group->m_idleWorkerNum > 0) { + while (elem != NULL) { sess = (knl_session_context *)DLE_VAL(elem); ereport(DEBUG2, (errmodule(MOD_THREAD_POOL), errmsg("WakeupReadySessionList remove a session:%lu from m_readySessionList", sess->session_id))); DispatchSession(sess); - elem = m_readySessionList->RemoveHead(); + elem = TryRemoveReadySessListHead(); } // m_isHang maybe set true when we do checkGroupHang again before it, now we will miss one time. // But if group is actually hang, m_isHang will be set true again. diff --git a/src/include/threadpool/threadpool_listener.h b/src/include/threadpool/threadpool_listener.h index cc8ad0676..fbacaae43 100644 --- a/src/include/threadpool/threadpool_listener.h +++ b/src/include/threadpool/threadpool_listener.h @@ -78,6 +78,7 @@ private: Dlelem *GetSessFromReadySessionList(ThreadPoolWorker *worker); void AddIdleSessionToTail(knl_session_context* session); void AddIdleSessionToHead(knl_session_context* session); + Dlelem *TryRemoveReadySessListHead(); private: ThreadId m_tid;