mirror of
https://github.com/postgres/postgres.git
synced 2025-04-24 10:47:04 +03:00
shm_mq: Fix detach race condition.
Commit 34db06ef9a1d7f36391c64293bf1e0ce44a33915 adopted a lock-free design for shm_mq.c, but it introduced a race condition that could lose messages. When shm_mq_receive_bytes() detects that the other end has detached, it must make sure that it has seen the final version of mq_bytes_written, or it might miss a message sent before detaching. Thomas Munro Discussion: https://postgr.es/m/CAEepm%3D2myZ4qxpt1a%3DC%2BwEv3o188K13K3UvD-44FK0SdAzHy%2Bw%40mail.gmail.com
This commit is contained in:
parent
2f3e2340cd
commit
42d7074ebb
@ -1058,7 +1058,19 @@ shm_mq_receive_bytes(shm_mq_handle *mqh, Size bytes_needed, bool nowait,
|
||||
* detached.
|
||||
*/
|
||||
if (mq->mq_detached)
|
||||
{
|
||||
/*
|
||||
* If the writer advanced mq_bytes_written and then set
|
||||
* mq_detached, we might not have read the final value of
|
||||
* mq_bytes_written above. Insert a read barrier and then check
|
||||
* again if mq_bytes_written has advanced.
|
||||
*/
|
||||
pg_read_barrier();
|
||||
if (written != pg_atomic_read_u64(&mq->mq_bytes_written))
|
||||
continue;
|
||||
|
||||
return SHM_MQ_DETACHED;
|
||||
}
|
||||
|
||||
/*
|
||||
* We didn't get enough data to satisfy the request, so mark any data
|
||||
|
Loading…
x
Reference in New Issue
Block a user