From f17fd3d31bc8de34bff0cee67afe03c22948dda3 Mon Sep 17 00:00:00 2001 From: yanghao Date: Wed, 26 May 2021 14:36:07 +0800 Subject: [PATCH] optimizer for signal block in threadpool --- src/gausskernel/process/stream/streamMain.cpp | 1 + src/gausskernel/process/tcop/postgres.cpp | 10 ++++++++++ src/gausskernel/process/threadpool/knl_thread.cpp | 1 + .../process/threadpool/threadpool_worker.cpp | 8 ++++---- src/gausskernel/storage/ipc/procsignal.cpp | 3 +++ src/include/knl/knl_thread.h | 1 + 6 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/gausskernel/process/stream/streamMain.cpp b/src/gausskernel/process/stream/streamMain.cpp index 400701f5e..ae26c8397 100644 --- a/src/gausskernel/process/stream/streamMain.cpp +++ b/src/gausskernel/process/stream/streamMain.cpp @@ -86,6 +86,7 @@ int StreamMain() int curTryCounter; int* oldTryCounter = NULL; if (sigsetjmp(local_sigjmp_buf, 1) != 0) { + t_thrd.int_cxt.ignoreBackendSignal = false; /* reset STP thread local valueables */ stp_reset_opt_values(); diff --git a/src/gausskernel/process/tcop/postgres.cpp b/src/gausskernel/process/tcop/postgres.cpp index 568a1c2c4..2b96639d4 100644 --- a/src/gausskernel/process/tcop/postgres.cpp +++ b/src/gausskernel/process/tcop/postgres.cpp @@ -5421,6 +5421,9 @@ static void drop_unnamed_stmt(void) */ void quickdie(SIGNAL_ARGS) { + if (t_thrd.int_cxt.ignoreBackendSignal) { + return; + } sigaddset(&t_thrd.libpq_cxt.BlockSig, SIGQUIT); /* prevent nested calls */ gs_signal_setmask(&t_thrd.libpq_cxt.BlockSig, NULL); @@ -5474,6 +5477,9 @@ void quickdie(SIGNAL_ARGS) */ void die(SIGNAL_ARGS) { + if (t_thrd.int_cxt.ignoreBackendSignal) { + return; + } int save_errno = errno; /* Don't joggle the elbow of proc_exit */ @@ -5523,6 +5529,9 @@ void die(SIGNAL_ARGS) */ void StatementCancelHandler(SIGNAL_ARGS) { + if (t_thrd.int_cxt.ignoreBackendSignal) { + return; + } int save_errno = errno; /* @@ -7273,6 +7282,7 @@ int PostgresMain(int argc, char* argv[], const char* dbname, const char* usernam int curTryCounter; int* oldTryCounter = NULL; if (sigsetjmp(local_sigjmp_buf, 1) != 0) { + t_thrd.int_cxt.ignoreBackendSignal = false; gstrace_tryblock_exit(true, oldTryCounter); Assert(t_thrd.proc->dw_pos == -1); diff --git a/src/gausskernel/process/threadpool/knl_thread.cpp b/src/gausskernel/process/threadpool/knl_thread.cpp index 21e3eade1..3405d333d 100644 --- a/src/gausskernel/process/threadpool/knl_thread.cpp +++ b/src/gausskernel/process/threadpool/knl_thread.cpp @@ -534,6 +534,7 @@ static void knl_t_interrupt_init(knl_t_interrupt_context* int_cxt) int_cxt->CritSectionCount = 0; int_cxt->InterruptByCN = false; int_cxt->InterruptCountResetFlag = false; + int_cxt->ignoreBackendSignal = false; } static void knl_t_proc_init(knl_t_proc_context* proc_cxt) diff --git a/src/gausskernel/process/threadpool/threadpool_worker.cpp b/src/gausskernel/process/threadpool/threadpool_worker.cpp index 4dd620791..83e15316a 100644 --- a/src/gausskernel/process/threadpool/threadpool_worker.cpp +++ b/src/gausskernel/process/threadpool/threadpool_worker.cpp @@ -144,8 +144,8 @@ int ThreadPoolWorker::StartUp() void PreventSignal() { - gs_signal_block_sigusr2(); - gs_signal_setmask(&t_thrd.libpq_cxt.BlockSig, NULL); + HOLD_INTERRUPTS(); + t_thrd.int_cxt.ignoreBackendSignal = true; t_thrd.int_cxt.QueryCancelPending = false; disable_sig_alarm(true); } @@ -153,8 +153,8 @@ void PreventSignal() void AllowSignal() { /* now we can accept signal. out of this, we rely on signal handle. */ - gs_signal_unblock_sigusr2(); - gs_signal_setmask(&t_thrd.libpq_cxt.UnBlockSig, NULL); + t_thrd.int_cxt.ignoreBackendSignal = false; + RESUME_INTERRUPTS(); } void ThreadPoolWorker::WaitMission() diff --git a/src/gausskernel/storage/ipc/procsignal.cpp b/src/gausskernel/storage/ipc/procsignal.cpp index 03107906d..0d4bf4edd 100644 --- a/src/gausskernel/storage/ipc/procsignal.cpp +++ b/src/gausskernel/storage/ipc/procsignal.cpp @@ -262,6 +262,9 @@ bool CheckProcSignal(ProcSignalReason reason) */ void procsignal_sigusr1_handler(SIGNAL_ARGS) { + if (t_thrd.int_cxt.ignoreBackendSignal) { + return; + } int save_errno = errno; t_thrd.int_cxt.InterruptByCN = true; diff --git a/src/include/knl/knl_thread.h b/src/include/knl/knl_thread.h index cb32d370f..e17cf2ba3 100644 --- a/src/include/knl/knl_thread.h +++ b/src/include/knl/knl_thread.h @@ -1281,6 +1281,7 @@ typedef struct knl_t_interrupt_context { volatile bool InterruptCountResetFlag; + volatile bool ignoreBackendSignal; } knl_t_interrupt_context; typedef int64 pg_time_t;