From 383af73b89ad16ad8dfc9d9908e4ca048e4abed9 Mon Sep 17 00:00:00 2001 From: ashnah Date: Fri, 25 Jun 2021 11:18:30 +0800 Subject: [PATCH 1/4] Fix the problem of deadlock when shutting down --- .../statement/instr_handle_mgr.cpp | 46 ++++++++++++------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp b/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp index 5716a85a..fabf2673 100644 --- a/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp +++ b/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp @@ -80,28 +80,40 @@ void statement_init_metric_context() statement_commit_metirc_context(); } + gs_signal_setmask(&t_thrd.libpq_cxt.BlockSig, NULL); (void)syscalllockAcquire(&u_sess->statement_cxt.list_protect); + PG_TRY(); + { - /* 1, check free list: free detail stat; reuse entry in free list */ - if (u_sess->statement_cxt.free_count > 0) { - reusedHandle = (StatementStatContext*)u_sess->statement_cxt.toFreeStatementList; - u_sess->statement_cxt.curStatementMetrics = reusedHandle; - u_sess->statement_cxt.toFreeStatementList = reusedHandle->next; - u_sess->statement_cxt.free_count--; - } else { - /* 2, no free slot int free list, allocate new one */ - if (u_sess->statement_cxt.allocatedCxtCnt < u_sess->attr.attr_common.track_stmt_session_slot) { - MemoryContext oldcontext = MemoryContextSwitchTo(u_sess->statement_cxt.stmt_stat_cxt); + /* 1, check free list: free detail stat; reuse entry in free list */ + if (u_sess->statement_cxt.free_count > 0) { + reusedHandle = (StatementStatContext*)u_sess->statement_cxt.toFreeStatementList; + u_sess->statement_cxt.curStatementMetrics = reusedHandle; + u_sess->statement_cxt.toFreeStatementList = reusedHandle->next; + u_sess->statement_cxt.free_count--; + } else { + /* 2, no free slot int free list, allocate new one */ + if (u_sess->statement_cxt.allocatedCxtCnt < u_sess->attr.attr_common.track_stmt_session_slot) { + MemoryContext oldcontext = MemoryContextSwitchTo(u_sess->statement_cxt.stmt_stat_cxt); - u_sess->statement_cxt.curStatementMetrics = palloc0_noexcept(sizeof(StatementStatContext)); - if (u_sess->statement_cxt.curStatementMetrics != NULL) { - u_sess->statement_cxt.allocatedCxtCnt++; - } - (void)MemoryContextSwitchTo(oldcontext); - } - } + u_sess->statement_cxt.curStatementMetrics = palloc0_noexcept(sizeof(StatementStatContext)); + if (u_sess->statement_cxt.curStatementMetrics != NULL) { + u_sess->statement_cxt.allocatedCxtCnt++; + } + (void)MemoryContextSwitchTo(oldcontext); + } + } + } + PG_CATCH(); + { + (void)syscalllockRelease(&u_sess->statement_cxt.list_protect); + PG_RE_THROW(); + } + PG_END_TRY(); (void)syscalllockRelease(&u_sess->statement_cxt.list_protect); + gs_signal_setmask(&t_thrd.libpq_cxt.UnBlockSig, NULL); + ereport(DEBUG1, (errmodule(MOD_INSTR), errmsg("[Statement] init - free list length: %d, suspend list length: %d", u_sess->statement_cxt.free_count, u_sess->statement_cxt.suspend_count))); From 65a26243851b4b169461ef3a75152e01313d5da5 Mon Sep 17 00:00:00 2001 From: ashnah Date: Fri, 25 Jun 2021 17:31:38 +0800 Subject: [PATCH 2/4] use holdinterrupt instead of block signal --- .../cbb/instruments/statement/instr_handle_mgr.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp b/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp index fabf2673..23132161 100644 --- a/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp +++ b/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp @@ -80,7 +80,7 @@ void statement_init_metric_context() statement_commit_metirc_context(); } - gs_signal_setmask(&t_thrd.libpq_cxt.BlockSig, NULL); + HOLD_INTERRUPTS(); (void)syscalllockAcquire(&u_sess->statement_cxt.list_protect); PG_TRY(); { @@ -112,7 +112,7 @@ void statement_init_metric_context() PG_END_TRY(); (void)syscalllockRelease(&u_sess->statement_cxt.list_protect); - gs_signal_setmask(&t_thrd.libpq_cxt.UnBlockSig, NULL); + RESUME_INTERRUPTS()(); ereport(DEBUG1, (errmodule(MOD_INSTR), errmsg("[Statement] init - free list length: %d, suspend list length: %d", u_sess->statement_cxt.free_count, u_sess->statement_cxt.suspend_count))); From ae3ee01cf32607de23ea7027e3e2b47c2bafe43c Mon Sep 17 00:00:00 2001 From: ashnah Date: Fri, 25 Jun 2021 17:45:56 +0800 Subject: [PATCH 3/4] modify build error --- src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp b/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp index 23132161..33bbfdfb 100644 --- a/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp +++ b/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp @@ -112,7 +112,7 @@ void statement_init_metric_context() PG_END_TRY(); (void)syscalllockRelease(&u_sess->statement_cxt.list_protect); - RESUME_INTERRUPTS()(); + RESUME_INTERRUPTS(); ereport(DEBUG1, (errmodule(MOD_INSTR), errmsg("[Statement] init - free list length: %d, suspend list length: %d", u_sess->statement_cxt.free_count, u_sess->statement_cxt.suspend_count))); From b9c9a2684a6ecdb30a7278b26d9d3e9ac94b720f Mon Sep 17 00:00:00 2001 From: ashnah Date: Mon, 28 Jun 2021 09:09:27 +0800 Subject: [PATCH 4/4] add RESUME_INTERRUPTS before throw --- src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp b/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp index 33bbfdfb..1e465375 100644 --- a/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp +++ b/src/gausskernel/cbb/instruments/statement/instr_handle_mgr.cpp @@ -107,6 +107,7 @@ void statement_init_metric_context() PG_CATCH(); { (void)syscalllockRelease(&u_sess->statement_cxt.list_protect); + RESUME_INTERRUPTS(); PG_RE_THROW(); } PG_END_TRY();