From mboxrd@z Thu Jan 1 00:00:00 1970 From: lhh@sourceware.org Date: 7 Sep 2006 18:39:47 -0000 Subject: [Cluster-devel] cluster/rgmanager ChangeLog errors.txt init.d/ ... Message-ID: <20060907183947.27727.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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 * 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 + * 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 * 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(" \n"); return; + } printf(" \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; xcml_count; x++) { if (all->cml_members[x].cm_id == *lid) { m = &all->cml_members[x];