]> granicus.if.org Git - postgresql/commitdiff
Get more info about Windows can't-reattach-to-shared-memory errors.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 29 Apr 2018 20:02:45 +0000 (16:02 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 29 Apr 2018 20:02:45 +0000 (16:02 -0400)
Commit 63ca350ef neglected to probe the state of things *before*
the VirtualFree call, which now looks like it might be interesting.

Discussion: https://postgr.es/m/25495.1524517820@sss.pgh.pa.us

src/backend/port/win32_shmem.c

index d431e0d036276ee03e4152185226fdd6e9ca2613..e724b3ef1a3231a632c6f0cf72f77579e92046c5 100644 (file)
@@ -388,10 +388,18 @@ PGSharedMemoryReAttach(void)
 {
        PGShmemHeader *hdr;
        void       *origUsedShmemSegAddr = UsedShmemSegAddr;
+       MEMORY_BASIC_INFORMATION previnfo;
+       DWORD           queryerr;
 
        Assert(UsedShmemSegAddr != NULL);
        Assert(IsUnderPostmaster);
 
+       /* Preliminary probe of region we intend to release */
+       if (VirtualQuery(UsedShmemSegAddr, &previnfo, sizeof(previnfo)) != 0)
+               queryerr = 0;
+       else
+               queryerr = GetLastError();
+
        /*
         * Release memory region reservation that was made by the postmaster
         */
@@ -405,12 +413,20 @@ PGSharedMemoryReAttach(void)
                DWORD           maperr = GetLastError();
                MEMORY_BASIC_INFORMATION info;
 
+               if (queryerr == 0)
+                       elog(LOG, "VirtualQuery(%p) before free reports region of size %zu, base %p, has state 0x%lx",
+                                UsedShmemSegAddr, previnfo.RegionSize,
+                                previnfo.AllocationBase, previnfo.State);
+               else
+                       elog(LOG, "VirtualQuery(%p) before free failed: error code %lu",
+                                UsedShmemSegAddr, queryerr);
+
                if (VirtualQuery(UsedShmemSegAddr, &info, sizeof(info)) != 0)
-                       elog(LOG, "VirtualQuery(%p) reports region of size %zu, base %p, has state 0x%lx",
+                       elog(LOG, "VirtualQuery(%p) after free reports region of size %zu, base %p, has state 0x%lx",
                                 UsedShmemSegAddr, info.RegionSize,
                                 info.AllocationBase, info.State);
                else
-                       elog(LOG, "VirtualQuery(%p) failed: error code %lu",
+                       elog(LOG, "VirtualQuery(%p) after free failed: error code %lu",
                                 UsedShmemSegAddr, GetLastError());
 
                elog(FATAL, "could not reattach to shared memory (key=%p, addr=%p): error code %lu",