]> granicus.if.org Git - postgresql/commitdiff
Try to fix spurious DSM failures on Windows.
authorRobert Haas <rhaas@postgresql.org>
Wed, 16 Apr 2014 16:04:44 +0000 (12:04 -0400)
committerRobert Haas <rhaas@postgresql.org>
Wed, 16 Apr 2014 16:04:44 +0000 (12:04 -0400)
Apparently, Windows can sometimes return an error code even when the
operation actually worked just fine.  Rearrange the order of checks
according to what appear to be the best practices in this area.

Amit Kapila

src/backend/storage/ipc/dsm_impl.c

index b1519c97878ce62f803c229827bf0dbdcf700969..fa253f0af5362c0e0509004410cb6ab11ec20656 100644 (file)
@@ -693,6 +693,15 @@ dsm_impl_windows(dsm_op op, dsm_handle handle, Size request_size,
                                                                 size_high,     /* Upper 32 bits of size */
                                                                 size_low,              /* Lower 32 bits of size */
                                                                 name);
+               if (!hmap)
+               {
+                       _dosmaperr(GetLastError());
+                       ereport(elevel,
+                                       (errcode_for_dynamic_shared_memory(),
+                                        errmsg("could not create shared memory segment \"%s\": %m",
+                                                       name)));
+                       return false;
+               }
                _dosmaperr(GetLastError());
                if (errno == EEXIST)
                {
@@ -711,16 +720,15 @@ dsm_impl_windows(dsm_op op, dsm_handle handle, Size request_size,
                hmap = OpenFileMapping(FILE_MAP_WRITE | FILE_MAP_READ,
                                                           FALSE,               /* do not inherit the name */
                                                           name);               /* name of mapping object */
-               _dosmaperr(GetLastError());
-       }
-
-       if (!hmap)
-       {
-               ereport(elevel,
-                               (errcode_for_dynamic_shared_memory(),
-                                errmsg("could not open shared memory segment \"%s\": %m",
-                                       name)));
-               return false;
+               if (!hmap)
+               {
+                       _dosmaperr(GetLastError());
+                       ereport(elevel,
+                                       (errcode_for_dynamic_shared_memory(),
+                                        errmsg("could not open shared memory segment \"%s\": %m",
+                                                       name)));
+                       return false;
+               }
        }
 
        /* Map it. */