tags 348012 upstream thanks On Fri, Jan 13, 2006 at 10:35:52PM -0600, Mosemann, Russell muttered these words: > There is a minor formatting problem in the first hunk from a bad cut and > paste. This should correct it.
Hi Russell, I've forwarded your patch to Frank Denis, the upstream developer of ucarp, and he has agreed to incorporate it in the next release. That release should occur sometime in the next couple of weeks and I will push out a new package shortly after. I want to thank you for your detailed report and the excellent patch, they are both appreciated. Regards, -- Eric Evans [EMAIL PROTECTED]
diff -Naur ucarp-1.1/README ucarp-1.1-3/README --- ucarp-1.1/README 2004-09-02 17:07:42.000000000 -0500 +++ ucarp-1.1-3/README 2006-01-13 20:21:02.000000000 -0600 @@ -126,10 +126,23 @@ Please note that by default, and if everything's ok, a master will stay a master as long as possible. If you want a "preferred" master to immediately -become a master even if the other host is: +become a master even if another host is already the master, - add the --preempt (or -P) switch to *all* hosts - use a lower skew or a lower base for the "preferred" one. +When ucarp first runs, it starts as a backup and listens to the network to +determine if it should become the master. When it enters the backup state, +it normally runs the downscript. That can be useful to remove old +temporary files or clean up an interface that is in an unknown state. In +some circumstances, however, it is undesirable to run the downscript if +the service was not already up. In that case, use the --neutral (-n) switch +for ucarp to not run the downscript when it enters the backup state the +first time. All changes from the master state to the backup state after +that will run the downscript. + +--shutdown (-z) will run the downscript at exit, unless ucarp is already +in the backup state. + The "dead ratio" (--deadratio=...) knob basically changes how long a backup server will wait for an unresponsive master before considering it as dead, and becoming the new master. In the original protocol, the ratio is 3. This is diff -Naur ucarp-1.1/src/carp.c ucarp-1.1-3/src/carp.c --- ucarp-1.1/src/carp.c 2004-08-28 11:30:02.000000000 -0500 +++ ucarp-1.1-3/src/carp.c 2006-01-13 20:27:03.000000000 -0600 @@ -59,7 +59,8 @@ break; case BACKUP: logfile(LOG_WARNING, _("Switching to state: BACKUP")); - (void) spawn_handler(dev_desc_fd, downscript); + if ((sc->sc_state != INIT) || (neutral != 1)) + (void) spawn_handler(dev_desc_fd, downscript); gratuitous_arp(dev_desc_fd, 0); break; case MASTER: @@ -313,17 +314,8 @@ #endif switch (sc->sc_state) { case INIT: - if (preempt != 0 && carp_suppress_preempt == 0) { - carp_send_ad(sc); - gratuitous_arp(dev_desc_fd, 1); -#ifdef INET6 - carp_send_na(sc); -#endif /* INET6 */ - carp_set_state(sc, MASTER); - } else { - carp_set_state(sc, BACKUP); - carp_setrun(sc, 0); - } + carp_set_state(sc, BACKUP); + carp_setrun(sc, 0); break; case BACKUP: sc->sc_ad_tmo.tv_sec = 0; @@ -607,7 +599,8 @@ logfile(LOG_DEBUG, "sighandler_exit(): Calling [%s] and exiting", downscript); #endif - (void) spawn_handler(dev_desc_fd, downscript); + if (sc->sc_state != BACKUP) + (void) spawn_handler(dev_desc_fd, downscript); _exit(EXIT_SUCCESS); } @@ -687,14 +680,18 @@ pfds[0].fd = dev_desc_fd; pfds[0].events = POLLIN | POLLERR | POLLHUP | POLLNVAL; - carp_setrun(&sc, 0); - if (shutdown_at_exit != 0) { (void) signal(SIGINT, sighandler_exit); (void) signal(SIGQUIT, sighandler_exit); (void) signal(SIGTERM, sighandler_exit); } + if (gettimeofday(&now, NULL) != 0) { + logfile(LOG_WARNING, "initializing now to gettimeofday() failed: %s", + strerror(errno)); + } + carp_setrun(&sc, 0); + for (;;) { nfds = poll(pfds, (nfds_t) 1, sc.sc_advbase * 1000); if (nfds == -1 || diff -Naur ucarp-1.1/src/globals.h ucarp-1.1-3/src/globals.h --- ucarp-1.1/src/globals.h 2004-06-20 14:35:22.000000000 -0500 +++ ucarp-1.1-3/src/globals.h 2006-01-13 19:05:29.000000000 -0600 @@ -20,6 +20,7 @@ GLOBAL0(char *upscript); GLOBAL0(char *downscript); GLOBAL0(signed char preempt); +GLOBAL0(signed char neutral); GLOBAL0(signed char shutdown_at_exit); GLOBAL0(unsigned char hwaddr[6]); GLOBAL0(signed char no_syslog); diff -Naur ucarp-1.1/src/ucarp.c ucarp-1.1-3/src/ucarp.c --- ucarp-1.1/src/ucarp.c 2004-08-28 11:04:05.000000000 -0500 +++ ucarp-1.1-3/src/ucarp.c 2006-01-13 19:03:06.000000000 -0600 @@ -28,6 +28,7 @@ "--vhid=<id> (-v <id>): virtual IP identifier (1-255)\n" "--pass=<pass> (-p <pass>): password\n" "--preempt (-P): becomes a master as soon as possible\n" + "--neutral (-n): do not run downscript at start if backup\n" "--addr=<ip> (-a <ip>): virtual shared IP address\n" "--help (-h): summary of command-line options\n" "--advbase=<seconds> (-b <seconds>): advertisement frequency\n" @@ -127,6 +128,10 @@ preempt = 1; break; } + case 'n': { + neutral = 1; + break; + } case 'a': { if (inet_pton(AF_INET, optarg, &vaddr) == 0) { logfile(LOG_ERR, _("Invalid address: [%s]"), optarg); diff -Naur ucarp-1.1/src/ucarp_p.h ucarp-1.1-3/src/ucarp_p.h --- ucarp-1.1/src/ucarp_p.h 2004-08-28 11:02:51.000000000 -0500 +++ ucarp-1.1-3/src/ucarp_p.h 2006-01-13 19:03:33.000000000 -0600 @@ -1,7 +1,7 @@ #ifndef __CARP_P_H__ #define __CARP_P_H__ 1 -static const char *GETOPT_OPTIONS = "i:s:v:p:Pa:hb:k:u:d:r:zf:B"; +static const char *GETOPT_OPTIONS = "i:s:v:p:Pna:hb:k:u:d:r:zf:B"; static struct option long_options[] = { { "interface", 1, NULL, 'i' }, @@ -9,6 +9,7 @@ { "vhid", 1, NULL, 'v' }, { "pass", 1, NULL, 'p' }, { "preempt", 0, NULL, 'P' }, + { "neutral", 0, NULL, 'n' }, { "addr", 1, NULL, 'a' }, { "help", 0, NULL, 'h' }, { "advbase", 1, NULL, 'b' },
signature.asc
Description: Digital signature