mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-22 22:56:29 +00:00
repmgrd: create pid file by default
Traditionally repmgrd will only write a pidfile if explicitly requested with -p/--pid-file. However it's normally desirable to have a pidfile, and it's preferable to have one used by default to prevent accidentally starting a second repmgrd instance. Following changes made: - add configuration file parameter "repmgrd_pid_file" (initially overridden by -p/--pid-file for backwards compatibility, though eventually we'll want to drop -p/--pid-file altogether) - add command line option --no-pid-file - if neither "repmgrd_pid_file" nor -p/--pid-file is set, create the pid file in a temporary directory Implements GitHub #457.
This commit is contained in:
@@ -359,6 +359,7 @@ _parse_config(t_configuration_options *options, ItemList *error_list, ItemList *
|
|||||||
options->async_query_timeout = DEFAULT_ASYNC_QUERY_TIMEOUT;
|
options->async_query_timeout = DEFAULT_ASYNC_QUERY_TIMEOUT;
|
||||||
options->primary_notification_timeout = DEFAULT_PRIMARY_NOTIFICATION_TIMEOUT;
|
options->primary_notification_timeout = DEFAULT_PRIMARY_NOTIFICATION_TIMEOUT;
|
||||||
options->repmgrd_standby_startup_timeout = -1; /* defaults to "standby_reconnect_timeout" if not set */
|
options->repmgrd_standby_startup_timeout = -1; /* defaults to "standby_reconnect_timeout" if not set */
|
||||||
|
memset(options->repmgrd_pid_file, 0, sizeof(options->repmgrd_pid_file));
|
||||||
|
|
||||||
/*-------------
|
/*-------------
|
||||||
* witness settings
|
* witness settings
|
||||||
@@ -604,6 +605,8 @@ _parse_config(t_configuration_options *options, ItemList *error_list, ItemList *
|
|||||||
options->primary_notification_timeout = repmgr_atoi(value, name, error_list, 0);
|
options->primary_notification_timeout = repmgr_atoi(value, name, error_list, 0);
|
||||||
else if (strcmp(name, "repmgrd_standby_startup_timeout") == 0)
|
else if (strcmp(name, "repmgrd_standby_startup_timeout") == 0)
|
||||||
options->repmgrd_standby_startup_timeout = repmgr_atoi(value, name, error_list, 0);
|
options->repmgrd_standby_startup_timeout = repmgr_atoi(value, name, error_list, 0);
|
||||||
|
else if (strcmp(name, "repmgrd_pid_file") == 0)
|
||||||
|
strncpy(options->repmgrd_pid_file, value, MAXPGPATH);
|
||||||
|
|
||||||
/* witness settings */
|
/* witness settings */
|
||||||
else if (strcmp(name, "witness_sync_interval") == 0)
|
else if (strcmp(name, "witness_sync_interval") == 0)
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ typedef struct
|
|||||||
int async_query_timeout;
|
int async_query_timeout;
|
||||||
int primary_notification_timeout;
|
int primary_notification_timeout;
|
||||||
int repmgrd_standby_startup_timeout;
|
int repmgrd_standby_startup_timeout;
|
||||||
|
char repmgrd_pid_file[MAXPGPATH];
|
||||||
|
|
||||||
/* BDR settings */
|
/* BDR settings */
|
||||||
bool bdr_local_monitoring_only;
|
bool bdr_local_monitoring_only;
|
||||||
@@ -196,7 +197,7 @@ typedef struct
|
|||||||
false, -1, \
|
false, -1, \
|
||||||
DEFAULT_ASYNC_QUERY_TIMEOUT, \
|
DEFAULT_ASYNC_QUERY_TIMEOUT, \
|
||||||
DEFAULT_PRIMARY_NOTIFICATION_TIMEOUT, \
|
DEFAULT_PRIMARY_NOTIFICATION_TIMEOUT, \
|
||||||
-1, \
|
-1, "", \
|
||||||
/* BDR settings */ \
|
/* BDR settings */ \
|
||||||
false, DEFAULT_BDR_RECOVERY_TIMEOUT, \
|
false, DEFAULT_BDR_RECOVERY_TIMEOUT, \
|
||||||
/* service settings */ \
|
/* service settings */ \
|
||||||
|
|||||||
@@ -258,6 +258,11 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
|
|||||||
# These settings are only applied when repmgrd is running. Values shown
|
# These settings are only applied when repmgrd is running. Values shown
|
||||||
# are defaults.
|
# are defaults.
|
||||||
|
|
||||||
|
#repmgrd_pid_file= # Path of PID file to use for repmgrd; if not set, a PID file will
|
||||||
|
# be generated in a temporary directory specified by the environment
|
||||||
|
# variable $TMPDIR, or if not set, in "/tmp". This value can be overridden
|
||||||
|
# by the command line option "-p/--pid-file"; the command line option
|
||||||
|
# "--no-pid-file" will force PID file creation to be skipped.
|
||||||
#failover=manual # one of 'automatic', 'manual'.
|
#failover=manual # one of 'automatic', 'manual'.
|
||||||
# determines what action to take in the event of upstream failure
|
# determines what action to take in the event of upstream failure
|
||||||
#
|
#
|
||||||
|
|||||||
77
repmgrd.c
77
repmgrd.c
@@ -35,8 +35,10 @@
|
|||||||
|
|
||||||
static char *config_file = NULL;
|
static char *config_file = NULL;
|
||||||
static bool verbose = false;
|
static bool verbose = false;
|
||||||
static char *pid_file = NULL;
|
static char pid_file[MAXPGPATH];
|
||||||
static bool daemonize = false;
|
static bool daemonize = false;
|
||||||
|
static bool show_pid_file = false;
|
||||||
|
static bool no_pid_file = false;
|
||||||
|
|
||||||
t_configuration_options config_file_options = T_CONFIGURATION_OPTIONS_INITIALIZER;
|
t_configuration_options config_file_options = T_CONFIGURATION_OPTIONS_INITIALIZER;
|
||||||
|
|
||||||
@@ -101,6 +103,8 @@ main(int argc, char **argv)
|
|||||||
/* daemon options */
|
/* daemon options */
|
||||||
{"daemonize", no_argument, NULL, 'd'},
|
{"daemonize", no_argument, NULL, 'd'},
|
||||||
{"pid-file", required_argument, NULL, 'p'},
|
{"pid-file", required_argument, NULL, 'p'},
|
||||||
|
{"show-pid-file", no_argument, NULL, 's'},
|
||||||
|
{"no-pid-file", no_argument, NULL, OPT_NO_PID_FILE},
|
||||||
|
|
||||||
/* logging options */
|
/* logging options */
|
||||||
{"log-level", required_argument, NULL, 'L'},
|
{"log-level", required_argument, NULL, 'L'},
|
||||||
@@ -113,8 +117,6 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
set_progname(argv[0]);
|
set_progname(argv[0]);
|
||||||
|
|
||||||
srand(time(NULL));
|
|
||||||
|
|
||||||
/* Disallow running as root */
|
/* Disallow running as root */
|
||||||
if (geteuid() == 0)
|
if (geteuid() == 0)
|
||||||
{
|
{
|
||||||
@@ -128,6 +130,10 @@ main(int argc, char **argv)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
srand(time(NULL));
|
||||||
|
|
||||||
|
memset(pid_file, 0, MAXPGPATH);
|
||||||
|
|
||||||
while ((c = getopt_long(argc, argv, "?Vf:L:vdp:m", long_options, &optindex)) != -1)
|
while ((c = getopt_long(argc, argv, "?Vf:L:vdp:m", long_options, &optindex)) != -1)
|
||||||
{
|
{
|
||||||
switch (c)
|
switch (c)
|
||||||
@@ -173,7 +179,15 @@ main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'p':
|
case 'p':
|
||||||
pid_file = optarg;
|
strncpy(pid_file, optarg, MAXPGPATH);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 's':
|
||||||
|
show_pid_file = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPT_NO_PID_FILE:
|
||||||
|
no_pid_file = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* logging options */
|
/* logging options */
|
||||||
@@ -239,6 +253,48 @@ main(int argc, char **argv)
|
|||||||
*/
|
*/
|
||||||
load_config(config_file, verbose, false, &config_file_options, argv[0]);
|
load_config(config_file, verbose, false, &config_file_options, argv[0]);
|
||||||
|
|
||||||
|
/* Determine pid file location, unless --no-pid-file supplied */
|
||||||
|
|
||||||
|
if (no_pid_file == false)
|
||||||
|
{
|
||||||
|
if (config_file_options.repmgrd_pid_file[0] != '\0')
|
||||||
|
{
|
||||||
|
if (pid_file[0] != '\0')
|
||||||
|
{
|
||||||
|
log_warning(_("\"repmgrd_pid_file\" will be overridden by --pid-file"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strncpy(pid_file, config_file_options.repmgrd_pid_file, MAXPGPATH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* no pid file provided - determine location */
|
||||||
|
if (pid_file[0] == '\0')
|
||||||
|
{
|
||||||
|
const char *tmpdir = getenv("TMPDIR");
|
||||||
|
|
||||||
|
if (!tmpdir)
|
||||||
|
tmpdir = "/tmp";
|
||||||
|
|
||||||
|
maxpath_snprintf(pid_file, "%s/repmgrd.pid", tmpdir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* --no-pid-file supplied - overwrite any value provided with --pid-file ... */
|
||||||
|
memset(pid_file, 0, MAXPGPATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* If --show-pid-file supplied, output the location (if set) and exit */
|
||||||
|
|
||||||
|
if (show_pid_file == true)
|
||||||
|
{
|
||||||
|
printf("%s\n", pid_file);
|
||||||
|
exit(SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Some configuration file items can be overriden by command line options */
|
/* Some configuration file items can be overriden by command line options */
|
||||||
|
|
||||||
@@ -414,7 +470,7 @@ main(int argc, char **argv)
|
|||||||
daemonize_process();
|
daemonize_process();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pid_file != NULL)
|
if (pid_file[0] != '\0')
|
||||||
{
|
{
|
||||||
check_and_create_pid_file(pid_file);
|
check_and_create_pid_file(pid_file);
|
||||||
}
|
}
|
||||||
@@ -669,6 +725,8 @@ show_help(void)
|
|||||||
{
|
{
|
||||||
printf(_("%s: replication management daemon for PostgreSQL\n"), progname());
|
printf(_("%s: replication management daemon for PostgreSQL\n"), progname());
|
||||||
puts("");
|
puts("");
|
||||||
|
printf(_("%s monitors a cluster of servers and optionally performs failover.\n"), progname());
|
||||||
|
puts("");
|
||||||
|
|
||||||
printf(_("Usage:\n"));
|
printf(_("Usage:\n"));
|
||||||
printf(_(" %s [OPTIONS]\n"), progname());
|
printf(_(" %s [OPTIONS]\n"), progname());
|
||||||
@@ -688,12 +746,13 @@ show_help(void)
|
|||||||
|
|
||||||
puts("");
|
puts("");
|
||||||
|
|
||||||
printf(_("General configuration options:\n"));
|
printf(_("Daemon configuration options:\n"));
|
||||||
printf(_(" -d, --daemonize detach process from foreground\n"));
|
printf(_(" -d, --daemonize detach process from foreground\n"));
|
||||||
printf(_(" -p, --pid-file=PATH write a PID file\n"));
|
printf(_(" -p, --pid-file=PATH use the specified PID file\n"));
|
||||||
|
printf(_(" -s, --show-pid-file show PID file which would be used by the current configuration\n"));
|
||||||
|
printf(_(" --no-pid-file don't write a PID file\n"));
|
||||||
puts("");
|
puts("");
|
||||||
|
|
||||||
printf(_("%s monitors a cluster of servers and optionally performs failover.\n"), progname());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -802,7 +861,7 @@ terminate(int retval)
|
|||||||
{
|
{
|
||||||
logger_shutdown();
|
logger_shutdown();
|
||||||
|
|
||||||
if (pid_file)
|
if (pid_file[0] != '\0')
|
||||||
{
|
{
|
||||||
unlink(pid_file);
|
unlink(pid_file);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "portability/instr_time.h"
|
#include "portability/instr_time.h"
|
||||||
|
|
||||||
|
#define OPT_NO_PID_FILE 1000
|
||||||
|
|
||||||
extern volatile sig_atomic_t got_SIGHUP;
|
extern volatile sig_atomic_t got_SIGHUP;
|
||||||
extern MonitoringState monitoring_state;
|
extern MonitoringState monitoring_state;
|
||||||
extern instr_time degraded_monitoring_start;
|
extern instr_time degraded_monitoring_start;
|
||||||
@@ -26,4 +28,6 @@ const char *print_monitoring_state(MonitoringState monitoring_state);
|
|||||||
|
|
||||||
void update_registration(PGconn *conn);
|
void update_registration(PGconn *conn);
|
||||||
void terminate(int retval);
|
void terminate(int retval);
|
||||||
|
|
||||||
|
|
||||||
#endif /* _REPMGRD_H_ */
|
#endif /* _REPMGRD_H_ */
|
||||||
|
|||||||
Reference in New Issue
Block a user