Skip to content

Commit 184a446

Browse files
author
Maksim Milyutin
committed
Make fixes to prevent race condition under transfering query state from leader process
1 parent 28a7c9f commit 184a446

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

contrib/pg_query_state/pg_query_state.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -854,12 +854,12 @@ GetRemoteBackendWorkers(PGPROC *proc)
854854

855855
sig_result = SendProcSignal(proc->pid, WorkerPollReason, proc->backendId);
856856
if (sig_result == -1)
857-
return NIL;
857+
goto signal_error;
858858

859859
mqh = shm_mq_attach(mq, NULL, NULL);
860860
mq_receive_result = shm_mq_receive(mqh, &msg_len, (void **) &msg, false);
861861
if (mq_receive_result != SHM_MQ_SUCCESS)
862-
return NIL;
862+
goto mq_error;
863863

864864
for (i = 0; i < msg->number; i++)
865865
{
@@ -872,6 +872,13 @@ GetRemoteBackendWorkers(PGPROC *proc)
872872
shm_mq_detach(mq);
873873

874874
return result;
875+
876+
signal_error:
877+
ereport(ERROR, (errcode(ERRCODE_INTERNAL_ERROR),
878+
errmsg("invalid send signal")));
879+
mq_error:
880+
ereport(ERROR, (errcode(ERRCODE_INTERNAL_ERROR),
881+
errmsg("error in message queue data transmitting")));
875882
}
876883

877884
static shm_mq_msg *
@@ -914,6 +921,9 @@ GetRemoteBackendQueryStates(PGPROC *leader,
914921
params->format = format;
915922
pg_write_barrier();
916923

924+
/* initialize message queue that will transfer query states */
925+
mq = shm_mq_create(mq, QUEUE_SIZE);
926+
917927
/*
918928
* send signal `QueryStatePollReason` to all processes and define all alive
919929
* ones
@@ -941,7 +951,6 @@ GetRemoteBackendQueryStates(PGPROC *leader,
941951
}
942952

943953
/* extract query state from leader process */
944-
mq = shm_mq_create(mq, QUEUE_SIZE);
945954
shm_mq_set_sender(mq, leader);
946955
shm_mq_set_receiver(mq, MyProc);
947956
mqh = shm_mq_attach(mq, NULL, NULL);

0 commit comments

Comments
 (0)