[Cluster-devel] cluster/rgmanager ChangeLog include/resgroup.h ...
lhh at sourceware.org
lhh at sourceware.org
Fri Oct 6 21:22:28 UTC 2006
CVSROOT: /cvs/cluster
Module name: cluster
Changes by: lhh at sourceware.org 2006-10-06 21:22:28
Modified files:
rgmanager : ChangeLog
rgmanager/include: resgroup.h
rgmanager/src/daemons: groups.c main.c
rgmanager/src/utils: clustat.c
Log message:
Fix #202497
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/ChangeLog.diff?cvsroot=cluster&r1=1.27&r2=1.28
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/include/resgroup.h.diff?cvsroot=cluster&r1=1.14&r2=1.15
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/groups.c.diff?cvsroot=cluster&r1=1.23&r2=1.24
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/main.c.diff?cvsroot=cluster&r1=1.32&r2=1.33
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/utils/clustat.c.diff?cvsroot=cluster&r1=1.23&r2=1.24
--- cluster/rgmanager/ChangeLog 2006/09/27 18:58:53 1.27
+++ cluster/rgmanager/ChangeLog 2006/10/06 21:22:27 1.28
@@ -1,3 +1,13 @@
+2006-10-06 Lon Hohberger <lhh at redhat.com>
+ * src/daemons/main.c: Fix #202497: provide rgmanager's view of
+ who is running rgmanager to clustat.
+ * src/daemons/groups.c: Fix tiny memory leak during configuration
+ changes
+ * include/resgroup.h: #202497: Flip unused RG_STATUS_INQUIRY to
+ RG_STATUS_NODE.
+ * src/utils/clustat.c: #202497: Send RG_STATUS_NODE to clurgmgrd
+ in order to obtain rgmanager "group" status information
+
2006-09-27 Lon Hohberger <lhh at redhat.com>
* src/daemons/rg_state.c: Fix #208011 - failed->disabled state
transition. Fix node ID type.
--- cluster/rgmanager/include/resgroup.h 2006/09/01 19:02:21 1.14
+++ cluster/rgmanager/include/resgroup.h 2006/10/06 21:22:27 1.15
@@ -68,7 +68,7 @@
#define RG_EXITING 9
#define RG_INIT 10
#define RG_ENABLE 11
-#define RG_STATUS_INQUIRY 12
+#define RG_STATUS_NODE 12
#define RG_RELOCATE 13
#define RG_CONDSTOP 14
#define RG_CONDSTART 15
--- cluster/rgmanager/src/daemons/groups.c 2006/09/27 16:28:41 1.23
+++ cluster/rgmanager/src/daemons/groups.c 2006/10/06 21:22:27 1.24
@@ -1228,6 +1228,7 @@
pthread_mutex_lock(&config_mutex);
config_version = atoi(val);
pthread_mutex_unlock(&config_mutex);
+ free(val);
}
clulog(LOG_DEBUG, "Building Resource Trees\n");
--- cluster/rgmanager/src/daemons/main.c 2006/09/27 16:28:41 1.32
+++ cluster/rgmanager/src/daemons/main.c 2006/10/06 21:22:27 1.33
@@ -87,6 +87,26 @@
void
+send_node_states(msgctx_t *ctx)
+{
+ int x;
+ generic_msg_hdr hdr;
+ cluster_member_list_t *ml = member_list();
+
+ for (x = 0; x < ml->cml_count; x++) {
+ if (ml->cml_members[x].cn_member == 1) {
+ msg_send_simple(ctx, RG_STATUS_NODE,
+ ml->cml_members[x].cn_nodeid, 0);
+ }
+ }
+ msg_send_simple(ctx, RG_SUCCESS,
+ ml->cml_members[x].cn_nodeid, 0);
+ msg_receive(ctx, &hdr, sizeof(hdr), 10);
+ free_member_list(ml);
+}
+
+
+void
flag_reconfigure(int sig)
{
need_reconfigure++;
@@ -417,8 +437,13 @@
switch (msg_hdr->gh_command) {
case RG_STATUS:
clulog(LOG_DEBUG, "Sending service states to CTX%p\n",ctx);
- send_rg_states(ctx, msg_hdr->gh_arg1);
- need_close = 0;
+ if (send_rg_states(ctx, msg_hdr->gh_arg1) == 0)
+ need_close = 0;
+ break;
+
+ case RG_STATUS_NODE:
+ clulog(LOG_DEBUG, "Sending node states to CTX%p\n",ctx);
+ send_node_states(ctx);
break;
case RG_LOCK:
--- cluster/rgmanager/src/utils/clustat.c 2006/09/27 16:43:39 1.23
+++ cluster/rgmanager/src/utils/clustat.c 2006/10/06 21:22:28 1.24
@@ -43,6 +43,94 @@
} rg_state_list_t;
+void
+flag_rgmanager_nodes(cluster_member_list_t *cml)
+{
+ msgctx_t ctx;
+ int max = 0, n;
+ generic_msg_hdr *msgp;
+ fd_set rfds;
+
+ struct timeval tv;
+
+ if (msg_open(MSG_SOCKET, 0, 0, &ctx, 10) < 0)
+ return;
+
+ msg_send_simple(&ctx, RG_STATUS_NODE, 0, 0);
+
+ while (1) {
+ FD_ZERO(&rfds);
+ msg_fd_set(&ctx, &rfds, &max);
+ tv.tv_sec = 10;
+ tv.tv_usec = 0;
+
+ n = select(max+1, &rfds, NULL, NULL, &tv);
+ if (n == 0) {
+ fprintf(stderr, "Timed out waiting for a response "
+ "from Resource Group Manager\n");
+ break;
+ }
+
+ if (n < 0) {
+ if (errno == EAGAIN ||
+ errno == EINTR)
+ continue;
+ fprintf(stderr, "Failed to receive "
+ "service data: select: %s\n",
+ strerror(errno));
+ break;
+ }
+
+ n = msg_receive_simple(&ctx, &msgp, tv.tv_sec);
+
+ if (n < 0) {
+ if (errno == EAGAIN)
+ continue;
+ perror("msg_receive_simple");
+ break;
+ }
+ if (n < sizeof(generic_msg_hdr)) {
+ printf("Error: Malformed message\n");
+ break;
+ }
+
+ if (!msgp) {
+ printf("Error: no message?!\n");
+ break;
+ }
+
+ swab_generic_msg_hdr(msgp);
+
+ if (msgp->gh_command == RG_FAIL) {
+ printf("Member states unavailable: %s\n",
+ rg_strerror(msgp->gh_arg1));
+ free(msgp);
+ msg_close(&ctx);
+ return;
+ }
+
+ if (msgp->gh_command == RG_SUCCESS) {
+ free(msgp);
+ break;
+ }
+
+ for (n = 0; n < cml->cml_count; n++) {
+ if (cml->cml_members[n].cn_nodeid != msgp->gh_arg1)
+ continue;
+ cml->cml_members[n].cn_member |= FLAG_RGMGR;
+ }
+
+ free(msgp);
+ msgp = NULL;
+ }
+
+ msg_send_simple(&ctx, RG_SUCCESS, 0, 0);
+ msg_close(&ctx);
+
+ return;
+}
+
+
rg_state_list_t *
rg_state_list(int local_node_id, int fast)
{
@@ -791,6 +879,9 @@
membership = build_member_list(ch, &local_node_id);
rgs = rg_state_list(local_node_id, fast);
+ if (rgs) {
+ flag_rgmanager_nodes(membership);
+ }
if (refresh_sec) {
setupterm((char *) 0, STDOUT_FILENO, (int *) 0);
More information about the Cluster-devel
mailing list