From a3382de95404878b96d9b37c58ad02c97005eb5a Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Wed, 12 Dec 2007 09:39:54 +0000
Subject: [PATCH] Provide a more accurate, detailed log message when the
 archive command fails.

---
 src/backend/postmaster/pgarch.c | 34 ++++++++++++++++++++++++++++-----
 1 file changed, 29 insertions(+), 5 deletions(-)

diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c
index b336a4a376b..f9a88b664b0 100644
--- a/src/backend/postmaster/pgarch.c
+++ b/src/backend/postmaster/pgarch.c
@@ -19,7 +19,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/postmaster/pgarch.c,v 1.33 2007/11/24 21:37:04 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/postmaster/pgarch.c,v 1.34 2007/12/12 09:39:54 petere Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -484,11 +484,35 @@ pgarch_archiveXlog(char *xlog)
 		 * Per the Single Unix Spec, shells report exit status > 128 when a
 		 * called command died on a signal.
 		 */
-		bool		signaled = WIFSIGNALED(rc) || WEXITSTATUS(rc) > 128;
+		int		lev = (WIFSIGNALED(rc) || WEXITSTATUS(rc) > 128) ? FATAL : LOG;
 
-		ereport(signaled ? FATAL : LOG,
-				(errmsg("archive command \"%s\" failed: return code %d",
-						xlogarchcmd, rc)));
+		if (WIFEXITED(rc))
+		{
+			ereport(lev,
+					(errmsg("archive command failed with exit code %d", WEXITSTATUS(rc)),
+					 errdetail("The failed archive command was: %s", xlogarchcmd)));
+		}
+		else if (WIFSIGNALED(rc))
+		{
+			ereport(lev, (
+#if defined(WIN32)
+						errmsg("archive command was terminated by exception 0x%X", WTERMSIG(rc)),
+						errhint("See C include file \"ntstatus.h\" for a description of the hexadecimal value."),
+#elif defined(HAVE_DECL_SYS_SIGLIST) && HAVE_DECL_SYS_SIGLIST
+						errmsg("archive command was terminated by signal %d: %s",
+							   WTERMSIG(rc),
+							   WTERMSIG(rc) < NSIG ? sys_siglist[WTERMSIG(rc)] : "(unknown)"),
+#else
+						errmsg("archive command was terminated by signal %d", WTERMSIG(exitstatus)),
+#endif
+						errdetail("The failed archive command was: %s", xlogarchcmd)));
+		}
+		else
+		{
+			ereport(lev,
+					(errmsg("archive command exited with unrecognized status %d", rc),
+					 errdetail("The failed archive command was: %s", xlogarchcmd)));
+		}
 
 		return false;
 	}
-- 
GitLab