[Cluster-devel] cluster/fence/agents/xvm fence_xvmd.c

lhh at sourceware.org lhh at sourceware.org
Wed Jan 10 20:25:59 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	cluster
Branch: 	RHEL5
Changes by:	lhh at sourceware.org	2007-01-10 20:25:58

Modified files:
	fence/agents/xvm: fence_xvmd.c 

Log message:
	Resolves: #221210
	Allows fence_xvm to respond even if the virtual machine has never existed in the cluster.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/fence/agents/xvm/fence_xvmd.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.4.2.3&r2=1.4.2.4

--- cluster/fence/agents/xvm/fence_xvmd.c	2006/12/04 17:26:09	1.4.2.3
+++ cluster/fence/agents/xvm/fence_xvmd.c	2007/01/10 20:25:58	1.4.2.4
@@ -409,7 +409,7 @@
 		goto out;
 
 	for (x = 0; x < actual; x++)
-		if (nodes[x].cn_nodeid > high)
+		if (nodes[x].cn_nodeid > high && nodes[x].cn_member)
 			high = nodes[x].cn_nodeid;
 
 	*high_id = high;
@@ -487,19 +487,28 @@
 	uint64_t fence_time;
 	char ret = 1;
 	cman_node_t node;
+	
 
 	if (get_domain_state_ckpt(h, data->domain, &vst) < 0) {
-		printf("XXX I have no record of that domain\n");
-		return;
+		printf("Evaluating Domain: %s   Last Owner/State Unknown\n",
+		       data->domain);
+		memset(&vst, 0, sizeof(vst));
+	} else {
+		printf("Evaluating Domain: %s   Last Owner: %d   State %d\n",
+		       data->domain, vst.s_owner, vst.s_state);
 	}
-
-	printf("Evaluating Domain: %s   Last Owner: %d   State %d\n",
-	       data->domain, vst.s_owner, vst.s_state);
 			
-	if (get_cman_ids(ch, NULL, &high_id) < 0)
+	if (get_cman_ids(ch, NULL, &high_id) < 0) {
+		printf("Error: Could not determine high node ID; unable to "
+		       "process fencing request\n");
 		return;
-
-	if (my_id == high_id && vst.s_owner != my_id) {
+	}
+	
+	if (my_id == high_id && vst.s_owner == 0) {
+		printf("There is no record of that domain; "
+		       "returning success\n");
+		ret = 0;
+	} else if (my_id == high_id && vst.s_owner != my_id) {
 
 		memset(&node, 0, sizeof(node));
 		cman_get_node(ch, vst.s_owner, &node);
@@ -547,7 +556,7 @@
 
 
 int
-xvmd_loop(void *h, int fd, fence_xvm_args_t *args,
+xvmd_loop(cman_handle_t ch, void *h, int fd, fence_xvm_args_t *args,
 	  void *key, size_t key_len)
 {
 	fd_set rfds;
@@ -559,23 +568,25 @@
 	socklen_t slen;
 	fence_req_t data;
 	virConnectPtr vp;
-	virt_list_t *vl;
-	virt_state_t *dom;
-	cman_handle_t ch;
+	virt_list_t *vl = NULL;
+	virt_state_t *dom = NULL;
 
 	vp = virConnectOpen(NULL);
-	if (!vp) {
+	if (!vp)
 		perror("virConnectOpen");
-		return -1;
-	}
-
-	ch = cman_init(NULL);
 
 	get_cman_ids(ch, &my_id, NULL);
 	printf("My Node ID = %d\n", my_id);
-
-	vl = vl_get(vp, my_id);
-	vl_print(vl);
+	
+	if (vp) {
+		vl = vl_get(vp, my_id);
+		vl_print(vl);
+		virt_list_update(vp, &vl, my_id);
+		if (args->flags & F_USE_UUID) 
+			store_domains_by_uuid(h, vl);
+		else
+			store_domains_by_name(h, vl);
+	}
 
 	while (running) {
 		FD_ZERO(&rfds);
@@ -583,19 +594,38 @@
 		tv.tv_sec = 10;
 		tv.tv_usec = 0;
 
+		/* Close the connection */
+		if (vp) {
+			virConnectClose(vp);
+			vp = NULL;
+		}
+		
 		n = select(fd+1, &rfds, NULL, NULL, &tv);
 		if (n < 0)
 			continue;
-		if (n == 0) {
-			virt_list_update(vp, &vl, my_id);
-			vl_print(vl);
-			/* Store information here */
-			if (args->flags & F_USE_UUID) 
-				store_domains_by_uuid(h, vl);
-			else
-				store_domains_by_name(h, vl);
+	
+		/* Request and/or timeout: open connection */
+		vp = virConnectOpen(NULL);
+		if (!vp) {
+			printf("NOTICE: virConnectOpen(): %s; cannot fence!\n",
+			       strerror(errno));
 			continue;
 		}
+			
+		/* Update list of VMs from libvirt. */
+		virt_list_update(vp, &vl, my_id);
+		vl_print(vl);
+		/* Store information here */
+		if (args->flags & F_USE_UUID) 
+			store_domains_by_uuid(h, vl);
+		else
+			store_domains_by_name(h, vl);
+		
+		/* 
+		 * If no requests, we're done 
+		 */
+		if (n == 0)
+			continue;
 
 		slen = sizeof(sin);
 		len = recvfrom(fd, &data, sizeof(data), 0,
@@ -626,11 +656,7 @@
 		}
 
 		printf("Request to fence: %s\n", data.domain);
-
-		/* Do a quick update to make sure we're current */
-		virt_list_update(vp, &vl, my_id);
-		vl_print(vl);
-
+		
 		if (args->flags & F_USE_UUID)
 			dom = vl_find_uuid(vl, (char *)data.domain);
 		else
@@ -659,7 +685,11 @@
 	}
 
 	cman_finish(ch);
-	virConnectClose(vp);
+	
+	if (vp) {
+		virConnectClose(vp);
+		vp = NULL;
+	}
 
 	return 0;
 }
@@ -671,8 +701,9 @@
 	fence_xvm_args_t args;
 	int mc_sock;
 	char key[4096];
-	int key_len = 0;
+	int key_len = 0, x;
 	char *my_options = "dfi:a:p:C:c:k:u?hV";
+	cman_handle_t ch;
 	void *h;
 
 	args_init(&args);
@@ -726,12 +757,33 @@
 		printf("Could not initialize NSS\n");
 		return 1;
 	}
-
-	h = ckpt_init("vm_states", 262144, 4096, 64, 10);
-	if (!h) {
-		printf("Could not initialize Checkpoint\n");
-		return 1;
+	
+	/* Wait for cman to start. */
+	x = 0;
+	while ((ch = cman_init(NULL)) == NULL) {
+		if (!x) {
+			printf("Could not connect to CMAN; retrying...\n");
+			x = 1;
+		}
+		sleep(3);
+	}
+	if (x)
+		printf("Connected to CMAN\n");
+	/* Wait for quorum */
+	while (!cman_is_quorate(ch))
+		sleep(3);
+
+	/* Wait for openais checkpointing to become available */
+	x = 0;
+	while ((h = ckpt_init("vm_states", 262144, 4096, 64, 10)) == NULL) {
+		if (!x) {
+			printf("Could not initialize saCkPt; retrying...\n");
+			x = 1;
+		}
+		sleep(3);
 	}
+	if (x)
+		printf("Checkpoint initialized\n");
 
 	if (args.family == PF_INET)
 		mc_sock = ipv4_recv_sk(args.addr, args.port);
@@ -742,7 +794,7 @@
 		return 1;
 	}
 
-	xvmd_loop(h, mc_sock, &args, key, key_len);
+	xvmd_loop(ch, h, mc_sock, &args, key, key_len);
 
 	return 0;
 }




More information about the Cluster-devel mailing list