Commit e0124230 authored by Robert Haas's avatar Robert Haas

Fix logic bug in dsm_attach().

The previous coding would potentially cause attaching to segment A to
fail if segment B was at the same time in the process of going away.

Andres Freund, with a comment tweak by me
parent 4335c958
...@@ -566,6 +566,10 @@ dsm_attach(dsm_handle h) ...@@ -566,6 +566,10 @@ dsm_attach(dsm_handle h)
if (dsm_control->item[i].refcnt == 0) if (dsm_control->item[i].refcnt == 0)
continue; continue;
/* If the handle doesn't match, it's not the slot we want. */
if (dsm_control->item[i].handle != seg->handle)
continue;
/* /*
* If the reference count is 1, the slot is still in use, but the * If the reference count is 1, the slot is still in use, but the
* segment is in the process of going away. Treat that as if we * segment is in the process of going away. Treat that as if we
...@@ -574,13 +578,10 @@ dsm_attach(dsm_handle h) ...@@ -574,13 +578,10 @@ dsm_attach(dsm_handle h)
if (dsm_control->item[i].refcnt == 1) if (dsm_control->item[i].refcnt == 1)
break; break;
/* Otherwise, if the descriptor matches, we've found a match. */ /* Otherwise we've found a match. */
if (dsm_control->item[i].handle == seg->handle) dsm_control->item[i].refcnt++;
{ seg->control_slot = i;
dsm_control->item[i].refcnt++; break;
seg->control_slot = i;
break;
}
} }
LWLockRelease(DynamicSharedMemoryControlLock); LWLockRelease(DynamicSharedMemoryControlLock);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment