forked from huawei/openGauss-server
!1051 修复数据库shutdown时出现的死锁问题
Merge pull request !1051 from ashnah/my1.1.0
This commit is contained in:
commit
4b77ee957a
|
|
@ -80,28 +80,41 @@ void statement_init_metric_context()
|
|||
statement_commit_metirc_context();
|
||||
}
|
||||
|
||||
HOLD_INTERRUPTS();
|
||||
(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);
|
||||
RESUME_INTERRUPTS();
|
||||
PG_RE_THROW();
|
||||
}
|
||||
PG_END_TRY();
|
||||
(void)syscalllockRelease(&u_sess->statement_cxt.list_protect);
|
||||
|
||||
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)));
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue