[Cluster-devel] cluster/rgmanager ChangeLog errors.txt init.d/ ...

lhh at sourceware.org lhh at sourceware.org
Thu Sep 7 18:39:47 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	cluster
Branch: 	RHEL4
Changes by:	lhh at sourceware.org	2006-09-07 18:39:45

Modified files:
	rgmanager      : ChangeLog errors.txt 
	rgmanager/init.d: rgmanager 
	rgmanager/src/daemons: main.c 
	rgmanager/src/utils: clustat.c 

Log message:
	2006-09-07 Lon Hohberger <lhh at redhat.com>
	* src/daemons/main.c, init.d/rgmanager: Make rgmanager init script
	report failure correctly in most cases. (#193603)
	* src/utils/clustat.c: Fix #146924 - segfault if cman is not
	in a state to give out member lists

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/ChangeLog.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.5.2.20&r2=1.5.2.21
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/errors.txt.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.4&r2=1.1.2.5
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/init.d/rgmanager.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.3.2.2&r2=1.3.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/main.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.9.2.17&r2=1.9.2.18
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/utils/clustat.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.5.2.13&r2=1.5.2.14

--- cluster/rgmanager/ChangeLog	2006/06/21 18:34:19	1.5.2.20
+++ cluster/rgmanager/ChangeLog	2006/09/07 18:39:45	1.5.2.21
@@ -1,3 +1,9 @@
+2006-09-07 Lon Hohberger <lhh at redhat.com>
+	* src/daemons/main.c, init.d/rgmanager: Make rgmanager init script
+	report failure correctly in most cases. (#193603)
+	* src/utils/clustat.c: Fix #146924 - segfault if cman is not
+	in a state to give out member lists
+
 2006-06-21 Lon Hohberger <lhh at redhat.com>
 	* src/daemons/nodeevent.c: Don't use the rg thread refcount in
 	node event handling (#194491)
--- cluster/rgmanager/errors.txt	2005/03/21 22:01:30	1.1.2.4
+++ cluster/rgmanager/errors.txt	2006/09/07 18:39:45	1.1.2.5
@@ -76,7 +76,9 @@
 The resource group manager was unable to find a plugin which was able to
 talk to the cluster infrastructure.  Generally, this occurs when no cluster
 infrastruture is running.  Try starting the preferred cluster infrastructure
-for your configuration (e.g. CMAN+DLM, GuLM) and restarting rgmanager.
+for your configuration (e.g. CMAN+DLM, GuLM) and restarting rgmanager.  This
+can also occur if CMAN is loaded, while DLM is not.  Rgmanager (really,
+the SM magma plugin) requires that the DLM be loaded prior to starting.
 
 #10: Couldn't set up listen socket
 
--- cluster/rgmanager/init.d/rgmanager	2006/05/12 21:28:30	1.3.2.2
+++ cluster/rgmanager/init.d/rgmanager	2006/09/07 18:39:45	1.3.2.3
@@ -93,6 +93,7 @@
 
 case $1 in
 	start)
+		[ -z "$RGMGR_OPTS" ] && RGMGR_OPTS="-t 30"
 		echo -n $"Starting $ID: "
 		daemon $RGMGRD $RGMGR_OPTS
 		echo
--- cluster/rgmanager/src/daemons/main.c	2006/05/26 17:39:32	1.9.2.17
+++ cluster/rgmanager/src/daemons/main.c	2006/09/07 18:39:45	1.9.2.18
@@ -706,22 +706,60 @@
 }
 
 
+void
+wait_for_status(int pid, int fd, int timeout)
+{
+	struct timeval tv;
+	fd_set rfds;
+	int err;
+	
+	FD_ZERO(&rfds);
+	FD_SET(fd, &rfds);
+	tv.tv_sec = timeout;
+	tv.tv_usec = 0;
+
+	if (select(fd + 1, &rfds, NULL, NULL, &tv) == 1) {
+		err = 0;
+		read(fd, &err, sizeof(err));
+		exit(!!err);
+		/* could put in messages for waiting */
+	}
+	exit(1);
+}
+
+
+#define notify_status(value) \
+do { \
+	if (waittime) { \
+		waiter = value; \
+		write(waitpipe[1], &waiter, sizeof(waiter)); \
+		close(waitpipe[0]); \
+		close(waitpipe[1]); \
+	} \
+} while(0)
+
+
 int
 main(int argc, char **argv)
 {
 	int cluster_fd, rv;
 	char foreground = 0;
 	int quorate;
-	int listen_fds[2], listeners;
+	int listen_fds[2], listeners, waittime = 0, waitpipe[2];
+	int waiter;
 	uint64_t myNodeID;
 
-	while ((rv = getopt(argc, argv, "fd")) != EOF) {
+	while ((rv = getopt(argc, argv, "fdt:")) != EOF) {
 		switch (rv) {
 		case 'd':
 			debug = 1;
 			break;
 		case 'f':
 			foreground = 1;
+		case 't':
+			waittime = atoi(optarg);
+			if (waittime < 0)
+				waittime = 0;
 		default:
 			break;
 		}
@@ -736,6 +774,16 @@
 		clu_log_console(1);
 
 	if (!foreground && (geteuid() == 0)) {
+		if (waittime) {
+			waitpipe[0] = -1;
+			waitpipe[1] = -1;
+			pipe(waitpipe);
+			waiter = fork();
+			if (waiter > 0)
+				wait_for_status(waiter, waitpipe[0], waittime);
+			/* notreached by parent */
+		}
+			
 		daemon_init(argv[0]);
 		if (!debug && !watchdog_init())
 			clulog(LOG_NOTICE, "Failed to start watchdog\n");
@@ -756,6 +804,7 @@
 
 	if (init_resource_groups(0) != 0) {
 		clulog(LOG_CRIT, "#8: Couldn't initialize services\n");
+		notify_status(1);
 		return -1;
 	}
 
@@ -766,6 +815,7 @@
 	if (cluster_fd < 0) {
 		clu_log_console(1);
 		clulog(LOG_CRIT, "#9: Couldn't connect to cluster\n");
+		notify_status(2);
 		return -1;
 	}
    	msg_set_purpose(cluster_fd, MSGP_CLUSTER);
@@ -786,6 +836,7 @@
 	if ((listeners = msg_listen(RG_PORT, RG_PURPOSE,
 				    listen_fds, 2)) <= 0) {
 		clulog(LOG_CRIT, "#10: Couldn't set up listen socket\n");
+		notify_status(3);
 		return -1;
 	}
 
@@ -810,6 +861,7 @@
 	 */
 	if (vf_init(myNodeID, RG_VF_PORT, NULL, NULL) != 0) {
 		clulog(LOG_CRIT, "#11: Couldn't set up VF listen socket\n");
+		notify_status(4);
 		return -1;
 	}
 
@@ -839,6 +891,8 @@
 	/*
 	   Do everything useful
 	 */
+	notify_status(0);
+
 	while (running)
 		event_loop(cluster_fd);
 
--- cluster/rgmanager/src/utils/clustat.c	2006/05/26 15:32:00	1.5.2.13
+++ cluster/rgmanager/src/utils/clustat.c	2006/09/07 18:39:45	1.5.2.14
@@ -486,6 +486,11 @@
 {
 	int x;
 
+	if (!membership) {
+		printf("Membership information not available\n");
+		return;
+	}
+
 	printf("  %-40.40s %s\n", "Member Name", "Status");
 	printf("  %-40.40s %s\n", "------ ----", "------");
 
@@ -504,8 +509,10 @@
 {
 	int x;
 
-	if (!membership)
+	if (!membership) {
+		printf("  <nodes/>\n");
 		return;
+	}
 
 	printf("  <nodes>\n");
 	for (x = 0; x < membership->cml_count; x++) {
@@ -608,6 +615,10 @@
 	/* Grab the local node ID and flag it from the list of reported
 	   online nodes */
 	clu_local_nodeid(NULL, lid);
+
+	if (!all)
+		return NULL;
+
 	for (x=0; x<all->cml_count; x++) {
 		if (all->cml_members[x].cm_id == *lid) {
 			m = &all->cml_members[x];




More information about the Cluster-devel mailing list