aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2012-06-28 12:57:22 -0400
committerRobert Haas <rhaas@postgresql.org>2012-06-28 12:57:22 -0400
commit39715af23ae459684963c350dd69eafa2d502e7e (patch)
treeef4fb750463f7f92f0cf180297ae23b65ad58177
parentb0fc0df9364d2d2d17c0162cf3b8b59f6cb09f67 (diff)
downloadpostgresql-39715af23ae459684963c350dd69eafa2d502e7e.tar.gz
postgresql-39715af23ae459684963c350dd69eafa2d502e7e.zip
Fix broken mmap failure-detection code, and improve error message.
Per an observation by Thom Brown that my previous commit made an overly large shmem allocation crash the server, on Linux.
-rw-r--r--src/backend/port/sysv_shmem.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/backend/port/sysv_shmem.c b/src/backend/port/sysv_shmem.c
index 4bbd0ec6495..20f31ed218d 100644
--- a/src/backend/port/sysv_shmem.c
+++ b/src/backend/port/sysv_shmem.c
@@ -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);