From 4d2b581cdaa58ed56694e1cb0b0d9ec8c7927f5c Mon Sep 17 00:00:00 2001 From: Sergey Cherkashin <4erkashin@list.ru> Date: Wed, 31 Oct 2018 11:05:22 +0300 Subject: [PATCH 1/2] Fix bug --- pg_query_state.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/pg_query_state.c b/pg_query_state.c index 72a9b64..2d4c285 100644 --- a/pg_query_state.c +++ b/pg_query_state.c @@ -618,6 +618,11 @@ pg_query_state(PG_FUNCTION_ARGS) shm_mq_msg *msg = (shm_mq_msg *) lfirst(i); proc_state *p_state = (proc_state *) palloc(sizeof(proc_state)); + if (msg->result_code != QS_RETURNED) + continue; + + AssertState(msg->result_code == QS_RETURNED); + qs_stack = deserialize_stack(msg->stack, msg->stack_depth); p_state->proc = msg->proc; @@ -856,7 +861,12 @@ SendBgWorkerPids(void) msg->number = list_length(all_workers); i = 0; foreach(iter, all_workers) - msg->pids[i++] = lfirst_int(iter); + { + pid_t current_pid = lfirst_int(iter); + + AssertState(current_pid > 0); + msg->pids[i++] = current_pid; + } shm_mq_send(mqh, msg_len, msg, false); } @@ -894,9 +904,10 @@ GetRemoteBackendWorkers(PGPROC *proc) for (i = 0; i < msg->number; i++) { - pid_t pid = msg->pids[i]; - PGPROC *proc = BackendPidGetProc(pid); - + pid_t pid = msg->pids[i]; + PGPROC *proc = BackendPidGetProc(pid); + if (!proc || !proc->pid) + continue; result = lcons(proc, result); } @@ -971,7 +982,7 @@ GetRemoteBackendQueryStates(PGPROC *leader, foreach(iter, pworkers) { PGPROC *proc = (PGPROC *) lfirst(iter); - + Assert (proc && proc->pid); sig_result = SendProcSignal(proc->pid, QueryStatePollReason, proc->backendId); From 91e3196c37d60d88d7e6a9d12cb89a0f4534368b Mon Sep 17 00:00:00 2001 From: Sergey Cherkashin <4erkashin@list.ru> Date: Thu, 1 Nov 2018 14:07:10 +0300 Subject: [PATCH 2/2] Additional check of process state --- pg_query_state.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pg_query_state.c b/pg_query_state.c index 2d4c285..9bd6771 100644 --- a/pg_query_state.c +++ b/pg_query_state.c @@ -982,7 +982,8 @@ GetRemoteBackendQueryStates(PGPROC *leader, foreach(iter, pworkers) { PGPROC *proc = (PGPROC *) lfirst(iter); - Assert (proc && proc->pid); + if (!proc || !proc->pid) + continue; sig_result = SendProcSignal(proc->pid, QueryStatePollReason, proc->backendId);