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); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy