The attached patch makes it possible to ask fence_tool to not wait for quorum and just die in this case. This makes it easier to call fence_tool join in init scripts without the problem of a blocked startup. Bastian -- Bones: "The man's DEAD, Jim!"
diff -urN -x CVS -x debian cvs-patch02-gnuism/fenced/main.c cvs-patch03-quorum/fenced/main.c --- cvs-patch02-gnuism/fenced/main.c 2005-02-17 18:13:07.000000000 +0100 +++ cvs-patch03-quorum/fenced/main.c 2005-02-17 18:34:17.000000000 +0100 @@ -23,7 +23,7 @@ char our_name[MAX_CLUSTER_MEMBER_NAME_LEN+1]; -#define OPTION_STRING ("cj:f:Dn:hVSw") +#define OPTION_STRING ("cj:f:Dn:hVSwQ") #define LOCKFILE_NAME "/var/run/fenced.pid" @@ -573,6 +573,7 @@ case 'S': case 'w': + case 'Q': /* do nothing, this is a fence_tool option that we ignore when fence_tool starts us */ break; diff -urN -x CVS -x debian cvs-patch02-gnuism/fence_tool/fence_tool.c cvs-patch03-quorum/fence_tool/fence_tool.c --- cvs-patch02-gnuism/fence_tool/fence_tool.c 2005-02-17 18:19:19.000000000 +0100 +++ cvs-patch03-quorum/fence_tool/fence_tool.c 2005-02-17 18:39:30.000000000 +0100 @@ -34,7 +34,7 @@ #include "ccs.h" #include "copyright.cf" -#define OPTION_STRING ("VhScj:f:Dw") +#define OPTION_STRING ("VhScj:f:DwQ") #define LOCKFILE_NAME "/var/run/fenced.pid" #define FENCED_SOCK_PATH "fenced_socket" @@ -48,6 +48,7 @@ int operation; bool skip_unfence = false; bool child_wait = false; +bool wait_for_quorum = true; int cl_sock; char our_name[MAX_CLUSTER_MEMBER_NAME_LEN+1]; @@ -188,7 +189,7 @@ * join/leave process.) */ -static int wait_quorum(void) +static bool check_quorum(void) { int rv, i = 0; @@ -202,15 +203,15 @@ rv = ioctl(cl_sock, SIOCCLUSTER_ISQUORATE, NULL); if (rv) - break; + return true; + else if (!wait_for_quorum) + return false; sleep(1); if (++i > 9 && !(i % 10)) printf("%s: waiting for cluster quorum\n", prog_name); } - - return 0; } /* @@ -246,18 +247,22 @@ sleep(1); rewind(file); } - + out: fclose(file); - return 0; + + return EXIT_SUCCESS; } -static void do_join(int argc, char *argv[]) +static int do_join(int argc, char *argv[]) { int cd; setup_sock(); - wait_quorum(); + + if (!check_quorum()) + return EXIT_FAILURE; + get_our_name(); close(cl_sock); cd = check_ccs(); @@ -293,9 +298,11 @@ execvp("fenced", argv); die("starting fenced failed"); + + return EXIT_FAILURE; } -static void do_leave(void) +static int do_leave(void) { FILE *f; char buf[33] = ""; @@ -314,13 +321,18 @@ check_mounted(); setup_sock(); - wait_quorum(); + + if (!check_quorum()) + return EXIT_FAILURE; + close(cl_sock); kill(pid, SIGTERM); + + return EXIT_SUCCESS; } -static void do_monitor(void) +static int do_monitor(void) { int sfd, error, rv; struct sockaddr_un addr; @@ -348,6 +360,8 @@ printf("%s", buf); } + + return EXIT_SUCCESS; } static void print_usage(void) @@ -367,6 +381,7 @@ printf(" -h Print this help, then exit\n"); printf(" -S Skip self unfencing on join\n"); printf(" -D Enable debugging, don't fork (also passed to fenced)\n"); + printf(" -Q Don't wait if cluster is not quorate\n"); printf("\n"); printf("Fenced options:\n"); printf(" these are passed on to fenced when it's started\n"); @@ -410,6 +425,10 @@ child_wait = true; break; + case 'Q': + wait_for_quorum = false; + break; + case ':': case '?': fprintf(stderr, "Please use '-h' for usage.\n"); @@ -458,18 +477,14 @@ switch (operation) { case OP_JOIN: - do_join(argc, argv); - break; + return do_join(argc, argv); case OP_LEAVE: - do_leave(); - break; + return do_leave(); case OP_MONITOR: - do_monitor(); - break; + return do_monitor(); case OP_WAIT: - do_wait(); - break; + return do_wait(); } - exit(EXIT_SUCCESS); + return EXIT_FAILURE; }
Attachment:
signature.asc
Description: Digital signature