Skip to content

Commit 0b55aaa

Browse files
committed
Fix race in dsm_unpin_segment() when handles are reused.
Teach dsm_unpin_segment() to skip segments that are in the process of being destroyed by another backend, when searching for a handle. Such a segment cannot possibly be the one we are looking for, even if its handle matches. Another slot might hold a recently created segment that has the same handle value by coincidence, and we need to keep searching for that one. The bug caused rare "cannot unpin a segment that is not pinned" errors on 10 and 11. Similar to commit 6c0fb94 for dsm_attach(). Back-patch to 10, where dsm_unpin_segment() landed. Author: Thomas Munro Reported-by: Justin Pryzby Tested-by: Justin Pryzby (along with other recent DSA/DSM fixes) Discussion: https://postgr.es/m/20190216023854.GF30291@telsasoft.com
1 parent bc6d7eb commit 0b55aaa

File tree

1 file changed

+2
-2
lines changed
  • src/backend/storage/ipc

1 file changed

+2
-2
lines changed

src/backend/storage/ipc/dsm.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -844,8 +844,8 @@ dsm_unpin_segment(dsm_handle handle)
844844
LWLockAcquire(DynamicSharedMemoryControlLock, LW_EXCLUSIVE);
845845
for (i = 0; i < dsm_control->nitems; ++i)
846846
{
847-
/* Skip unused slots. */
848-
if (dsm_control->item[i].refcnt == 0)
847+
/* Skip unused slots and segments that are concurrently going away. */
848+
if (dsm_control->item[i].refcnt <= 1)
849849
continue;
850850

851851
/* If we've found our handle, we can stop searching. */

0 commit comments

Comments
 (0)
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