Hi, On 29/01/14 21:37, Christian Kruse wrote: > […] > attached you will find a patch addressing that issue.
Maybe we should include the patch proposed in <20140129195930.gd31...@defunct.ch> and do this as one (slightly bigger) patch. Attached you will find this alternative version. Best regards, -- Christian Kruse http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c index d73e5e8..3705d0b 100644 --- a/src/backend/commands/tablespace.c +++ b/src/backend/commands/tablespace.c @@ -782,10 +782,14 @@ remove_symlink: else { if (unlink(linkloc) < 0) - ereport(redo ? LOG : (errno == ENOENT ? WARNING : ERROR), + { + int saved_errno = errno; + + ereport(redo ? LOG : (saved_errno == ENOENT ? WARNING : ERROR), (errcode_for_file_access(), errmsg("could not remove symbolic link \"%s\": %m", linkloc))); + } } pfree(linkloc_with_version_dir); diff --git a/src/backend/port/sysv_sema.c b/src/backend/port/sysv_sema.c index b4825d2..c79c8ad 100644 --- a/src/backend/port/sysv_sema.c +++ b/src/backend/port/sysv_sema.c @@ -85,7 +85,8 @@ static void ReleaseSemaphores(int status, Datum arg); static IpcSemaphoreId InternalIpcSemaphoreCreate(IpcSemaphoreKey semKey, int numSems) { - int semId; + int semId, + saved_errno; semId = semget(semKey, numSems, IPC_CREAT | IPC_EXCL | IPCProtection); @@ -107,12 +108,13 @@ InternalIpcSemaphoreCreate(IpcSemaphoreKey semKey, int numSems) /* * Else complain and abort */ + saved_errno = errno; ereport(FATAL, (errmsg("could not create semaphores: %m"), errdetail("Failed system call was semget(%lu, %d, 0%o).", (unsigned long) semKey, numSems, IPC_CREAT | IPC_EXCL | IPCProtection), - (errno == ENOSPC) ? + (saved_errno == ENOSPC) ? errhint("This error does *not* mean that you have run out of disk space. " "It occurs when either the system limit for the maximum number of " "semaphore sets (SEMMNI), or the system wide maximum number of " @@ -133,13 +135,14 @@ static void IpcSemaphoreInitialize(IpcSemaphoreId semId, int semNum, int value) { union semun semun; + int saved_errno = errno; semun.val = value; if (semctl(semId, semNum, SETVAL, semun) < 0) ereport(FATAL, (errmsg_internal("semctl(%d, %d, SETVAL, %d) failed: %m", semId, semNum, value), - (errno == ERANGE) ? + (saved_errno == ERANGE) ? errhint("You possibly need to raise your kernel's SEMVMX value to be at least " "%d. Look into the PostgreSQL documentation for details.", value) : 0)); diff --git a/src/backend/port/sysv_shmem.c b/src/backend/port/sysv_shmem.c index ac3a9fe..511be72 100644 --- a/src/backend/port/sysv_shmem.c +++ b/src/backend/port/sysv_shmem.c @@ -68,6 +68,7 @@ InternalIpcMemoryCreate(IpcMemoryKey memKey, Size size) { IpcMemoryId shmid; void *memAddress; + int saved_errno = 0; shmid = shmget(memKey, size, IPC_CREAT | IPC_EXCL | IPCProtection); @@ -137,25 +138,26 @@ InternalIpcMemoryCreate(IpcMemoryKey memKey, Size size) * it should be. SHMMNI violation is ENOSPC, per spec. Just plain * not-enough-RAM is ENOMEM. */ + saved_errno = errno; ereport(FATAL, (errmsg("could not create shared memory segment: %m"), errdetail("Failed system call was shmget(key=%lu, size=%zu, 0%o).", (unsigned long) memKey, size, IPC_CREAT | IPC_EXCL | IPCProtection), - (errno == EINVAL) ? + (saved_errno == EINVAL) ? errhint("This error usually means that PostgreSQL's request for a shared memory " "segment exceeded your kernel's SHMMAX parameter, or possibly that " "it is less than " "your kernel's SHMMIN parameter.\n" "The PostgreSQL documentation contains more information about shared " "memory configuration.") : 0, - (errno == ENOMEM) ? + (saved_errno == ENOMEM) ? errhint("This error usually means that PostgreSQL's request for a shared " "memory segment exceeded your kernel's SHMALL parameter. You might need " "to reconfigure the kernel with larger SHMALL.\n" "The PostgreSQL documentation contains more information about shared " "memory configuration.") : 0, - (errno == ENOSPC) ? + (saved_errno == ENOSPC) ? errhint("This error does *not* mean that you have run out of disk space. " "It occurs either if all available shared memory IDs have been taken, " "in which case you need to raise the SHMMNI parameter in your kernel, " @@ -380,9 +382,12 @@ CreateAnonymousSegment(Size *size) } if (ptr == MAP_FAILED) + { + int saved_errno = errno; + ereport(FATAL, (errmsg("could not map anonymous shared memory: %m"), - (errno == ENOMEM) ? + (saved_errno == ENOMEM) ? errhint("This error usually means that PostgreSQL's request " "for a shared memory segment exceeded available memory, " "swap space or huge pages. To reduce the request size " @@ -390,6 +395,7 @@ CreateAnonymousSegment(Size *size) "memory usage, perhaps by reducing shared_buffers or " "max_connections.", *size) : 0)); + } *size = allocsize; return ptr;
pgp9zlotfX8Mg.pgp
Description: PGP signature