aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2015-10-22 22:01:11 -0400
committerRobert Haas <rhaas@postgresql.org>2015-10-22 22:01:11 -0400
commita1480ec1d3bacb9acb08ec09f22bc25bc033115b (patch)
treeb581101470cbf98fbc2912f028a9428dd07e8bb2
parent872101bede26444324059ba0f27c3b1c8b8140f6 (diff)
downloadpostgresql-a1480ec1d3bacb9acb08ec09f22bc25bc033115b.tar.gz
postgresql-a1480ec1d3bacb9acb08ec09f22bc25bc033115b.zip
shm_mq: Repair breakage from previous commit.
If the counterparty writes some data into the queue and then detaches, it's wrong to return SHM_MQ_DETACHED right away. If we do that, we fail to read whatever was written.
-rw-r--r--src/backend/storage/ipc/shm_mq.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/backend/storage/ipc/shm_mq.c b/src/backend/storage/ipc/shm_mq.c
index 61f9298489d..1d0657f3858 100644
--- a/src/backend/storage/ipc/shm_mq.c
+++ b/src/backend/storage/ipc/shm_mq.c
@@ -501,10 +501,12 @@ shm_mq_receive(shm_mq_handle *mqh, Size *nbytesp, void **datap, bool nowait)
{
if (nowait)
{
- if (shm_mq_counterparty_gone(mq, mqh->mqh_handle))
- return SHM_MQ_DETACHED;
if (shm_mq_get_sender(mq) == NULL)
+ {
+ if (shm_mq_counterparty_gone(mq, mqh->mqh_handle))
+ return SHM_MQ_DETACHED;
return SHM_MQ_WOULD_BLOCK;
+ }
}
else if (!shm_mq_wait_internal(mq, &mq->mq_sender, mqh->mqh_handle)
&& shm_mq_get_sender(mq) == NULL)