Skip to content

Commit eb16011

Browse files
committed
Get still more info about Windows can't-reattach-to-shared-memory errors.
After some thought about the info captured so far, it seems possible that MapViewOfFileEx is itself causing some DLL to get loaded into the space just freed by VirtualFree. The previous commit here didn't capture enough info to really prove the case for that, so let's add one more VirtualQuery in between those steps. Also, be sure to capture the post-Map state before we emit any log entries, just in case elog() is invoking some code not previously loaded. Discussion: https://postgr.es/m/[email protected]
1 parent 6bdf130 commit eb16011

File tree

1 file changed

+33
-10
lines changed

1 file changed

+33
-10
lines changed

src/backend/port/win32_shmem.c

+33-10
Original file line numberDiff line numberDiff line change
@@ -389,16 +389,18 @@ PGSharedMemoryReAttach(void)
389389
PGShmemHeader *hdr;
390390
void *origUsedShmemSegAddr = UsedShmemSegAddr;
391391
MEMORY_BASIC_INFORMATION previnfo;
392-
DWORD queryerr;
392+
MEMORY_BASIC_INFORMATION afterinfo;
393+
DWORD preverr;
394+
DWORD aftererr;
393395

394396
Assert(UsedShmemSegAddr != NULL);
395397
Assert(IsUnderPostmaster);
396398

397399
/* Preliminary probe of region we intend to release */
398400
if (VirtualQuery(UsedShmemSegAddr, &previnfo, sizeof(previnfo)) != 0)
399-
queryerr = 0;
401+
preverr = 0;
400402
else
401-
queryerr = GetLastError();
403+
preverr = GetLastError();
402404

403405
/*
404406
* Release memory region reservation that was made by the postmaster
@@ -407,27 +409,48 @@ PGSharedMemoryReAttach(void)
407409
elog(FATAL, "failed to release reserved memory region (addr=%p): error code %lu",
408410
UsedShmemSegAddr, GetLastError());
409411

412+
/* Verify post-release state */
413+
if (VirtualQuery(UsedShmemSegAddr, &afterinfo, sizeof(afterinfo)) != 0)
414+
aftererr = 0;
415+
else
416+
aftererr = GetLastError();
417+
410418
hdr = (PGShmemHeader *) MapViewOfFileEx(UsedShmemSegID, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0, UsedShmemSegAddr);
411419
if (!hdr)
412420
{
413421
DWORD maperr = GetLastError();
414-
MEMORY_BASIC_INFORMATION info;
422+
MEMORY_BASIC_INFORMATION postinfo;
423+
DWORD posterr;
424+
425+
/* Capture post-failure state */
426+
if (VirtualQuery(UsedShmemSegAddr, &postinfo, sizeof(postinfo)) != 0)
427+
posterr = 0;
428+
else
429+
posterr = GetLastError();
415430

416-
if (queryerr == 0)
431+
if (preverr == 0)
417432
elog(LOG, "VirtualQuery(%p) before free reports region of size %zu, base %p, has state 0x%lx",
418433
UsedShmemSegAddr, previnfo.RegionSize,
419434
previnfo.AllocationBase, previnfo.State);
420435
else
421436
elog(LOG, "VirtualQuery(%p) before free failed: error code %lu",
422-
UsedShmemSegAddr, queryerr);
437+
UsedShmemSegAddr, preverr);
423438

424-
if (VirtualQuery(UsedShmemSegAddr, &info, sizeof(info)) != 0)
439+
if (aftererr == 0)
425440
elog(LOG, "VirtualQuery(%p) after free reports region of size %zu, base %p, has state 0x%lx",
426-
UsedShmemSegAddr, info.RegionSize,
427-
info.AllocationBase, info.State);
441+
UsedShmemSegAddr, afterinfo.RegionSize,
442+
afterinfo.AllocationBase, afterinfo.State);
428443
else
429444
elog(LOG, "VirtualQuery(%p) after free failed: error code %lu",
430-
UsedShmemSegAddr, GetLastError());
445+
UsedShmemSegAddr, aftererr);
446+
447+
if (posterr == 0)
448+
elog(LOG, "VirtualQuery(%p) after map reports region of size %zu, base %p, has state 0x%lx",
449+
UsedShmemSegAddr, postinfo.RegionSize,
450+
postinfo.AllocationBase, postinfo.State);
451+
else
452+
elog(LOG, "VirtualQuery(%p) after map failed: error code %lu",
453+
UsedShmemSegAddr, posterr);
431454

432455
elog(FATAL, "could not reattach to shared memory (key=%p, addr=%p): error code %lu",
433456
UsedShmemSegID, UsedShmemSegAddr, maperr);

0 commit comments

Comments
 (0)