fix deadlock

This commit is contained in:
yupeng
2020-09-17 14:05:28 +08:00
parent e8d0ba3f2e
commit c3673e64ca
8 changed files with 110 additions and 37 deletions

View File

@ -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, "", "", "");

View File

@ -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);

View File

@ -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)

View File

@ -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;

View File

@ -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;
} }
} }

View File

@ -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.
*/ */

View File

@ -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

View File

@ -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