git.postgresql.org Git - postgresql.git/commitdiff

git projects / postgresql.git / commitdiff
? search:
summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: ee7769b)
Move the responsibility for calling StartupXLOG into InitPostgres, for
2010年4月20日 01:38:52 +0000 (01:38 +0000)
2010年4月20日 01:38:52 +0000 (01:38 +0000)
those process types that go through InitPostgres; in particular, bootstrap
and standalone-backend cases. This ensures that we have set up a PGPROC
and done some other basic initialization steps (corresponding to the
if (IsUnderPostmaster) block in AuxiliaryProcessMain) before we attempt to
run WAL recovery in a standalone backend. As was discovered last September,
this is necessary for some corner-case code paths during WAL recovery,
particularly end-of-WAL cleanup.

Moving the bootstrap case here too is not necessary for correctness, but it
seems like a good idea since it reduces the number of distinct code paths.


diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index a9c5d1fd53b631ec9fecaf48900918cf249a0f7c..080d80e296b7b8276f193c648e254e7c6d0dbb1d 100644 (file)
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.260 2010年02月26日 02:00:35 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.261 2010年04月20日 01:38:52 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -397,14 +397,13 @@ AuxiliaryProcessMain(int argc, char *argv[])
switch (auxType)
{
case CheckerProcess:
- bootstrap_signals();
+ /* don't set signals, they're useless here */
CheckerModeMain();
proc_exit(1); /* should never return */
case BootstrapProcess:
bootstrap_signals();
BootStrapXLOG();
- StartupXLOG();
BootstrapModeMain();
proc_exit(1); /* should never return */
@@ -438,23 +437,12 @@ AuxiliaryProcessMain(int argc, char *argv[])
/*
* In shared memory checker mode, all we really want to do is create shared
* memory and semaphores (just to prove we can do it with the current GUC
- * settings).
+ * settings). Since, in fact, that was already done by BaseInit(),
+ * we have nothing more to do here.
*/
static void
CheckerModeMain(void)
{
- /*
- * We must be getting invoked for bootstrap mode
- */
- Assert(!IsUnderPostmaster);
-
- SetProcessingMode(BootstrapProcessing);
-
- /*
- * Do backend-like initialization for bootstrap mode
- */
- InitProcess();
- InitPostgres(NULL, InvalidOid, NULL, NULL);
proc_exit(0);
}
@@ -478,6 +466,7 @@ BootstrapModeMain(void)
* Do backend-like initialization for bootstrap mode
*/
InitProcess();
+
InitPostgres(NULL, InvalidOid, NULL, NULL);
/* Initialize stuff for bootstrap-file processing */
@@ -498,10 +487,6 @@ BootstrapModeMain(void)
*/
RelationMapFinishBootstrap();
- /* Perform a checkpoint to ensure everything's down to disk */
- SetProcessingMode(NormalProcessing);
- CreateCheckPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);
-
/* Clean up and exit */
cleanup();
proc_exit(0);
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 287445b535e4f9411b108478b11673c398bc3c69..b1d700a97e40e9fed1e6c010848e98a6848f553b 100644 (file)
--- 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.592 2010年03月21日 00:17:58 petere Exp $
+ * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.593 2010年04月20日 01:38:52 tgl Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@@ -3531,11 +3531,7 @@ PostgresMain(int argc, char *argv[], const char *username)
PG_SETMASK(&BlockSig); /* block everything except SIGQUIT */
- if (IsUnderPostmaster)
- {
- BaseInit();
- }
- else
+ if (!IsUnderPostmaster)
{
/*
* Validate we have been given a reasonable-looking DataDir (if under
@@ -3551,17 +3547,11 @@ PostgresMain(int argc, char *argv[], const char *username)
* Create lockfile for data directory.
*/
CreateDataDirLockFile(false);
-
- BaseInit();
-
- /*
- * Start up xlog for standalone backend, and register to have it
- * closed down at exit.
- */
- StartupXLOG();
- on_shmem_exit(ShutdownXLOG, 0);
}
+ /* Early initialization */
+ BaseInit();
+
/*
* Create a per-backend PGPROC struct in shared memory, except in the
* EXEC_BACKEND case where this was done in SubPostmasterMain. We must do
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index afd4bc65b273b30264266fc38d040b785f1c7a45..5be80b8f6892202025b7d61371a30e84fe35cd99 100644 (file)
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.208 2010年03月25日 20:40:17 sriggs Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.209 2010年04月20日 01:38:52 tgl Exp $
*
*
*-------------------------------------------------------------------------
@@ -427,11 +427,9 @@ pg_split_opts(char **argv, int *argcp, char *optstr)
* Early initialization of a backend (either standalone or under postmaster).
* This happens even before InitPostgres.
*
- * If you're wondering why this is separate from InitPostgres at all:
- * the critical distinction is that this stuff has to happen before we can
- * run XLOG-related initialization, which is done before InitPostgres --- in
- * fact, for cases such as the background writer process, InitPostgres may
- * never be done at all.
+ * This is separate from InitPostgres because it is also called by auxiliary
+ * processes, such as the background writer process, which may not call
+ * InitPostgres at all.
*/
void
BaseInit(void)
@@ -512,11 +510,28 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username,
InitBufferPoolBackend();
/*
- * Initialize local process's access to XLOG, if appropriate. In
- * bootstrap case we skip this since StartupXLOG() was run instead.
+ * Initialize local process's access to XLOG.
*/
- if (!bootstrap)
+ if (IsUnderPostmaster)
+ {
+ /*
+ * The postmaster already started the XLOG machinery, but we need
+ * to call InitXLOGAccess(), if the system isn't in hot-standby mode.
+ * This is handled by calling RecoveryInProgress and ignoring the
+ * result.
+ */
(void) RecoveryInProgress();
+ }
+ else
+ {
+ /*
+ * We are either a bootstrap process or a standalone backend.
+ * Either way, start up the XLOG machinery, and register to have it
+ * closed down at exit.
+ */
+ StartupXLOG();
+ on_shmem_exit(ShutdownXLOG, 0);
+ }
/*
* Initialize the relation cache and the system catalog caches. Note that
This is the main PostgreSQL git repository.
RSS Atom

AltStyle によって変換されたページ (->オリジナル) /