Fix broken mmap failure-detection code, and improve error message.
authorRobert Haas <rhaas@postgresql.org>
Thu, 28 Jun 2012 16:57:22 +0000 (12:57 -0400)
committerRobert Haas <rhaas@postgresql.org>
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);