This is the mail archive of the
cluster-cvs@sourceware.org
mailing list for the cluster.
fence: master - fence_node: unfence local node by default
- From: David Teigland <teigland at fedoraproject dot org>
- To: cluster-cvs-relay at redhat dot com
- Date: Thu, 26 Feb 2009 18:08:03 +0000 (UTC)
- Subject: fence: master - fence_node: unfence local node by default
Gitweb: http://git.fedorahosted.org/git/fence.git?p=fence.git;a=commitdiff;h=9abd4d6acd89b04acb06f342f5018ff77f19ef2a
Commit: 9abd4d6acd89b04acb06f342f5018ff77f19ef2a
Parent: 54eccd946068e48a4c1636a938e94fa4b17e9f38
Author: David Teigland <teigland@redhat.com>
AuthorDate: Thu Feb 26 12:00:08 2009 -0600
Committer: David Teigland <teigland@redhat.com>
CommitterDate: Thu Feb 26 12:05:29 2009 -0600
fence_node: unfence local node by default
and wait for cman to be active before using it for getting the
local node name (for unfence default), and ccs queries (in libfence).
Signed-off-by: David Teigland <teigland@redhat.com>
---
fence/fence_node/Makefile | 4 +-
fence/fence_node/fence_node.c | 55 ++++++++++++++++++++++++++++++++++++----
2 files changed, 51 insertions(+), 8 deletions(-)
diff --git a/fence/fence_node/Makefile b/fence/fence_node/Makefile
index 0ce0615..06a8e54 100644
--- a/fence/fence_node/Makefile
+++ b/fence/fence_node/Makefile
@@ -14,11 +14,11 @@ OBJS= fence_node.o
CFLAGS += -D_FILE_OFFSET_BITS=64
-CFLAGS += -I${ccsincdir} -I${fenceincdir} -I${logtincdir}
+CFLAGS += -I${ccsincdir} -I${cmanincdir} -I${fenceincdir} -I${logtincdir}
CFLAGS += -I$(S)/../libfenced
CFLAGS += -I${incdir}
-LDFLAGS += -L${ccslibdir} -L${fencelibdir} -lccs -lfence
+LDFLAGS += -L${ccslibdir} -L{cmanlibdir} -L${fencelibdir} -lccs -lcman -lfence
LDFLAGS += -L${logtlibdir} -llogthread
LDFLAGS += -L../libfenced -lfenced
LDFLAGS += -L${libdir}
diff --git a/fence/fence_node/fence_node.c b/fence/fence_node/fence_node.c
index 6cb15e7..1e3c293 100644
--- a/fence/fence_node/fence_node.c
+++ b/fence/fence_node/fence_node.c
@@ -4,12 +4,14 @@
#include <stdint.h>
#include <string.h>
#include <liblogthread.h>
+#include <libcman.h>
#include "libfence.h"
#include "libfenced.h"
#include "copyright.cf"
static char *prog_name;
+static char our_name[CMAN_MAX_NODENAME_LEN+1];
static int verbose;
static int unfence;
@@ -37,13 +39,47 @@ static void print_usage(void)
printf("\n");
printf("Options:\n");
printf("\n");
- printf(" -U Unfence the node\n");
+ printf(" -U Unfence the node, default local node name\n");
printf(" -v Show fence agent results, -vv for agent args\n");
printf(" -h Print this help, then exit\n");
printf(" -V Print program version information, then exit\n");
printf("\n");
}
+static int setup_cman(void)
+{
+ cman_handle_t ch;
+ cman_node_t node;
+ int active = 0;
+ int rv;
+
+ ch = cman_init(NULL);
+ if (!ch)
+ return -1;
+
+ retry_active:
+ rv = cman_is_active(ch);
+ if (!rv) {
+ if (active++ < 2) {
+ sleep(1);
+ goto retry_active;
+ }
+ cman_finish(ch);
+ return -1;
+ }
+
+ rv = cman_get_node(ch, CMAN_NODEID_US, &node);
+ if (rv < 0) {
+ cman_finish(ch);
+ return -1;
+ }
+
+ memset(our_name, 0, sizeof(our_name));
+ strncpy(our_name, node.cn_name, CMAN_MAX_NODENAME_LEN);
+ cman_finish(ch);
+ return 0;
+}
+
static char *fe_str(int r)
{
switch (r) {
@@ -74,7 +110,7 @@ static char *fe_str(int r)
int main(int argc, char *argv[])
{
- char *victim = NULL, *p;
+ char *victim = NULL;
int cont = 1, optchar, error, rv, i, c;
prog_name = argv[0];
@@ -128,9 +164,16 @@ int main(int argc, char *argv[])
optind++;
}
- if (!victim)
+ if (!victim && !unfence)
die("no node name specified");
+ error = setup_cman();
+ if (error)
+ die("cannot connect to cman");
+
+ if (!victim && unfence)
+ victim = our_name;
+
memset(&log, 0, sizeof(log));
log_count = 0;
@@ -139,9 +182,6 @@ int main(int argc, char *argv[])
else
error = fence_node(victim, log, FL_SIZE, &log_count);
- logt_init("fence_node", LOG_MODE_OUTPUT_SYSLOG, SYSLOGFACILITY,
- SYSLOGLEVEL, 0, NULL);
-
if (!verbose)
goto skip;
@@ -167,6 +207,9 @@ int main(int argc, char *argv[])
}
skip:
+ logt_init("fence_node", LOG_MODE_OUTPUT_SYSLOG, SYSLOGFACILITY,
+ SYSLOGLEVEL, 0, NULL);
+
if (error) {
fprintf(stderr, "%s %s failed\n", action, victim);
logt_print(LOG_ERR, "%s %s failed\n", action, victim);