Failures of archive_command calls report a confusing exit status such as:
LOG: archive command "cp 'pg_xlog/000000010000000000000000'
'/nonexistent/000000010000000000000000'" failed: return code 256
The actual return code is 1; it neglects to apply WEXITSTATUS().
I figured it would make sense if pgarch.c used the same mechanism that
postmaster.c uses to report the various variants of regular and signal
exits.
I have attached a patch in that direction. It obviously needs a bit of
string struggling to get all the cases right, but the idea should be
clear. Comments?
--
Peter Eisentraut
http://developer.postgresql.org/~petere/
diff -ur ../cvs-pgsql/src/backend/postmaster/pgarch.c ./src/backend/postmaster/pgarch.c
--- ../cvs-pgsql/src/backend/postmaster/pgarch.c 2007-11-26 13:29:36.000000000 +0100
+++ ./src/backend/postmaster/pgarch.c 2007-12-10 17:59:18.000000000 +0100
@@ -480,15 +480,11 @@
* SIGQUIT while waiting; so a signal is very likely something that
* should have interrupted us too. If we overreact it's no big deal,
* the postmaster will just start the archiver again.
- *
- * 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;
- ereport(signaled ? FATAL : LOG,
- (errmsg("archive command \"%s\" failed: return code %d",
- xlogarchcmd, rc)));
+ // FIXME: "archive command \"%s\"", xlogarchcmd
+ // FIXME: get rid of PID = 0
+ LogChildExit(WIFSIGNALED(rc) ? FATAL : LOG, "archive command", 0, rc);
return false;
}
diff -ur ../cvs-pgsql/src/backend/postmaster/postmaster.c ./src/backend/postmaster/postmaster.c
--- ../cvs-pgsql/src/backend/postmaster/postmaster.c 2007-11-19 13:38:49.000000000 +0100
+++ ./src/backend/postmaster/postmaster.c 2007-12-10 18:00:04.000000000 +0100
@@ -305,8 +305,6 @@
static void dummy_handler(SIGNAL_ARGS);
static void CleanupBackend(int pid, int exitstatus);
static void HandleChildCrash(int pid, int exitstatus, const char *procname);
-static void LogChildExit(int lev, const char *procname,
- int pid, int exitstatus);
static void PostmasterStateMachine(void);
static void BackendInitialize(Port *port);
static int BackendRun(Port *port);
@@ -2477,7 +2475,7 @@
/*
* Log the death of a child process.
*/
-static void
+void
LogChildExit(int lev, const char *procname, int pid, int exitstatus)
{
if (WIFEXITED(exitstatus))
diff -ur ../cvs-pgsql/src/include/postmaster/postmaster.h ./src/include/postmaster/postmaster.h
--- ../cvs-pgsql/src/include/postmaster/postmaster.h 2007-02-19 11:05:59.000000000 +0100
+++ ./src/include/postmaster/postmaster.h 2007-12-10 18:00:02.000000000 +0100
@@ -37,6 +37,8 @@
extern int PostmasterMain(int argc, char *argv[]);
extern void ClosePostmasterPorts(bool am_syslogger);
+extern void LogChildExit(int lev, const char *procname,
+ int pid, int exitstatus);
#ifdef EXEC_BACKEND
extern pid_t postmaster_forkexec(int argc, char *argv[]);
---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings