@@ -511,6 +511,7 @@ typedef struct
511511 bool IsBinaryUpgrade ;
512512 int max_safe_fds ;
513513 int MaxBackends ;
514+ void * BackgroundWorkers ;
514515#ifdef WIN32
515516 HANDLE PostmasterHandle ;
516517 HANDLE initial_signal_pipe ;
@@ -563,10 +564,16 @@ HANDLE PostmasterHandle;
563564static void
564565UpgradePostgres (void )
565566{
567+ #ifdef EXEC_BACKEND
566568 char * PostmasterArgs [] = {"/home/knizhnik/postgresql/dist/bin/postgres" , "-U" , "-D" , "." ,NULL };
567569 BackendParameters param ;
568570 FILE * fp ;
569571
572+ IsOnlineUpgrade = true;
573+ TerminateChildren (SIGTERM );
574+ if (CheckpointerPID != 0 )
575+ signal_child (CheckpointerPID , SIGUSR2 );
576+
570577 if (!save_backend_variables (& param , NULL ))
571578 return ; /* log made by save_backend_variables */
572579
@@ -600,8 +607,27 @@ UpgradePostgres(void)
600607
601608 elog (LOG , "Upgrade postgres" );
602609 execv (PostmasterArgs [0 ], PostmasterArgs );
610+ #else
611+ elog (LOG , "Online upgrade is possible only postgres configured with EXEC_BACKEND" );
612+ #endif
613+ }
614+
615+
616+ static void
617+ RestoreBackendList (void )
618+ {
619+ #ifdef EXEC_BACKEND
620+ int i ;
621+ for (i = MaxLivePostmasterChildren () - 1 ; i >= 0 ; i -- )
622+ {
623+ Backend * bp = (Backend * ) & ShmemBackendArray [i ];
624+ if (bp -> bkend_type == BACKEND_TYPE_NORMAL )
625+ dlist_push_head (& BackendList , & bp -> elem );
626+ }
627+ #endif
603628}
604629
630+
605631/*
606632 * Postmaster main entry point
607633 */
@@ -900,8 +926,10 @@ PostmasterMain(int argc, char *argv[])
900926 }
901927
902928 if (IsOnlineUpgrade )
929+ {
903930 read_backend_variables ("postmaster.params" , NULL );
904-
931+ RegisterUnlinkLockFileCallback ();
932+ }
905933
906934 /*
907935 * Locate the proper configuration files and data directory, and read
@@ -1038,20 +1066,23 @@ PostmasterMain(int argc, char *argv[])
10381066 */
10391067 process_shared_preload_libraries ();
10401068
1041- /*
1042- * Now that loadable modules have had their chance to register background
1043- * workers, calculate MaxBackends.
1044- */
1045- if (!IsOnlineUpgrade )
1046- InitializeMaxBackends ();
1047-
10481069 /*
10491070 * Set up shared memory and semaphores.
10501071 */
10511072 if (IsOnlineUpgrade )
1073+ {
10521074 PGSharedMemoryReAttach ();
1075+ RestoreBackendList ();
1076+ }
10531077 else
1078+ {
1079+ /*
1080+ * Now that loadable modules have had their chance to register background
1081+ * workers, calculate MaxBackends.
1082+ */
1083+ InitializeMaxBackends ();
10541084 reset_shared ();
1085+ }
10551086
10561087 /*
10571088 * Estimate number of openable files. This must happen after setting up
@@ -1435,10 +1466,18 @@ PostmasterMain(int argc, char *argv[])
14351466 /*
14361467 * We're ready to rock and roll...
14371468 */
1438- StartupPID = StartupDataBase ();
1439- Assert (StartupPID != 0 );
1440- StartupStatus = STARTUP_RUNNING ;
1441- pmState = PM_STARTUP ;
1469+ if (!IsOnlineUpgrade )
1470+ {
1471+ StartupPID = StartupDataBase ();
1472+ Assert (StartupPID != 0 );
1473+ StartupStatus = STARTUP_RUNNING ;
1474+ pmState = PM_STARTUP ;
1475+ }
1476+ else
1477+ {
1478+ BackgroundWorkerShmemAttach ();
1479+ pmState = PM_RUN ;
1480+ }
14421481
14431482 /* Some workers may be scheduled to start now */
14441483 maybe_start_bgworkers ();
@@ -1696,6 +1735,7 @@ ServerLoop(void)
16961735 last_lockfile_recheck_time = last_touch_time = time (NULL );
16971736
16981737 nSockets = initMasks (& readmask );
1738+ IsOnlineUpgrade = false;
16991739
17001740 for (;;)
17011741 {
@@ -4103,7 +4143,10 @@ SignalSomeChildren(int signal, int target)
41034143static void
41044144TerminateChildren (int signal )
41054145{
4106- SignalChildren (signal );
4146+ if (IsOnlineUpgrade )
4147+ SignalSomeChildren (signal , BACKEND_TYPE_WALSND | BACKEND_TYPE_WORKER );
4148+ else
4149+ SignalChildren (signal );
41074150 if (StartupPID != 0 )
41084151 {
41094152 signal_child (StartupPID , signal );
@@ -6180,6 +6223,7 @@ save_backend_variables(BackendParameters *param, Port *port,
61806223 param -> PgStartTime = PgStartTime ;
61816224 param -> PgReloadTime = PgReloadTime ;
61826225 param -> first_syslogger_file_time = first_syslogger_file_time ;
6226+ param -> BackgroundWorkers = GetBackgroundWorkerEntries ();
61836227
61846228 param -> redirection_done = redirection_done ;
61856229 param -> IsBinaryUpgrade = IsBinaryUpgrade ;
@@ -6417,6 +6461,7 @@ restore_backend_variables(BackendParameters *param, Port *port)
64176461 PgStartTime = param -> PgStartTime ;
64186462 PgReloadTime = param -> PgReloadTime ;
64196463 first_syslogger_file_time = param -> first_syslogger_file_time ;
6464+ SetBackgroundWorkerEntries (param -> BackgroundWorkers );
64206465
64216466 redirection_done = param -> redirection_done ;
64226467 IsBinaryUpgrade = param -> IsBinaryUpgrade ;
0 commit comments