cluster-devel.redhat.com archive mirror
 help / color / mirror / Atom feed
From: David Teigland <teigland@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] patch proposal for BZ#514662
Date: Fri, 25 Sep 2009 12:11:07 -0500	[thread overview]
Message-ID: <20090925171107.GF9544@redhat.com> (raw)

I'm not sure this ever made it to the list.


----- Forwarded message from edamato at redhat.com -----

Date: Mon, 3 Aug 2009 16:49:12 +0100
From: edamato@redhat.com
To: dct@redhat.com
Cc: cluster-devel at redhat.com,
        "Pancrazio `Ezio' de Mauro" <pdemauro@redhat.com>
Subject: patch proposal for BZ#514662
Message-ID: <20090803154912.GR23767@civitate.fab.redhat.com>


Hi Dave,

As we discussed on #cluster, sending you this patch for BZ#514662. It implements readconfig and dumpconfig for fence_tool and fenced.

Thank you for the many corrections!!


I tested the last patch, and have:

[root at pe1950-1 fence]# ./fence_tool/fence_tool dumpconfig
post_fail_delay = 80
post_join_delay = 8
clean_start = 0
skip_undefined = 0
override_path = /var/run/cluster/fenced_override

[root at pe1950-1 fence]# ccs_tool update /etc/cluster/cluster.conf
Config file updated from version 679 to 680

Update complete.

[root at pe1950-1 fence]# ./fence_tool/fence_tool readconfig

[root at pe1950-1 fence]# ./fence_tool/fence_tool dumpconfig
post_fail_delay = 101
post_join_delay = 12
clean_start = 0
skip_undefined = 0
override_path = /var/run/cluster/fenced_override

[root at pe1950-1 fence]# ./fence_tool/fence_tool dumpconfig
post_fail_delay = 101
post_join_delay = 12
clean_start = 0
skip_undefined = 0
override_path = /var/run/cluster/fenced_override


caveats:

- fence_tool readconfig must be run on every node.
- fence_tool readconfig is not testing if the fence domain is performing recovery, and updates it nonetheless. This should not be a problem because delay is set from post_fail_delay internally during recovery and should not affect fenced while doing recovery, but good to document anyway.

Let me know if you would like to have any modifications.

cheers
Eduardo.



-- 
-----

Eduardo Damato				Red Hat UK Ltd
Principal Technical Support Engineer 	200 Fowler Avenue
Tel:   +44 1252 362700			Farnborough Business Park
email: edamato at redhat.com		Farnborough, Hampshire GU14 7JP


diff -up cman-2.0.98.DIFF/fence/fenced/main.c.DIFF cman-2.0.98.DIFF/fence/fenced/main.c
--- cman-2.0.98.DIFF/fence/fenced/main.c.DIFF	2009-07-31 21:21:36.000000000 +0100
+++ cman-2.0.98.DIFF/fence/fenced/main.c	2009-08-03 16:13:12.000000000 +0100
@@ -379,6 +379,72 @@ static int do_dump(int fd)
 	return 0;
 }
 
+static int do_readconfig(int fd)
+{
+        char path[256], *str = NULL;
+        int error, cd, i = 0;
+
+        while ((cd = ccs_connect()) < 0) {
+                sleep(1);
+                if (++i > 9 && !(i % 10))
+                        log_error("connect to ccs error %d, "
+                                  "check ccsd or cluster status", cd);
+        }
+
+        if (comline.post_join_delay_opt == FALSE) {
+                str = NULL;
+                memset(path, 0, 256);
+                sprintf(path, "/cluster/fence_daemon/@post_join_delay");
+
+                error = ccs_get(cd, path, &str);
+                if (!error)
+                        comline.post_join_delay = atoi(str);
+                else
+                        comline.post_join_delay = DEFAULT_POST_JOIN_DELAY;
+                if (str)
+                        free(str);
+        }
+
+        if (comline.post_fail_delay_opt == FALSE) {
+                str = NULL;
+                memset(path, 0, 256);
+                sprintf(path, "/cluster/fence_daemon/@post_fail_delay");
+
+                error = ccs_get(cd, path, &str);
+                if (!error)
+                        comline.post_fail_delay = atoi(str);
+                else
+                        comline.post_fail_delay = DEFAULT_POST_FAIL_DELAY;
+                if (str)
+                        free(str);
+        }
+
+	if (error) {
+                        log_error("reconfigure: error reading ccs connector"
+                                  " %d, check ccsd or cluster status", cd);
+			return -1;
+	}
+
+	return 0;
+}
+
+static int do_dumpconfig(int fd)
+{
+	char buf[DUMP_SIZE];
+
+	memset(buf, 0, sizeof(buf));
+	sprintf(buf, "post_fail_delay = %d\n" "post_join_delay = %d\n"
+			"clean_start = %d\n" "skip_undefined = %d\n"
+			"override_path = %s\n",
+			comline.post_fail_delay, comline.post_join_delay,
+			comline.clean_start, comline.skip_undefined,
+			comline.override_path);
+
+	do_write(fd, buf, sizeof(buf));
+
+	return 0;
+}
+
 static int client_process(int ci)
 {
 	char buf[MAXLINE], *argv[MAXARGS], *cmd, *name, out[MAXLINE];
@@ -408,6 +474,10 @@ static int client_process(int ci)
 		rv = do_join(name);
 	else if (!strcmp(cmd, "leave"))
 		rv = do_leave(name);
+	else if (!strcmp(cmd, "readconfig"))
+		rv = do_readconfig(name);
+	else if (!strcmp(cmd, "dumpconfig"))
+		rv = do_dumpconfig(client[ci].fd);
 	else if (!strcmp(cmd, "dump")) {
 		do_dump(client[ci].fd);
 		close(client[ci].fd);
diff -up cman-2.0.98.DIFF/fence/fence_tool/fence_tool.c.DIFF cman-2.0.98.DIFF/fence/fence_tool/fence_tool.c
--- cman-2.0.98.DIFF/fence/fence_tool/fence_tool.c.DIFF	2009-07-31 19:54:15.000000000 +0100
+++ cman-2.0.98.DIFF/fence/fence_tool/fence_tool.c	2009-08-03 16:18:26.000000000 +0100
@@ -47,6 +47,8 @@
 #define OP_LEAVE 			2
 #define OP_WAIT				3
 #define OP_DUMP				4
+#define OP_READCONFIG			5
+#define OP_DUMPCONFIG			6
 
 /* needs to match the same in cluster/group/daemon/gd_internal.h and
    cluster/group/gfs_controld/lock_dlm.h and cluster/fence/fenced/fd.h */
@@ -432,11 +434,62 @@ static int do_dump(void)
 	return 0;
 }
 
+static int do_readconfig(void)
+{
+	char buf[MAXLINE];
+	int fd, rv;
+
+	fd = fenced_connect();
+
+	memset(buf, 0, sizeof(buf));
+
+	sprintf(buf, "readconfig");
+
+	rv = do_write(fd, buf, sizeof(buf));
+	if (rv < 0)
+		die("can't communicate with fenced");
+
+	memset(buf, 0, sizeof(buf));
+	rv = do_read(fd, buf, sizeof(buf));
+	if (rv < 0)
+		printf("readconfig: %s\n", strerror(errno));
+
+	close(fd);
+	return 0;
+}
+
+static int do_dumpconfig(void)
+{
+	char inbuf[DUMP_SIZE];
+	char outbuf[MAXLINE];
+	int fd, rv;
+
+	fd = fenced_connect();
+
+	memset(inbuf, 0, sizeof(inbuf));
+	memset(outbuf, 0, sizeof(outbuf));
+
+	sprintf(outbuf, "dumpconfig");
+
+	rv = do_write(fd, outbuf, sizeof(outbuf));
+	if (rv < 0)
+		die("can't communicate with fenced");
+
+	rv = do_read(fd, inbuf, sizeof(inbuf));
+	if (rv < 0)
+		printf("dump config: %s\n", strerror(errno));
+
+	do_write(STDOUT_FILENO, inbuf, strlen(inbuf));
+
+	close(fd);
+	return 0;
+}
+
 static void print_usage(void)
 {
 	printf("Usage:\n");
 	printf("\n");
-	printf("%s <join|leave|dump> [options]\n", prog_name);
+	printf("%s <join|leave|dump|dumpconfig|readconfig> [options]\n", prog_name);
 	printf("\n");
 	printf("Actions:\n");
 	printf("  join             Join the default fence domain\n");
@@ -515,6 +568,10 @@ static void decode_arguments(int argc, c
 			operation = OP_LEAVE;
 		} else if (strcmp(argv[optind], "dump") == 0) {
 			operation = OP_DUMP;
+		} else if (strcmp(argv[optind], "dumpconfig") == 0) {
+			operation = OP_DUMPCONFIG;
+		} else if (strcmp(argv[optind], "readconfig") == 0) {
+			operation = OP_READCONFIG;
 		} else
 			die("unknown option %s\n", argv[optind]);
 		optind++;
@@ -537,6 +594,10 @@ int main(int argc, char *argv[])
 		return do_leave();
 	case OP_DUMP:
 		return do_dump();
+	case OP_READCONFIG:
+		return do_readconfig();
+	case OP_DUMPCONFIG:
+		return do_dumpconfig();
 	case OP_WAIT:
 		return -1;
 	}
diff -up cman-2.0.98.DIFF/fence/man/fence_tool.8.DIFF cman-2.0.98.DIFF/fence/man/fence_tool.8
--- cman-2.0.98.DIFF/fence/man/fence_tool.8.DIFF	2009-07-31 23:09:38.000000000 +0100
+++ cman-2.0.98.DIFF/fence/man/fence_tool.8	2009-08-03 16:12:35.000000000 +0100
@@ -13,12 +13,13 @@ fence_tool - A program to join and leave
 .SH SYNOPSIS
 .B
 fence_tool
-<\fBjoin | leave | dump\fP> 
+<\fBjoin | leave | dump | dumpconfig | readconfig\fP> 
 [\fIOPTION\fR]...
 
 .SH DESCRIPTION
 \fBfence_tool\fP is a program used to join or leave the default fence
-domain.  It communicates with the fenced daemon.  Before telling fenced
+domain, but also to dump and reread the configuration from CCS.
+It communicates with the fenced daemon.  Before telling fenced
 to join the domain, fence_tool waits for the cluster to have quorum,
 making it easier to cancel the command if the cluster is inquorate.
 


----- End forwarded message -----



                 reply	other threads:[~2009-09-25 17:11 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090925171107.GF9544@redhat.com \
    --to=teigland@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).