diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 6cece54b30bd1f729b2fbed8cddd3eab2745ad9a..09fc57b6ea1f095032cb545200a8ed7ccfa98afc 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.398 2004/04/07 05:05:49 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.399 2004/04/11 00:54:44 momjian Exp $ * * NOTES * this is the "main" module of the postgres backend and @@ -2938,7 +2938,10 @@ PostgresMain(int argc, char *argv[], const char *username) /* * (3) read a command (loop blocks here) */ - firstchar = ReadCommand(&input_message); + if (!in_fatal_exit) + firstchar = ReadCommand(&input_message); + else + firstchar = EOF; /* * (4) disable async signal conditions again. @@ -3170,7 +3173,8 @@ PostgresMain(int argc, char *argv[], const char *username) * Otherwise it will fail to be called during other * backend-shutdown scenarios. */ - proc_exit(0); + proc_exit(!in_fatal_exit ? 0 : proc_exit_inprogress || + !IsUnderPostmaster); case 'd': /* copy data */ case 'c': /* copy done */ diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 96366333f06c9d7f5e48b7e4228da98ea2fa9da9..e6f191d5df349d2af60f01296b62807e40002ac2 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -37,7 +37,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.132 2004/04/05 03:02:06 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.133 2004/04/11 00:54:45 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -72,6 +72,8 @@ PGErrorVerbosity Log_error_verbosity = PGERROR_VERBOSE; char *Log_line_prefix = NULL; /* format for extra log line info */ unsigned int Log_destination; +bool in_fatal_exit = false; + #ifdef HAVE_SYSLOG char *Syslog_facility; /* openlog() parameters */ char *Syslog_ident; @@ -442,7 +444,12 @@ errfinish(int dummy,...) */ fflush(stdout); fflush(stderr); - proc_exit(proc_exit_inprogress || !IsUnderPostmaster); + + if (in_fatal_exit) + ereport(PANIC, (errmsg("fatal error during fatal exit, giving up"))); + + /* We will exit the backend by simulating a client EOF */ + in_fatal_exit = true; } /* diff --git a/src/include/tcop/tcopprot.h b/src/include/tcop/tcopprot.h index 046fe3e810e7b3dd914e0f6160805d98c92ff834..97556ccbf1de1fb1a4df065c643d0c3e810f5c8e 100644 --- a/src/include/tcop/tcopprot.h +++ b/src/include/tcop/tcopprot.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/tcop/tcopprot.h,v 1.64 2004/04/07 05:05:50 momjian Exp $ + * $PostgreSQL: pgsql/src/include/tcop/tcopprot.h,v 1.65 2004/04/11 00:54:45 momjian Exp $ * * OLD COMMENTS * This file was created so that other c files could get the two @@ -34,6 +34,7 @@ extern bool log_hostname; extern DLLIMPORT const char *debug_query_string; extern char *rendezvous_name; extern int max_stack_depth; +extern bool in_fatal_exit; /* GUC-configurable parameters */