fix deadlock
This commit is contained in:
@ -645,9 +645,11 @@ static void bgworker_quickdie(SIGNAL_ARGS)
|
||||
static void bgworker_die(SIGNAL_ARGS)
|
||||
{
|
||||
(void)gs_signal_setmask(&t_thrd.libpq_cxt.BlockSig, NULL);
|
||||
|
||||
t_thrd.bgworker_cxt.worker_shutdown_requested = true;
|
||||
t_thrd.postgres_cxt.whereToSendOutput = DestNone;
|
||||
ereport(FATAL,
|
||||
if (t_thrd.proc)
|
||||
SetLatch(&t_thrd.proc->procLatch);
|
||||
ereport(WARNING,
|
||||
(errcode(ERRCODE_ADMIN_SHUTDOWN),
|
||||
errmsg("terminating background worker \"%s\" due to administrator command",
|
||||
t_thrd.bgworker_cxt.my_bgworker_entry->bgw_type)));
|
||||
@ -709,7 +711,7 @@ void StartBackgroundWorker(void* bgWorkerSlotShmAddr)
|
||||
}
|
||||
|
||||
t_thrd.bgworker_cxt.is_background_worker = true;
|
||||
|
||||
t_thrd.bgworker_cxt.worker_shutdown_requested = false;
|
||||
/* Identify myself via ps */
|
||||
init_ps_display(worker->bgw_name, "", "", "");
|
||||
|
||||
|
@ -10483,6 +10483,7 @@ int GaussDbThreadMain(knl_thread_arg* arg)
|
||||
|
||||
case BACKGROUND_WORKER: {
|
||||
t_thrd.bgworker_cxt.is_background_worker = true;
|
||||
t_thrd.bgworker_cxt.worker_shutdown_requested = false;
|
||||
InitProcessAndShareMemory();
|
||||
StartBackgroundWorker(arg->payload);
|
||||
proc_exit(0);
|
||||
|
@ -742,7 +742,7 @@ void autonomous_worker_main(Datum main_arg)
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (msgtype != 'X');
|
||||
while ((msgtype != 'X') && !(t_thrd.bgworker_cxt.worker_shutdown_requested));
|
||||
}
|
||||
|
||||
static void shm_mq_receive_stringinfo(shm_mq_handle *qh, StringInfoData *msg)
|
||||
|
@ -1421,6 +1421,7 @@ void knl_t_bgworker_init(knl_t_bgworker_context* bgworker_cxt)
|
||||
bgworker_cxt->background_worker_data = NULL;
|
||||
bgworker_cxt->my_bgworker_entry = NULL;
|
||||
bgworker_cxt->is_background_worker = false;
|
||||
bgworker_cxt->worker_shutdown_requested = false;
|
||||
bgworker_cxt->background_worker_list = SLIST_STATIC_INIT(background_worker_list);
|
||||
bgworker_cxt->ParallelMessagePending = false;
|
||||
bgworker_cxt->InitializingParallelWorker = false;
|
||||
|
@ -1017,6 +1017,8 @@ static shm_mq_result shm_mq_receive_bytes(shm_mq_handle *mqh, Size bytes_needed,
|
||||
|
||||
/* An interrupt may have occurred while we were waiting. */
|
||||
CHECK_FOR_INTERRUPTS();
|
||||
if (t_thrd.bgworker_cxt.worker_shutdown_requested)
|
||||
return SHM_MQ_DETACHED;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2747,6 +2747,7 @@ typedef struct knl_t_bgworker_context {
|
||||
BackgroundWorkerArray *background_worker_data;
|
||||
BackgroundWorker *my_bgworker_entry;
|
||||
bool is_background_worker;
|
||||
bool worker_shutdown_requested;
|
||||
/*
|
||||
* The postmaster's list of registered background workers, in private memory.
|
||||
*/
|
||||
|
@ -93,6 +93,46 @@ select * from at_tb2;
|
||||
4 | klk
|
||||
(4 rows)
|
||||
|
||||
truncate table at_tb2;
|
||||
create or replace procedure at_test5(i int)
|
||||
AS
|
||||
DECLARE
|
||||
PRAGMA AUTONOMOUS_TRANSACTION;
|
||||
BEGIN
|
||||
insert into at_tb2 values(3, 'klk');
|
||||
commit;
|
||||
end;
|
||||
/
|
||||
select at_test5(6);
|
||||
ERROR: there is no transaction in progress
|
||||
CONTEXT: PL/pgSQL function at_test5(integer) line 6 at COMMIT
|
||||
referenced column: at_test5
|
||||
select * from at_tb2;
|
||||
id | val
|
||||
----+-----
|
||||
3 | klk
|
||||
(1 row)
|
||||
|
||||
truncate table at_tb2;
|
||||
create or replace procedure at_test6(i int)
|
||||
AS
|
||||
DECLARE
|
||||
PRAGMA AUTONOMOUS_TRANSACTION;
|
||||
BEGIN
|
||||
insert into at_tb2 values(3, 'klk');
|
||||
rollback;
|
||||
end;
|
||||
/
|
||||
select at_test6(6);
|
||||
ERROR: there is no transaction in progress
|
||||
CONTEXT: PL/pgSQL function at_test6(integer) line 6 at ROLLBACK
|
||||
referenced column: at_test6
|
||||
select * from at_tb2;
|
||||
id | val
|
||||
----+-----
|
||||
3 | klk
|
||||
(1 row)
|
||||
|
||||
truncate table at_tb2;
|
||||
DECLARE
|
||||
begin
|
||||
|
@ -53,6 +53,32 @@ end;
|
||||
select at_test4(6);
|
||||
select * from at_tb2;
|
||||
|
||||
truncate table at_tb2;
|
||||
create or replace procedure at_test5(i int)
|
||||
AS
|
||||
DECLARE
|
||||
PRAGMA AUTONOMOUS_TRANSACTION;
|
||||
BEGIN
|
||||
insert into at_tb2 values(3, 'klk');
|
||||
commit;
|
||||
end;
|
||||
/
|
||||
select at_test5(6);
|
||||
select * from at_tb2;
|
||||
|
||||
truncate table at_tb2;
|
||||
create or replace procedure at_test6(i int)
|
||||
AS
|
||||
DECLARE
|
||||
PRAGMA AUTONOMOUS_TRANSACTION;
|
||||
BEGIN
|
||||
insert into at_tb2 values(3, 'klk');
|
||||
rollback;
|
||||
end;
|
||||
/
|
||||
select at_test6(6);
|
||||
select * from at_tb2;
|
||||
|
||||
truncate table at_tb2;
|
||||
DECLARE
|
||||
begin
|
||||
|
Reference in New Issue
Block a user