From a8ed9bd59d48c13da50ed2358911721b2baf1de3 Mon Sep 17 00:00:00 2001 From: Etsuro Fujita Date: Mon, 2 Aug 2021 12:45:00 +0900 Subject: Fix oversight in commit 1ec7fca8592178281cd5cdada0f27a340fb813fc. I failed to account for the possibility that when ExecAppendAsyncEventWait() notifies multiple async-capable nodes using postgres_fdw, a preceding node might invoke process_pending_request() to process a pending asynchronous request made by a succeeding node. In that case the succeeding node should produce a tuple to return to the parent Append node from tuples fetched by process_pending_request() when notified. Repair. Per buildfarm via Michael Paquier. Back-patch to v14, like the previous commit. Thanks to Tom Lane for testing. Discussion: https://postgr.es/m/YQP0UPT8KmPiHTMs%40paquier.xyz --- src/backend/executor/nodeAppend.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'src/backend/executor') diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c index a4eef19d7f4..6a2daa6e767 100644 --- a/src/backend/executor/nodeAppend.c +++ b/src/backend/executor/nodeAppend.c @@ -1082,16 +1082,18 @@ ExecAppendAsyncEventWait(AppendState *node) { AsyncRequest *areq = (AsyncRequest *) w->user_data; - /* - * Mark it as no longer needing a callback. We must do this - * before dispatching the callback in case the callback resets the - * flag. - */ - Assert(areq->callback_pending); - areq->callback_pending = false; - - /* Do the actual work. */ - ExecAsyncNotify(areq); + if (areq->callback_pending) + { + /* + * Mark it as no longer needing a callback. We must do this + * before dispatching the callback in case the callback resets + * the flag. + */ + areq->callback_pending = false; + + /* Do the actual work. */ + ExecAsyncNotify(areq); + } } } } -- cgit v1.2.3