Fix broken mmap failure-detection code, and improve error message.
authorRobert Haas
Thu, 28 Jun 2012 16:57:22 +0000 (12:57 -0400)
committerRobert Haas
Thu, 28 Jun 2012 16:57:22 +0000 (12:57 -0400)
Per an observation by Thom Brown that my previous commit made an
overly large shmem allocation crash the server, on Linux.

src/backend/port/sysv_shmem.c

index 4bbd0ec64950f3090ba10f8a790c952f7051412a..20f31ed218d7e6f9617da3b4cc3d8d465d8c3e5d 100644 (file)
@@ -419,10 +419,17 @@ PGSharedMemoryCreate(Size size, bool makePrivate, int port)
         */
        AnonymousShmem = mmap(NULL, size, PROT_READ|PROT_WRITE, PG_MMAP_FLAGS,
                              -1, 0);
-       if (AnonymousShmem == NULL)
+       if (AnonymousShmem == MAP_FAILED)
            ereport(FATAL,
-            (errmsg("could not map %lu bytes of anonymous shared memory: %m",
-               (unsigned long) AnonymousShmemSize)));
+            (errmsg("could not map anonymous shared memory: %m"),
+             (errno == ENOMEM) ?
+              errhint("This error usually means that PostgreSQL's request "
+                      "for a shared memory segment exceeded available memory "
+                      "or swap space. To reduce the request size (currently "
+                      "%lu bytes), reduce PostgreSQL's shared memory usage, "
+                      "perhaps by reducing shared_buffers or "
+                      "max_connections.",
+                   (unsigned long) AnonymousShmemSize) : 0));
 
        /* Now we can allocate a minimal SHM block. */
        allocsize = sizeof(PGShmemHeader);