diff --git a/repmgr.c b/repmgr.c index 26248c35..13b3e6f0 100644 --- a/repmgr.c +++ b/repmgr.c @@ -109,13 +109,15 @@ main(int argc, char **argv) {"force", no_argument, NULL, 'F'}, {"wait", no_argument, NULL, 'W'}, {"ignore-rsync-warning", no_argument, NULL, 'I'}, + {"min-recovery-apply-delay", required_argument, NULL, 'r'}, {"verbose", no_argument, NULL, 'v'}, {NULL, 0, NULL, 0} }; int optindex; - int c; + int c, targ; int action = NO_ACTION; + char *ptr = NULL; progname = get_progname(argv[0]); @@ -134,7 +136,7 @@ main(int argc, char **argv) } - while ((c = getopt_long(argc, argv, "d:h:p:U:D:l:f:R:w:k:FWIv", long_options, + while ((c = getopt_long(argc, argv, "d:h:p:U:D:l:f:R:w:k:FWIvr:", long_options, &optindex)) != -1) { switch (c) @@ -184,6 +186,25 @@ main(int argc, char **argv) case 'I': runtime_options.ignore_rsync_warn = true; break; + case 'r': + targ = strtol(optarg, &ptr, 10); + + if(targ < 0) { + usage(); + exit(ERR_BAD_CONFIG); + } + if(ptr && *ptr) { + if(strcmp(ptr, "ms") != 0 && strcmp(ptr, "s") != 0 && + strcmp(ptr, "min") != 0 && strcmp(ptr, "h") != 0 && + strcmp(ptr, "d") != 0) + { + usage(); + exit(ERR_BAD_CONFIG); + } + } + + strncpy(runtime_options.min_recovery_apply_delay, optarg, MAXLEN); + break; case 'v': runtime_options.verbose = true; break; @@ -1853,6 +1874,7 @@ help(const char *progname) printf(_(" -F, --force force potentially dangerous operations\n" \ " to happen\n")); printf(_(" -W, --wait wait for a master to appear\n")); + printf(_(" -r, --min-recovery-apply-delay=VALUE enable recovery time delay, value has to be a valid time atom (e.g. 5min)")); printf(_("\n%s performs some tasks like clone a node, promote it or making follow\n"), progname); printf(_("another node and then exits.\n\n")); @@ -1905,6 +1927,19 @@ create_recovery_file(const char *data_dir) return false; } + if(*runtime_options.min_recovery_apply_delay) + { + maxlen_snprintf(line, "\nmin_recovery_apply_delay = %s\n", + runtime_options.min_recovery_apply_delay); + + if (fputs(line, recovery_file) == EOF) + { + log_err(_("recovery file could not be written, it could be necessary to create it manually\n")); + fclose(recovery_file); + return false; + } + } + /* FreeFile(recovery_file); */ fclose(recovery_file); @@ -1915,25 +1950,34 @@ static int test_ssh_connection(char *host, char *remote_user) { char script[MAXLEN]; - int r; + int r = 1, i; - /* On some OS, true is located in a different place than in Linux */ -#ifdef __FreeBSD__ -#define TRUEBIN_PATH "/usr/bin/true" -#else -#define TRUEBIN_PATH "/bin/true" -#endif + /* On some OS, true is located in a different place than in Linux + * we have to try them all until all alternatives are gone or we + * found `true' because the target OS may differ from the source + * OS + */ + const char *truebin_pathes[] = { + "/bin/true", + "/usr/bin/true", + NULL + }; /* Check if we have ssh connectivity to host before trying to rsync */ - if (!remote_user[0]) - maxlen_snprintf(script, "ssh -o Batchmode=yes %s %s %s", - options.ssh_options, host, TRUEBIN_PATH); - else - maxlen_snprintf(script, "ssh -o Batchmode=yes %s %s -l %s %s", - options.ssh_options, host, remote_user, TRUEBIN_PATH); + for(i = 0; truebin_pathes[i] && r != 0; ++i) + { + if (!remote_user[0]) + maxlen_snprintf(script, "ssh -o Batchmode=yes %s %s %s", + options.ssh_options, host, truebin_pathes[i]); + else + maxlen_snprintf(script, "ssh -o Batchmode=yes %s %s -l %s %s", + options.ssh_options, host, remote_user, + truebin_pathes[i]); + + log_debug(_("command is: %s\n"), script); + r = system(script); + } - log_debug(_("command is: %s\n"), script); - r = system(script); if (r != 0) log_info(_("Can not connect to the remote host (%s)\n"), host); return r; diff --git a/repmgr.h b/repmgr.h index ff1aa2ee..a6d01229 100644 --- a/repmgr.h +++ b/repmgr.h @@ -67,8 +67,10 @@ typedef struct /* parameter used by CLUSTER CLEANUP */ int keep_history; + + char min_recovery_apply_delay[MAXLEN]; } t_runtime_options; -#define T_RUNTIME_OPTIONS_INITIALIZER { "", "", "", "", "", "", DEFAULT_WAL_KEEP_SEGMENTS, false, false, false, false, "", "", 0 } +#define T_RUNTIME_OPTIONS_INITIALIZER { "", "", "", "", "", "", DEFAULT_WAL_KEEP_SEGMENTS, false, false, false, false, "", "", 0, "" } #endif