fix deadlock
This commit is contained in:
@ -645,9 +645,11 @@ static void bgworker_quickdie(SIGNAL_ARGS)
|
|||||||
static void bgworker_die(SIGNAL_ARGS)
|
static void bgworker_die(SIGNAL_ARGS)
|
||||||
{
|
{
|
||||||
(void)gs_signal_setmask(&t_thrd.libpq_cxt.BlockSig, NULL);
|
(void)gs_signal_setmask(&t_thrd.libpq_cxt.BlockSig, NULL);
|
||||||
|
t_thrd.bgworker_cxt.worker_shutdown_requested = true;
|
||||||
t_thrd.postgres_cxt.whereToSendOutput = DestNone;
|
t_thrd.postgres_cxt.whereToSendOutput = DestNone;
|
||||||
ereport(FATAL,
|
if (t_thrd.proc)
|
||||||
|
SetLatch(&t_thrd.proc->procLatch);
|
||||||
|
ereport(WARNING,
|
||||||
(errcode(ERRCODE_ADMIN_SHUTDOWN),
|
(errcode(ERRCODE_ADMIN_SHUTDOWN),
|
||||||
errmsg("terminating background worker \"%s\" due to administrator command",
|
errmsg("terminating background worker \"%s\" due to administrator command",
|
||||||
t_thrd.bgworker_cxt.my_bgworker_entry->bgw_type)));
|
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.is_background_worker = true;
|
||||||
|
t_thrd.bgworker_cxt.worker_shutdown_requested = false;
|
||||||
/* Identify myself via ps */
|
/* Identify myself via ps */
|
||||||
init_ps_display(worker->bgw_name, "", "", "");
|
init_ps_display(worker->bgw_name, "", "", "");
|
||||||
|
|
||||||
|
@ -10483,6 +10483,7 @@ int GaussDbThreadMain(knl_thread_arg* arg)
|
|||||||
|
|
||||||
case BACKGROUND_WORKER: {
|
case BACKGROUND_WORKER: {
|
||||||
t_thrd.bgworker_cxt.is_background_worker = true;
|
t_thrd.bgworker_cxt.is_background_worker = true;
|
||||||
|
t_thrd.bgworker_cxt.worker_shutdown_requested = false;
|
||||||
InitProcessAndShareMemory();
|
InitProcessAndShareMemory();
|
||||||
StartBackgroundWorker(arg->payload);
|
StartBackgroundWorker(arg->payload);
|
||||||
proc_exit(0);
|
proc_exit(0);
|
||||||
|
@ -742,7 +742,7 @@ void autonomous_worker_main(Datum main_arg)
|
|||||||
break;
|
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)
|
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->background_worker_data = NULL;
|
||||||
bgworker_cxt->my_bgworker_entry = NULL;
|
bgworker_cxt->my_bgworker_entry = NULL;
|
||||||
bgworker_cxt->is_background_worker = false;
|
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->background_worker_list = SLIST_STATIC_INIT(background_worker_list);
|
||||||
bgworker_cxt->ParallelMessagePending = false;
|
bgworker_cxt->ParallelMessagePending = false;
|
||||||
bgworker_cxt->InitializingParallelWorker = 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. */
|
/* An interrupt may have occurred while we were waiting. */
|
||||||
CHECK_FOR_INTERRUPTS();
|
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;
|
BackgroundWorkerArray *background_worker_data;
|
||||||
BackgroundWorker *my_bgworker_entry;
|
BackgroundWorker *my_bgworker_entry;
|
||||||
bool is_background_worker;
|
bool is_background_worker;
|
||||||
|
bool worker_shutdown_requested;
|
||||||
/*
|
/*
|
||||||
* The postmaster's list of registered background workers, in private memory.
|
* The postmaster's list of registered background workers, in private memory.
|
||||||
*/
|
*/
|
||||||
|
@ -93,6 +93,46 @@ select * from at_tb2;
|
|||||||
4 | klk
|
4 | klk
|
||||||
(4 rows)
|
(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;
|
truncate table at_tb2;
|
||||||
DECLARE
|
DECLARE
|
||||||
begin
|
begin
|
||||||
|
@ -53,6 +53,32 @@ end;
|
|||||||
select at_test4(6);
|
select at_test4(6);
|
||||||
select * from at_tb2;
|
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;
|
truncate table at_tb2;
|
||||||
DECLARE
|
DECLARE
|
||||||
begin
|
begin
|
||||||
|
Reference in New Issue
Block a user