Skip to content

Commit dad8e41

Browse files
committed
Fix handling of SIGCHLD, per recent pghackers discussion: on some
platforms system(2) gets confused unless the signal handler is set to SIG_DFL, not SIG_IGN. pgstats.c now uses pqsignal() as it should, not signal(). Also, arrange for the stats collector process to show a reasonable ID in 'ps', rather than looking like a postmaster.
1 parent 2b769c8 commit dad8e41

File tree

6 files changed

+92
-73
lines changed

6 files changed

+92
-73
lines changed

src/backend/bootstrap/bootstrap.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.112 2001/07/16 05:06:57 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.113 2001/08/04 00:14:43 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -310,13 +310,15 @@ BootstrapMain(int argc, char *argv[])
310310
pqsignal(SIGINT, SIG_IGN); /* ignore query-cancel */
311311
pqsignal(SIGTERM, die);
312312
pqsignal(SIGQUIT, quickdie);
313+
pqsignal(SIGALRM, SIG_IGN);
314+
pqsignal(SIGPIPE, SIG_IGN);
313315
pqsignal(SIGUSR1, SIG_IGN);
314316
pqsignal(SIGUSR2, SIG_IGN);
315317

316318
/*
317319
* Reset some signals that are accepted by postmaster but not here
318320
*/
319-
pqsignal(SIGCHLD, SIG_IGN);
321+
pqsignal(SIGCHLD, SIG_DFL);
320322
pqsignal(SIGTTIN, SIG_DFL);
321323
pqsignal(SIGTTOU, SIG_DFL);
322324
pqsignal(SIGCONT, SIG_DFL);

src/backend/commands/dbcommands.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*
1010
*
1111
* IDENTIFICATION
12-
* $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.76 2001/07/02 20:50:46 tgl Exp $
12+
* $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.77 2001/08/04 00:14:43 tgl Exp $
1313
*
1414
*-------------------------------------------------------------------------
1515
*/
@@ -58,7 +58,6 @@ createdb(const char *dbname, const char *dbpath,
5858
char *target_dir;
5959
char src_loc[MAXPGPATH];
6060
char buf[2 * MAXPGPATH + 100];
61-
int ret;
6261
bool use_super,
6362
use_createdb;
6463
Oid src_dboid;
@@ -195,9 +194,7 @@ createdb(const char *dbname, const char *dbpath,
195194
/* Copy the template database to the new location */
196195
snprintf(buf, sizeof(buf), "cp -r '%s' '%s'", src_loc, target_dir);
197196

198-
ret = system(buf);
199-
/* Some versions of SunOS seem to return ECHILD after a system() call */
200-
if (ret != 0 && errno != ECHILD)
197+
if (system(buf) != 0)
201198
{
202199
if (remove_dbdirs(nominal_loc, alt_loc))
203200
elog(ERROR, "CREATE DATABASE: could not initialize database directory");
@@ -557,7 +554,7 @@ remove_dbdirs(const char *nominal_loc, const char *alt_loc)
557554

558555
snprintf(buf, sizeof(buf), "rm -rf '%s'", target_dir);
559556

560-
if (system(buf) != 0 && errno != ECHILD)
557+
if (system(buf) != 0)
561558
{
562559
elog(NOTICE, "database directory '%s' could not be removed",
563560
target_dir);

src/backend/postmaster/pgstat.c

Lines changed: 73 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -16,41 +16,41 @@
1616
*
1717
* Copyright (c) 2001, PostgreSQL Global Development Group
1818
*
19-
* $Id: pgstat.c,v 1.4 2001/07/05 15:19:40 wieck Exp $
19+
* $Header: /cvsroot/pgsql/src/backend/postmaster/pgstat.c,v 1.5 2001/08/04 00:14:43 tgl Exp $
2020
* ----------
2121
*/
2222
#include "postgres.h"
2323

2424
#include <unistd.h>
2525
#include <fcntl.h>
26-
2726
#include <sys/param.h>
2827
#include <sys/time.h>
2928
#include <sys/types.h>
3029
#include <sys/socket.h>
3130
#include <netinet/in.h>
3231
#include <arpa/inet.h>
33-
3432
#include <errno.h>
3533
#include <signal.h>
3634

35+
#include "access/xact.h"
36+
#include "access/heapam.h"
37+
#include "catalog/catname.h"
38+
#include "catalog/pg_shadow.h"
39+
#include "catalog/pg_database.h"
40+
#include "libpq/pqsignal.h"
3741
#include "miscadmin.h"
3842
#include "utils/memutils.h"
3943
#include "storage/backendid.h"
4044
#include "utils/rel.h"
4145
#include "utils/hsearch.h"
46+
#include "utils/ps_status.h"
4247
#include "utils/syscache.h"
43-
#include "access/xact.h"
44-
#include "access/heapam.h"
45-
#include "catalog/catname.h"
46-
#include "catalog/pg_shadow.h"
47-
#include "catalog/pg_database.h"
4848

4949
#include "pgstat.h"
5050

5151

5252
/* ----------
53-
* Global data
53+
* GUC parameters
5454
* ----------
5555
*/
5656
bool pgstat_collect_startcollector = true;
@@ -95,8 +95,8 @@ static char pgStat_fname[MAXPGPATH];
9595
* Local function forward declarations
9696
* ----------
9797
*/
98-
static void pgstat_main(void);
99-
static void pgstat_recvbuffer(void);
98+
static void pgstat_main(int real_argc, char *real_argv[]);
99+
static void pgstat_recvbuffer(int real_argc, char *real_argv[]);
100100

101101
static int pgstat_add_backend(PgStat_MsgHdr *msg);
102102
static void pgstat_sub_backend(int procpid);
@@ -227,11 +227,14 @@ pgstat_init(void)
227227
* pgstat_start() -
228228
*
229229
* Called from postmaster at startup or after an existing collector
230-
* died. Fire up a fresh statistics collector.
230+
* died. Fire up a fresh statistics collector.
231+
*
232+
* The process' original argc and argv are passed, because they are
233+
* needed by init_ps_display() on some platforms.
231234
* ----------
232235
*/
233236
int
234-
pgstat_start(void)
237+
pgstat_start(int real_argc, char *real_argv[])
235238
{
236239
/*
237240
* Do nothing if no collector needed
@@ -267,7 +270,8 @@ pgstat_start(void)
267270
return 0;
268271
}
269272

270-
pgstat_main();
273+
pgstat_main(real_argc, real_argv);
274+
271275
exit(0);
272276
}
273277

@@ -989,15 +993,6 @@ pgstat_fetch_stat_numbackends(void)
989993

990994

991995

992-
993-
994-
995-
996-
997-
998-
999-
1000-
1001996
/* ------------------------------------------------------------
1002997
* Local support functions follow
1003998
* ------------------------------------------------------------
@@ -1053,7 +1048,7 @@ pgstat_send(void *msg, int len)
10531048
* ----------
10541049
*/
10551050
static void
1056-
pgstat_main(void)
1051+
pgstat_main(int real_argc, char *real_argv[])
10571052
{
10581053
PgStat_Msg msg;
10591054
fd_set rfds;
@@ -1076,27 +1071,22 @@ pgstat_main(void)
10761071
/*
10771072
* Ignore all signals usually bound to some action in the postmaster
10781073
*/
1079-
signal(SIGHUP, SIG_IGN);
1080-
signal(SIGINT, SIG_IGN);
1081-
signal(SIGQUIT, SIG_IGN);
1082-
signal(SIGTERM, SIG_IGN);
1083-
signal(SIGALRM, SIG_IGN);
1084-
signal(SIGPIPE, SIG_IGN);
1085-
signal(SIGUSR1, SIG_IGN);
1086-
signal(SIGUSR2, SIG_IGN);
1087-
signal(SIGCHLD, SIG_IGN);
1088-
signal(SIGTTIN, SIG_IGN);
1089-
signal(SIGTTOU, SIG_IGN);
1090-
signal(SIGWINCH, SIG_IGN);
1091-
1092-
/*
1093-
* Write the initial status file right at startup
1094-
*/
1095-
gettimeofday(&next_statwrite, NULL);
1096-
need_statwrite = TRUE;
1097-
1098-
/*
1099-
* Now we start the buffer process to read from the socket, so
1074+
pqsignal(SIGHUP, SIG_IGN);
1075+
pqsignal(SIGINT, SIG_IGN);
1076+
pqsignal(SIGTERM, SIG_IGN);
1077+
pqsignal(SIGQUIT, SIG_IGN);
1078+
pqsignal(SIGALRM, SIG_IGN);
1079+
pqsignal(SIGPIPE, SIG_IGN);
1080+
pqsignal(SIGUSR1, SIG_IGN);
1081+
pqsignal(SIGUSR2, SIG_IGN);
1082+
pqsignal(SIGCHLD, SIG_DFL);
1083+
pqsignal(SIGTTIN, SIG_DFL);
1084+
pqsignal(SIGTTOU, SIG_DFL);
1085+
pqsignal(SIGCONT, SIG_DFL);
1086+
pqsignal(SIGWINCH, SIG_DFL);
1087+
1088+
/*
1089+
* Start a buffering subprocess to read from the socket, so
11001090
* we have a little more time to process incoming messages.
11011091
*/
11021092
if (pipe(pgStatPipe) < 0)
@@ -1107,19 +1097,38 @@ pgstat_main(void)
11071097

11081098
switch(fork())
11091099
{
1110-
case -1: perror("PGSTAT: fork(2)");
1111-
exit(1);
1100+
case -1:
1101+
perror("PGSTAT: fork(2)");
1102+
exit(1);
11121103

1113-
case 0: close(pgStatPipe[0]);
1114-
signal(SIGPIPE, SIG_DFL);
1115-
pgstat_recvbuffer();
1116-
exit(2);
1104+
case 0:
1105+
close(pgStatPipe[0]);
1106+
/* child process should die if can't pipe to parent collector */
1107+
pqsignal(SIGPIPE, SIG_DFL);
1108+
pgstat_recvbuffer(real_argc, real_argv);
1109+
exit(2);
11171110

1118-
default: close(pgStatPipe[1]);
1119-
close(pgStatSock);
1120-
break;
1111+
default:
1112+
close(pgStatPipe[1]);
1113+
close(pgStatSock);
1114+
break;
11211115
}
11221116

1117+
/*
1118+
* Identify myself via ps
1119+
*
1120+
* WARNING: On some platforms the environment will be moved around to
1121+
* make room for the ps display string.
1122+
*/
1123+
init_ps_display(real_argc, real_argv, "stats collector process", "", "");
1124+
set_ps_display("");
1125+
1126+
/*
1127+
* Arrange to write the initial status file right away
1128+
*/
1129+
gettimeofday(&next_statwrite, NULL);
1130+
need_statwrite = TRUE;
1131+
11231132
/*
11241133
* Read in an existing statistics stats file or initialize the
11251134
* stats to zero.
@@ -1358,7 +1367,7 @@ pgstat_main(void)
13581367
* ----------
13591368
*/
13601369
static void
1361-
pgstat_recvbuffer(void)
1370+
pgstat_recvbuffer(int real_argc, char *real_argv[])
13621371
{
13631372
fd_set rfds;
13641373
fd_set wfds;
@@ -1373,6 +1382,15 @@ pgstat_recvbuffer(void)
13731382
int fromlen;
13741383
int overflow = 0;
13751384

1385+
/*
1386+
* Identify myself via ps
1387+
*
1388+
* WARNING: On some platforms the environment will be moved around to
1389+
* make room for the ps display string.
1390+
*/
1391+
init_ps_display(real_argc, real_argv, "stats buffer process", "", "");
1392+
set_ps_display("");
1393+
13761394
/*
13771395
* Allocate the message buffer
13781396
*/

src/backend/postmaster/postmaster.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
*
3838
*
3939
* IDENTIFICATION
40-
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.233 2001/07/31 22:55:45 tgl Exp $
40+
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.234 2001/08/04 00:14:43 tgl Exp $
4141
*
4242
* NOTES
4343
*
@@ -696,7 +696,7 @@ PostmasterMain(int argc, char *argv[])
696696
*/
697697
if (pgstat_init() < 0)
698698
ExitPostmaster(1);
699-
if (pgstat_start() < 0)
699+
if (pgstat_start(real_argc, real_argv) < 0)
700700
ExitPostmaster(1);
701701

702702
/*
@@ -1488,7 +1488,7 @@ reaper(SIGNAL_ARGS)
14881488
{
14891489
fprintf(stderr, "%s: Performance collector exited with status %d\n",
14901490
progname, exitstatus);
1491-
pgstat_start();
1491+
pgstat_start(real_argc, real_argv);
14921492
continue;
14931493
}
14941494

src/backend/tcop/postgres.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.229 2001/07/31 22:55:45 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.230 2001/08/04 00:14:43 tgl Exp $
1212
*
1313
* NOTES
1414
* this is the "main" module of the postgres backend and
@@ -1102,7 +1102,9 @@ usage(char *progname)
11021102
* ----------------------------------------------------------------
11031103
*/
11041104
int
1105-
PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const char *username)
1105+
PostgresMain(int argc, char *argv[],
1106+
int real_argc, char *real_argv[],
1107+
const char *username)
11061108
{
11071109
int flag;
11081110

@@ -1535,15 +1537,15 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha
15351537
*/
15361538
pqsignal(SIGPIPE, SIG_IGN);
15371539
pqsignal(SIGUSR1, SIG_IGN); /* this signal available for use */
1540+
15381541
pqsignal(SIGUSR2, Async_NotifyHandler); /* flush also sinval cache */
15391542
pqsignal(SIGFPE, FloatExceptionHandler);
1540-
pqsignal(SIGCHLD, SIG_IGN); /* ignored (may get this in system()
1541-
* calls) */
15421543

15431544
/*
15441545
* Reset some signals that are accepted by postmaster but not by
15451546
* backend
15461547
*/
1548+
pqsignal(SIGCHLD, SIG_DFL); /* system() requires this on some platforms */
15471549
pqsignal(SIGTTIN, SIG_DFL);
15481550
pqsignal(SIGTTOU, SIG_DFL);
15491551
pqsignal(SIGCONT, SIG_DFL);
@@ -1711,7 +1713,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha
17111713
if (!IsUnderPostmaster)
17121714
{
17131715
puts("\nPOSTGRES backend interactive interface ");
1714-
puts("$Revision: 1.229 $ $Date: 2001/07/31 22:55:45 $\n");
1716+
puts("$Revision: 1.230 $ $Date: 2001/08/04 00:14:43 $\n");
17151717
}
17161718

17171719
/*

src/include/pgstat.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*
66
* Copyright (c) 2001, PostgreSQL Global Development Group
77
*
8-
* $Id: pgstat.h,v 1.4 2001/07/05 15:19:40 wieck Exp $
8+
* $Id: pgstat.h,v 1.5 2001/08/04 00:14:43 tgl Exp $
99
* ----------
1010
*/
1111
#ifndef PGSTAT_H
@@ -336,7 +336,7 @@ extern bool pgstat_collect_blocklevel;
336336
* ----------
337337
*/
338338
extern int pgstat_init(void);
339-
extern int pgstat_start(void);
339+
extern int pgstat_start(int real_argc, char *real_argv[]);
340340
extern int pgstat_ispgstat(int pid);
341341
extern void pgstat_beterm(int pid);
342342

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