@@ -62,6 +62,7 @@ typedef enum
62
62
START_COMMAND ,
63
63
STOP_COMMAND ,
64
64
RESTART_COMMAND ,
65
+ PROMOTE_COMMAND ,
65
66
RELOAD_COMMAND ,
66
67
STATUS_COMMAND ,
67
68
KILL_COMMAND ,
@@ -96,6 +97,7 @@ static char postopts_file[MAXPGPATH];
96
97
static char pid_file [MAXPGPATH ];
97
98
static char backup_file [MAXPGPATH ];
98
99
static char recovery_file [MAXPGPATH ];
100
+ static char promote_file [MAXPGPATH ];
99
101
100
102
#if defined(WIN32 ) || defined(__CYGWIN__ )
101
103
static DWORD pgctl_start_type = SERVICE_AUTO_START ;
@@ -124,6 +126,7 @@ static void do_init(void);
124
126
static void do_start (void );
125
127
static void do_stop (void );
126
128
static void do_restart (void );
129
+ static void do_promote (void );
127
130
static void do_reload (void );
128
131
static void do_status (void );
129
132
static void do_kill (pgpid_t pid );
@@ -872,7 +875,7 @@ do_stop(void)
872
875
873
876
874
877
/*
875
- * restart/reload routines
878
+ * restart/promote/ reload routines
876
879
*/
877
880
878
881
static void
@@ -965,6 +968,66 @@ do_restart(void)
965
968
do_start ();
966
969
}
967
970
971
+ static void
972
+ do_promote (void )
973
+ {
974
+ FILE * prmfile ;
975
+ pgpid_t pid ;
976
+ struct stat statbuf ;
977
+
978
+ pid = get_pgpid ();
979
+
980
+ if (pid == 0 ) /* no pid file */
981
+ {
982
+ write_stderr (_ ("%s: PID file \"%s\" does not exist\n" ), progname , pid_file );
983
+ write_stderr (_ ("Is server running?\n" ));
984
+ exit (1 );
985
+ }
986
+ else if (pid < 0 ) /* standalone backend, not postmaster */
987
+ {
988
+ pid = - pid ;
989
+ write_stderr (_ ("%s: cannot promote server; "
990
+ "single-user server is running (PID: %ld)\n" ),
991
+ progname , pid );
992
+ exit (1 );
993
+ }
994
+
995
+ /* If recovery.conf doesn't exist, the server is not in standby mode */
996
+ if (stat (recovery_file , & statbuf ) != 0 )
997
+ {
998
+ write_stderr (_ ("%s: cannot promote server; "
999
+ "server is not in standby mode\n" ),
1000
+ progname );
1001
+ exit (1 );
1002
+ }
1003
+
1004
+ if ((prmfile = fopen (promote_file , "w" )) == NULL )
1005
+ {
1006
+ write_stderr (_ ("%s: could not create promote signal file \"%s\": %s\n" ),
1007
+ progname , promote_file , strerror (errno ));
1008
+ exit (1 );
1009
+ }
1010
+ if (fclose (prmfile ))
1011
+ {
1012
+ write_stderr (_ ("%s: could not write promote signal file \"%s\": %s\n" ),
1013
+ progname , promote_file , strerror (errno ));
1014
+ exit (1 );
1015
+ }
1016
+
1017
+ sig = SIGUSR1 ;
1018
+ if (kill ((pid_t ) pid , sig ) != 0 )
1019
+ {
1020
+ write_stderr (_ ("%s: could not send promote signal (PID: %ld): %s\n" ),
1021
+ progname , pid , strerror (errno ));
1022
+ if (unlink (promote_file ) != 0 )
1023
+ write_stderr (_ ("%s: could not remove promote signal file \"%s\": %s\n" ),
1024
+ progname , promote_file , strerror (errno ));
1025
+ exit (1 );
1026
+ }
1027
+
1028
+ print_msg (_ ("server promoting\n" ));
1029
+ }
1030
+
968
1031
969
1032
static void
970
1033
do_reload (void )
@@ -1617,14 +1680,15 @@ do_advice(void)
1617
1680
static void
1618
1681
do_help (void )
1619
1682
{
1620
- printf (_ ("%s is a utility to start, stop, restart, reload configuration files,\n"
1683
+ printf (_ ("%s is a utility to start, stop, restart, promote, reload configuration files,\n"
1621
1684
"report the status of a PostgreSQL server, or signal a PostgreSQL process.\n\n" ), progname );
1622
1685
printf (_ ("Usage:\n" ));
1623
1686
printf (_ (" %s init[db] [-D DATADIR] [-s] [-o \"OPTIONS\"]\n" ), progname );
1624
1687
printf (_ (" %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n" ), progname );
1625
1688
printf (_ (" %s stop [-W] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n" ), progname );
1626
1689
printf (_ (" %s restart [-w] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n"
1627
1690
" [-o \"OPTIONS\"]\n" ), progname );
1691
+ printf (_ (" %s promote [-D DATADIR] [-s]\n" ), progname );
1628
1692
printf (_ (" %s reload [-D DATADIR] [-s]\n" ), progname );
1629
1693
printf (_ (" %s status [-D DATADIR]\n" ), progname );
1630
1694
printf (_ (" %s kill SIGNALNAME PID\n" ), progname );
@@ -1950,6 +2014,8 @@ main(int argc, char **argv)
1950
2014
ctl_command = STOP_COMMAND ;
1951
2015
else if (strcmp (argv [optind ], "restart" ) == 0 )
1952
2016
ctl_command = RESTART_COMMAND ;
2017
+ else if (strcmp (argv [optind ], "promote" ) == 0 )
2018
+ ctl_command = PROMOTE_COMMAND ;
1953
2019
else if (strcmp (argv [optind ], "reload" ) == 0 )
1954
2020
ctl_command = RELOAD_COMMAND ;
1955
2021
else if (strcmp (argv [optind ], "status" ) == 0 )
@@ -2036,6 +2102,7 @@ main(int argc, char **argv)
2036
2102
snprintf (pid_file , MAXPGPATH , "%s /postmaster .pid ", pg_data );
2037
2103
snprintf (backup_file , MAXPGPATH , "%s /backup_label ", pg_data );
2038
2104
snprintf (recovery_file , MAXPGPATH , "%s /recovery .conf ", pg_data );
2105
+ snprintf (promote_file , MAXPGPATH , "%s /promote ", pg_data );
2039
2106
}
2040
2107
2041
2108
switch (ctl_command )
@@ -2055,6 +2122,9 @@ main(int argc, char **argv)
2055
2122
case RESTART_COMMAND :
2056
2123
do_restart ();
2057
2124
break ;
2125
+ case PROMOTE_COMMAND :
2126
+ do_promote ();
2127
+ break ;
2058
2128
case RELOAD_COMMAND :
2059
2129
do_reload ();
2060
2130
break ;
0 commit comments