!5318 处理issue:ThreadPoolListener readySession泄露问题

Merge pull request !5318 from lukeman/core_issue
This commit is contained in:
opengauss_bot
2024-08-06 08:39:43 +00:00
committed by Gitee
2 changed files with 13 additions and 3 deletions

View File

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

View File

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