Hi, dsm_attach() does the following:
nitems = dsm_control->nitems; for (i = 0; i < nitems; ++i) { /* If the reference count is 0, the slot is actually unused. */ if (dsm_control->item[i].refcnt == 0) continue; /* * 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 * didn't find a match. */ if (dsm_control->item[i].refcnt == 1) break; /* Otherwise, if the descriptor matches, we've found a match. */ if (dsm_control->item[i].handle == seg->handle) { dsm_control->item[i].refcnt++; seg->control_slot = i; break; } } The break because of refcnt == 1 doesn't generally seem to be a good idea. Why are we bailing if there's *any* segment that's in the process of being removed? I think the check should be there *after* the dsm_control->item[i].handle == seg->handle check? Greetings, Andres Freund -- Andres Freund http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers