Skip to content

Commit 3c4ab3f

Browse files
committed
Exit backend from SIGTERM or FATAL by simulating client EOF, rather than
calling proc_exit() directly. This should make SIGTERM more reliable.
1 parent 1934055 commit 3c4ab3f

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

src/backend/tcop/postgres.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.398 2004/04/07 05:05:49 momjian Exp $
11+
* $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.399 2004/04/11 00:54:44 momjian Exp $
1212
*
1313
* NOTES
1414
* this is the "main" module of the postgres backend and
@@ -2938,7 +2938,10 @@ PostgresMain(int argc, char *argv[], const char *username)
29382938
/*
29392939
* (3) read a command (loop blocks here)
29402940
*/
2941-
firstchar = ReadCommand(&input_message);
2941+
if (!in_fatal_exit)
2942+
firstchar = ReadCommand(&input_message);
2943+
else
2944+
firstchar = EOF;
29422945

29432946
/*
29442947
* (4) disable async signal conditions again.
@@ -3170,7 +3173,8 @@ PostgresMain(int argc, char *argv[], const char *username)
31703173
* Otherwise it will fail to be called during other
31713174
* backend-shutdown scenarios.
31723175
*/
3173-
proc_exit(0);
3176+
proc_exit(!in_fatal_exit ? 0 : proc_exit_inprogress ||
3177+
!IsUnderPostmaster);
31743178

31753179
case 'd': /* copy data */
31763180
case 'c': /* copy done */

src/backend/utils/error/elog.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
*
3838
*
3939
* IDENTIFICATION
40-
* $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.132 2004/04/05 03:02:06 momjian Exp $
40+
* $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.133 2004/04/11 00:54:45 momjian Exp $
4141
*
4242
*-------------------------------------------------------------------------
4343
*/
@@ -72,6 +72,8 @@ PGErrorVerbosity Log_error_verbosity = PGERROR_VERBOSE;
7272
char *Log_line_prefix = NULL; /* format for extra log line info */
7373
unsigned int Log_destination;
7474

75+
bool in_fatal_exit = false;
76+
7577
#ifdef HAVE_SYSLOG
7678
char *Syslog_facility; /* openlog() parameters */
7779
char *Syslog_ident;
@@ -442,7 +444,12 @@ errfinish(int dummy,...)
442444
*/
443445
fflush(stdout);
444446
fflush(stderr);
445-
proc_exit(proc_exit_inprogress || !IsUnderPostmaster);
447+
448+
if (in_fatal_exit)
449+
ereport(PANIC, (errmsg("fatal error during fatal exit, giving up")));
450+
451+
/* We will exit the backend by simulating a client EOF */
452+
in_fatal_exit = true;
446453
}
447454

448455
/*

src/include/tcop/tcopprot.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/include/tcop/tcopprot.h,v 1.64 2004/04/07 05:05:50 momjian Exp $
10+
* $PostgreSQL: pgsql/src/include/tcop/tcopprot.h,v 1.65 2004/04/11 00:54:45 momjian Exp $
1111
*
1212
* OLD COMMENTS
1313
* This file was created so that other c files could get the two
@@ -34,6 +34,7 @@ extern bool log_hostname;
3434
extern DLLIMPORT const char *debug_query_string;
3535
extern char *rendezvous_name;
3636
extern int max_stack_depth;
37+
extern bool in_fatal_exit;
3738

3839
/* GUC-configurable parameters */
3940

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy