!3591 thread pool worker线程退出时清理共享内存数组中的相关槽位

Merge pull request !3591 from CCA/master_fixbug
This commit is contained in:
opengauss_bot
2023-09-14 02:43:56 +00:00
committed by Gitee

View File

@ -3310,6 +3310,33 @@ void pgstat_couple_decouple_session(bool is_couple)
pgstat_increment_changecount_after(beentry);
}
static void clear_backend_entry(volatile PgBackendStatus* beentry)
{
/*
* Clear status entry, following the protocol of bumping st_changecount
* before and after. We use a volatile pointer here to ensure the
* compiler doesn't try to get cute.
*/
pgstat_increment_changecount_before(beentry);
beentry->st_procpid = 0; /* mark pid invalid */
beentry->st_sessionid = 0; /* mark sessionid invalid */
beentry->globalSessionId.sessionId = 0;
beentry->globalSessionId.nodeId = 0;
beentry->globalSessionId.seq = 0;
/*
* make sure st_changecount is an even before release it.
*
* In case some thread was interrupted by SIGTERM at any time with a mess st_changecount
* in PgBackendStatus, PgstatCollectorMain may hang-up in waiting its change to even and
* can not exit after receiving SIGTERM signal
*/
do {
pgstat_increment_changecount_after(beentry);
} while ((beentry->st_changecount & 1) != 0);
}
/*
* Shut down a single backend's statistics reporting at process exit.
*
@ -3336,29 +3363,18 @@ static void pgstat_beshutdown_hook(int code, Datum arg)
if (OidIsValid(u_sess->proc_cxt.MyDatabaseId))
pgstat_report_stat(true);
/*
* Clear my status entry, following the protocol of bumping st_changecount
* before and after. We use a volatile pointer here to ensure the
* compiler doesn't try to get cute.
*/
pgstat_increment_changecount_before(beentry);
beentry->st_procpid = 0; /* mark pid invalid */
beentry->st_sessionid = 0; /* mark sessionid invalid */
beentry->globalSessionId.sessionId = 0;
beentry->globalSessionId.nodeId = 0;
beentry->globalSessionId.seq = 0;
/* Clear my status entry */
clear_backend_entry(beentry);
/*
* make sure st_changecount is an even before release it.
*
* In case some thread was interrupted by SIGTERM at any time with a mess st_changecount
* in PgBackendStatus, PgstatCollectorMain may hang-up in waiting its change to even and
* can not exit after receiving SIGTERM signal
* Thread pool worker also needs to clear
* t_thrd.shemem_ptr_cxt.BackendStatusArray[t_thrd.proc_cxt.MyBackendId - 1]
*/
do {
pgstat_increment_changecount_after(beentry);
} while ((beentry->st_changecount & 1) != 0);
if (IS_THREAD_POOL_WORKER && t_thrd.proc_cxt.MyBackendId != InvalidBackendId &&
beentry != &t_thrd.shemem_ptr_cxt.BackendStatusArray[t_thrd.proc_cxt.MyBackendId - 1]) {
clear_backend_entry(&t_thrd.shemem_ptr_cxt.BackendStatusArray[t_thrd.proc_cxt.MyBackendId - 1]);
WaitUntilLWLockInfoNeverAccess(&t_thrd.shemem_ptr_cxt.BackendStatusArray[t_thrd.proc_cxt.MyBackendId - 1]);
}
/*
* handle below cases:
@ -8264,6 +8280,12 @@ static void endMySessionTimeEntry(int code, Datum arg)
{
DetachMySessionTimeEntry(t_thrd.shemem_ptr_cxt.mySessionTimeEntry);
if (IS_THREAD_POOL_WORKER && t_thrd.proc_cxt.MyBackendId != InvalidBackendId &&
t_thrd.shemem_ptr_cxt.mySessionTimeEntry !=
&t_thrd.shemem_ptr_cxt.sessionTimeArray[t_thrd.proc_cxt.MyBackendId - 1]) {
DetachMySessionTimeEntry(&t_thrd.shemem_ptr_cxt.sessionTimeArray[t_thrd.proc_cxt.MyBackendId - 1]);
}
/* don't bother this entry any more. */
t_thrd.shemem_ptr_cxt.mySessionTimeEntry = NULL;
}
@ -8498,6 +8520,12 @@ static void endMySessionStatEntry(int code, Datum arg)
/* mark my entry not active. */
t_thrd.shemem_ptr_cxt.mySessionStatEntry->isValid = false;
if (IS_THREAD_POOL_WORKER && t_thrd.proc_cxt.MyBackendId != InvalidBackendId &&
t_thrd.shemem_ptr_cxt.mySessionStatEntry !=
&t_thrd.shemem_ptr_cxt.sessionStatArray[t_thrd.proc_cxt.MyBackendId - 1]) {
t_thrd.shemem_ptr_cxt.sessionStatArray[t_thrd.proc_cxt.MyBackendId - 1].isValid = false;
}
/* don't bother this entry any more. */
t_thrd.shemem_ptr_cxt.mySessionStatEntry = NULL;
}
@ -8733,6 +8761,12 @@ static void endMySessionMemoryEntry(int code, Datum arg)
/* mark my entry not active. */
t_thrd.shemem_ptr_cxt.mySessionMemoryEntry->isValid = false;
if (IS_THREAD_POOL_WORKER && t_thrd.proc_cxt.MyBackendId != InvalidBackendId &&
t_thrd.shemem_ptr_cxt.mySessionMemoryEntry !=
&t_thrd.shemem_ptr_cxt.sessionMemoryArray[t_thrd.proc_cxt.MyBackendId - 1]) {
t_thrd.shemem_ptr_cxt.sessionMemoryArray[t_thrd.proc_cxt.MyBackendId - 1].isValid = false;
}
/* don't bother this entry any more. */
t_thrd.shemem_ptr_cxt.mySessionMemoryEntry = NULL;
}