[Cluster-devel] cluster/fence/fenced agent.c fd.h recover.c

rmccabe at sourceware.org rmccabe at sourceware.org
Fri Oct 26 20:36:49 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	cluster
Changes by:	rmccabe at sourceware.org	2007-10-26 20:36:49

Modified files:
	fence/fenced   : agent.c fd.h recover.c 

Log message:
	patch from Marco Ceci to fix 354421

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/fence/fenced/agent.c.diff?cvsroot=cluster&r1=1.18&r2=1.19
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/fence/fenced/fd.h.diff?cvsroot=cluster&r1=1.26&r2=1.27
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/fence/fenced/recover.c.diff?cvsroot=cluster&r1=1.29&r2=1.30

--- cluster/fence/fenced/agent.c	2007/10/26 18:46:16	1.18
+++ cluster/fence/fenced/agent.c	2007/10/26 20:36:49	1.19
@@ -302,11 +302,23 @@
 	cman_finish(ch);
 }
 
-int dispatch_fence_agent(int cd, char *victim)
+int dispatch_fence_agent(char *victim, int force)
 {
 	char *method = NULL, *device = NULL;
 	char *victim_nodename = NULL;
-	int num_methods, num_devices, m, d, error = -1;
+	int num_methods, num_devices, m, d, error = -1, cd;
+
+	if (force)
+		cd = ccs_force_connect(NULL, 0);
+	else {
+		while ((cd = ccs_connect()) < 0)
+			sleep(1);
+	}
+
+	if (cd < 0) {
+		syslog(LOG_ERR, "cannot connect to ccs %d\n", cd);
+		return -1;
+	}
 
 	if (ccs_lookup_nodename(cd, victim, &victim_nodename) == 0)
 		victim = victim_nodename;
@@ -316,8 +328,23 @@
 	for (m = 0; m < num_methods; m++) {
 
 		error = get_method(cd, victim, m, &method);
+
+		/* if the connection timed out while we were trying 
+		 * to fence, try to open the connection again
+		 */
+		if (error == -EBADR) {
+			syslog(LOG_INFO, "ccs connection timed out, "
+				"retrying\n");
+
+			while ((cd = ccs_connect()) < 0)
+				sleep(1);
+			
+			error = get_method(cd, victim, m, &method);
+
 		if (error)
 			continue;
+		} else if (error)
+			continue;
 
 		/* if num_devices is zero we should return an error */
 		error = -1;
@@ -348,6 +375,8 @@
 			break;
 	}
 
+	ccs_disconnect(cd);
+
 	return error;
 }
 
--- cluster/fence/fenced/fd.h	2007/02/22 16:12:42	1.26
+++ cluster/fence/fenced/fd.h	2007/10/26 20:36:49	1.27
@@ -2,7 +2,7 @@
 *******************************************************************************
 **
 **  Copyright (C) Sistina Software, Inc.  1997-2003  All rights reserved.
-**  Copyright (C) 2004 Red Hat, Inc.  All rights reserved.
+**  Copyright (C) 2004-2007 Red Hat, Inc.  All rights reserved.
 **  
 **  This copyrighted material is made available to anyone wishing to use,
 **  modify, copy, or redistribute it subject to the terms and conditions
@@ -176,7 +176,7 @@
 void do_recovery_done(fd_t *fd);
 
 /* agent.c */
-int dispatch_fence_agent(int cd, char *victim);
+int dispatch_fence_agent(char *victim, int force);
 
 /* group.c */
 int setup_groupd(void);
--- cluster/fence/fenced/recover.c	2007/09/18 20:53:47	1.29
+++ cluster/fence/fenced/recover.c	2007/10/26 20:36:49	1.30
@@ -2,7 +2,7 @@
 *******************************************************************************
 **
 **  Copyright (C) Sistina Software, Inc.  1997-2003  All rights reserved.
-**  Copyright (C) 2004 Red Hat, Inc.  All rights reserved.
+**  Copyright (C) 2004-2007 Red Hat, Inc.  All rights reserved.
 **
 **  This copyrighted material is made available to anyone wishing to use,
 **  modify, copy, or redistribute it subject to the terms and conditions
@@ -12,7 +12,6 @@
 ******************************************************************************/
 
 #include "fd.h"
-#include "ccs.h"
 #include <sys/time.h>
 #include <sys/types.h>
 #include <sys/select.h>
@@ -359,7 +358,7 @@
 {
 	fd_node_t *node;
 	char *master_name;
-	int master, error, cd;
+	int master, error;
 	int override = -1;
 
 	master = find_master_nodeid(fd, &master_name);
@@ -372,9 +371,6 @@
 
 	delay_fencing(fd, start_type);
 
-	while ((cd = ccs_connect()) < 0)
-		sleep(1);
-
 	while (!list_empty(&fd->victims)) {
 		node = list_entry(fd->victims.next, fd_node_t, list);
 
@@ -388,7 +384,7 @@
 		log_debug("fencing node %s", node->name);
 		syslog(LOG_INFO, "fencing node \"%s\"", node->name);
 
-		error = dispatch_fence_agent(cd, node->name);
+		error = dispatch_fence_agent(node->name, 0);
 
 		syslog(LOG_INFO, "fence \"%s\" %s", node->name,
 		       error ? "failed" : "success");
@@ -415,8 +411,6 @@
 		}
 		close_override(&override, comline.override_path);
 	}
-
-	ccs_disconnect(cd);
 }
 
 static void add_victims(fd_t *fd, int start_type, int member_count,




More information about the Cluster-devel mailing list