Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitaafc05d

Browse files
committed
Refactor postmaster child process launching
Introduce new postmaster_child_launch() function that deals with thedifferences in EXEC_BACKEND mode.Refactor the mechanism of passing information from the parent to childprocess. Instead of using different command-line arguments whenlaunching the child process in EXEC_BACKEND mode, pass avariable-length blob of startup data along with all the globalvariables. The contents of that blob depend on the kind of childprocess being launched. In !EXEC_BACKEND mode, we use the same blob,but it's simply inherited from the parent to child process.Reviewed-by: Tristan Partin, Andres FreundDiscussion:https://www.postgresql.org/message-id/7a59b073-5b5b-151e-7ed3-8b01ff7ce9ef@iki.fi
1 parentf1baed1 commitaafc05d

28 files changed

+656
-988
lines changed

‎src/backend/postmaster/autovacuum.c

Lines changed: 19 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@
8585
#include"nodes/makefuncs.h"
8686
#include"pgstat.h"
8787
#include"postmaster/autovacuum.h"
88-
#include"postmaster/fork_process.h"
8988
#include"postmaster/interrupt.h"
9089
#include"postmaster/postmaster.h"
9190
#include"storage/bufmgr.h"
@@ -311,13 +310,6 @@ static WorkerInfo MyWorkerInfo = NULL;
311310
/* PID of launcher, valid only in worker while shutting down */
312311
intAutovacuumLauncherPid=0;
313312

314-
#ifdefEXEC_BACKEND
315-
staticpid_tavlauncher_forkexec(void);
316-
staticpid_tavworker_forkexec(void);
317-
#endif
318-
NON_EXEC_STATICvoidAutoVacWorkerMain(intargc,char*argv[])pg_attribute_noreturn();
319-
NON_EXEC_STATICvoidAutoVacLauncherMain(intargc,char*argv[])pg_attribute_noreturn();
320-
321313
staticOiddo_start_worker(void);
322314
staticvoidHandleAutoVacLauncherInterrupts(void);
323315
staticvoidAutoVacLauncherShutdown(void)pg_attribute_noreturn();
@@ -361,76 +353,23 @@ static void avl_sigusr2_handler(SIGNAL_ARGS);
361353
* AUTOVACUUM LAUNCHER CODE
362354
********************************************************************/
363355

364-
#ifdefEXEC_BACKEND
365356
/*
366-
* forkexec routine for the autovacuum launcher process.
367-
*
368-
* Format up the arglist, then fork and exec.
357+
* Main entry point for the autovacuum launcher process.
369358
*/
370-
staticpid_t
371-
avlauncher_forkexec(void)
359+
void
360+
AutoVacLauncherMain(char*startup_data,size_tstartup_data_len)
372361
{
373-
char*av[10];
374-
intac=0;
375-
376-
av[ac++]="postgres";
377-
av[ac++]="--forkavlauncher";
378-
av[ac++]=NULL;/* filled in by postmaster_forkexec */
379-
av[ac]=NULL;
380-
381-
Assert(ac<lengthof(av));
382-
383-
returnpostmaster_forkexec(ac,av);
384-
}
385-
#endif
362+
sigjmp_buflocal_sigjmp_buf;
386363

387-
/*
388-
* Main entry point for autovacuum launcher process, to be called from the
389-
* postmaster.
390-
*/
391-
int
392-
StartAutoVacLauncher(void)
393-
{
394-
pid_tAutoVacPID;
364+
Assert(startup_data_len==0);
395365

396-
#ifdefEXEC_BACKEND
397-
switch ((AutoVacPID=avlauncher_forkexec()))
398-
#else
399-
switch ((AutoVacPID=fork_process()))
400-
#endif
366+
/* Release postmaster's working memory context */
367+
if (PostmasterContext)
401368
{
402-
case-1:
403-
ereport(LOG,
404-
(errmsg("could not fork autovacuum launcher process: %m")));
405-
return0;
406-
407-
#ifndefEXEC_BACKEND
408-
case0:
409-
/* in postmaster child ... */
410-
InitPostmasterChild();
411-
412-
/* Close the postmaster's sockets */
413-
ClosePostmasterPorts(false);
414-
415-
AutoVacLauncherMain(0,NULL);
416-
break;
417-
#endif
418-
default:
419-
return (int)AutoVacPID;
369+
MemoryContextDelete(PostmasterContext);
370+
PostmasterContext=NULL;
420371
}
421372

422-
/* shouldn't get here */
423-
return0;
424-
}
425-
426-
/*
427-
* Main loop for the autovacuum launcher process.
428-
*/
429-
NON_EXEC_STATICvoid
430-
AutoVacLauncherMain(intargc,char*argv[])
431-
{
432-
sigjmp_buflocal_sigjmp_buf;
433-
434373
MyBackendType=B_AUTOVAC_LAUNCHER;
435374
init_ps_display(NULL);
436375

@@ -1412,78 +1351,24 @@ avl_sigusr2_handler(SIGNAL_ARGS)
14121351
* AUTOVACUUM WORKER CODE
14131352
********************************************************************/
14141353

1415-
#ifdefEXEC_BACKEND
14161354
/*
1417-
* forkexec routines for the autovacuum worker.
1418-
*
1419-
* Format up the arglist, then fork and exec.
1355+
* Main entry point for autovacuum worker processes.
14201356
*/
1421-
staticpid_t
1422-
avworker_forkexec(void)
1357+
void
1358+
AutoVacWorkerMain(char*startup_data,size_tstartup_data_len)
14231359
{
1424-
char*av[10];
1425-
intac=0;
1426-
1427-
av[ac++]="postgres";
1428-
av[ac++]="--forkavworker";
1429-
av[ac++]=NULL;/* filled in by postmaster_forkexec */
1430-
av[ac]=NULL;
1431-
1432-
Assert(ac<lengthof(av));
1433-
1434-
returnpostmaster_forkexec(ac,av);
1435-
}
1436-
#endif
1360+
sigjmp_buflocal_sigjmp_buf;
1361+
Oiddbid;
14371362

1438-
/*
1439-
* Main entry point for autovacuum worker process.
1440-
*
1441-
* This code is heavily based on pgarch.c, q.v.
1442-
*/
1443-
int
1444-
StartAutoVacWorker(void)
1445-
{
1446-
pid_tworker_pid;
1363+
Assert(startup_data_len==0);
14471364

1448-
#ifdefEXEC_BACKEND
1449-
switch ((worker_pid=avworker_forkexec()))
1450-
#else
1451-
switch ((worker_pid=fork_process()))
1452-
#endif
1365+
/* Release postmaster's working memory context */
1366+
if (PostmasterContext)
14531367
{
1454-
case-1:
1455-
ereport(LOG,
1456-
(errmsg("could not fork autovacuum worker process: %m")));
1457-
return0;
1458-
1459-
#ifndefEXEC_BACKEND
1460-
case0:
1461-
/* in postmaster child ... */
1462-
InitPostmasterChild();
1463-
1464-
/* Close the postmaster's sockets */
1465-
ClosePostmasterPorts(false);
1466-
1467-
AutoVacWorkerMain(0,NULL);
1468-
break;
1469-
#endif
1470-
default:
1471-
return (int)worker_pid;
1368+
MemoryContextDelete(PostmasterContext);
1369+
PostmasterContext=NULL;
14721370
}
14731371

1474-
/* shouldn't get here */
1475-
return0;
1476-
}
1477-
1478-
/*
1479-
* AutoVacWorkerMain
1480-
*/
1481-
NON_EXEC_STATICvoid
1482-
AutoVacWorkerMain(intargc,char*argv[])
1483-
{
1484-
sigjmp_buflocal_sigjmp_buf;
1485-
Oiddbid;
1486-
14871372
MyBackendType=B_AUTOVAC_WORKER;
14881373
init_ps_display(NULL);
14891374

‎src/backend/postmaster/auxprocess.c

Lines changed: 11 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -27,26 +27,30 @@
2727
#include"storage/ipc.h"
2828
#include"storage/proc.h"
2929
#include"storage/procsignal.h"
30+
#include"utils/memutils.h"
3031
#include"utils/ps_status.h"
3132

3233

3334
staticvoidShutdownAuxiliaryProcess(intcode,Datumarg);
3435

3536

3637
/*
37-
*AuxiliaryProcessMain
38+
*AuxiliaryProcessMainCommon
3839
*
39-
* The main entry point for auxiliary processes, such as the bgwriter,
40-
* walwriter, walreceiver, bootstrapper and the shared memory checker code.
41-
*
42-
* This code is here just because of historical reasons.
40+
* Common initialization code for auxiliary processes, such as the bgwriter,
41+
* walwriter, walreceiver, and the startup process.
4342
*/
4443
void
45-
AuxiliaryProcessMain(BackendTypeauxtype)
44+
AuxiliaryProcessMainCommon(void)
4645
{
4746
Assert(IsUnderPostmaster);
4847

49-
MyBackendType=auxtype;
48+
/* Release postmaster's working memory context */
49+
if (PostmasterContext)
50+
{
51+
MemoryContextDelete(PostmasterContext);
52+
PostmasterContext=NULL;
53+
}
5054

5155
init_ps_display(NULL);
5256

@@ -84,41 +88,6 @@ AuxiliaryProcessMain(BackendType auxtype)
8488
before_shmem_exit(ShutdownAuxiliaryProcess,0);
8589

8690
SetProcessingMode(NormalProcessing);
87-
88-
switch (MyBackendType)
89-
{
90-
caseB_STARTUP:
91-
StartupProcessMain();
92-
proc_exit(1);
93-
94-
caseB_ARCHIVER:
95-
PgArchiverMain();
96-
proc_exit(1);
97-
98-
caseB_BG_WRITER:
99-
BackgroundWriterMain();
100-
proc_exit(1);
101-
102-
caseB_CHECKPOINTER:
103-
CheckpointerMain();
104-
proc_exit(1);
105-
106-
caseB_WAL_WRITER:
107-
WalWriterMain();
108-
proc_exit(1);
109-
110-
caseB_WAL_RECEIVER:
111-
WalReceiverMain();
112-
proc_exit(1);
113-
114-
caseB_WAL_SUMMARIZER:
115-
WalSummarizerMain();
116-
proc_exit(1);
117-
118-
default:
119-
elog(PANIC,"unrecognized process type: %d", (int)MyBackendType);
120-
proc_exit(1);
121-
}
12291
}
12392

12493
/*

‎src/backend/postmaster/bgworker.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -720,15 +720,29 @@ bgworker_die(SIGNAL_ARGS)
720720
* Main entry point for background worker processes.
721721
*/
722722
void
723-
BackgroundWorkerMain(void)
723+
BackgroundWorkerMain(char*startup_data,size_tstartup_data_len)
724724
{
725725
sigjmp_buflocal_sigjmp_buf;
726-
BackgroundWorker*worker=MyBgworkerEntry;
726+
BackgroundWorker*worker;
727727
bgworker_main_typeentrypt;
728728

729-
if (worker==NULL)
729+
if (startup_data==NULL)
730730
elog(FATAL,"unable to find bgworker entry");
731+
Assert(startup_data_len==sizeof(BackgroundWorker));
732+
worker=MemoryContextAlloc(TopMemoryContext,sizeof(BackgroundWorker));
733+
memcpy(worker,startup_data,sizeof(BackgroundWorker));
731734

735+
/*
736+
* Now that we're done reading the startup data, release postmaster's
737+
* working memory context.
738+
*/
739+
if (PostmasterContext)
740+
{
741+
MemoryContextDelete(PostmasterContext);
742+
PostmasterContext=NULL;
743+
}
744+
745+
MyBgworkerEntry=worker;
732746
MyBackendType=B_BG_WORKER;
733747
init_ps_display(worker->bgw_name);
734748

‎src/backend/postmaster/bgwriter.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include"libpq/pqsignal.h"
3636
#include"miscadmin.h"
3737
#include"pgstat.h"
38+
#include"postmaster/auxprocess.h"
3839
#include"postmaster/bgwriter.h"
3940
#include"postmaster/interrupt.h"
4041
#include"storage/buf_internals.h"
@@ -83,13 +84,18 @@ static XLogRecPtr last_snapshot_lsn = InvalidXLogRecPtr;
8384
* basic execution environment, but not enabled signals yet.
8485
*/
8586
void
86-
BackgroundWriterMain(void)
87+
BackgroundWriterMain(char*startup_data,size_tstartup_data_len)
8788
{
8889
sigjmp_buflocal_sigjmp_buf;
8990
MemoryContextbgwriter_context;
9091
boolprev_hibernate;
9192
WritebackContextwb_context;
9293

94+
Assert(startup_data_len==0);
95+
96+
MyBackendType=B_BG_WRITER;
97+
AuxiliaryProcessMainCommon();
98+
9399
/*
94100
* Properly accept or ignore signals that might be sent to us.
95101
*/

‎src/backend/postmaster/checkpointer.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include"libpq/pqsignal.h"
4343
#include"miscadmin.h"
4444
#include"pgstat.h"
45+
#include"postmaster/auxprocess.h"
4546
#include"postmaster/bgwriter.h"
4647
#include"postmaster/interrupt.h"
4748
#include"replication/syncrep.h"
@@ -169,11 +170,16 @@ static void ReqCheckpointHandler(SIGNAL_ARGS);
169170
* basic execution environment, but not enabled signals yet.
170171
*/
171172
void
172-
CheckpointerMain(void)
173+
CheckpointerMain(char*startup_data,size_tstartup_data_len)
173174
{
174175
sigjmp_buflocal_sigjmp_buf;
175176
MemoryContextcheckpointer_context;
176177

178+
Assert(startup_data_len==0);
179+
180+
MyBackendType=B_CHECKPOINTER;
181+
AuxiliaryProcessMainCommon();
182+
177183
CheckpointerShmem->checkpointer_pid=MyProcPid;
178184

179185
/*

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp