cluster: RHEL59 - fenced: get the cman fd before each poll

Fabio M. Di Nitto fabbione at fedoraproject.org
Fri Apr 12 07:20:29 UTC 2013


Gitweb:        http://git.fedorahosted.org/git/?p=cluster.git;a=commitdiff;h=c830187908b759b5b5203efc0fa441fc401b7f1b
Commit:        c830187908b759b5b5203efc0fa441fc401b7f1b
Parent:        444a46c80e3ee12544eb8960fdea9f7cefc78d1e
Author:        Christine Caulfield <ccaulfie at redhat.com>
AuthorDate:    Mon Apr 8 16:11:51 2013 +0100
Committer:     Fabio M. Di Nitto <fdinitto at redhat.com>
CommitterDate: Fri Apr 12 09:19:51 2013 +0200

fenced: get the cman fd before each poll

Prevent a rare but possible spinning in poll on the
cman fd.

Resolves rhbz#951049

Signed-off-by: Christine Caulfield <ccaulfie at redhat.com>
Signed-off-by: Fabio M. Di Nitto <fdinitto at redhat.com>
---
 fence/fenced/fd.h          |    1 +
 fence/fenced/main.c        |    5 ++++-
 fence/fenced/member_cman.c |    5 +++++
 3 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/fence/fenced/fd.h b/fence/fenced/fd.h
index c4204c8..584367c 100644
--- a/fence/fenced/fd.h
+++ b/fence/fenced/fd.h
@@ -197,5 +197,6 @@ int is_member(char *name);
 int is_fenced(char *name);
 fd_node_t *get_new_node(fd_t *fd, int nodeid, char *in_name);
 void update_cman(char *victim, char *agent);
+int get_member_fd(void);
 
 #endif				/*  __FD_DOT_H__  */
diff --git a/fence/fenced/main.c b/fence/fenced/main.c
index 3d553b2..72961f5 100644
--- a/fence/fenced/main.c
+++ b/fence/fenced/main.c
@@ -531,6 +531,7 @@ static int setup_listen(void)
 static int loop(void)
 {
 	int rv, i, f, maxi = 0, listen_fd, member_fd, groupd_fd;
+	int cluster_fd_pos;
 
 	rv = listen_fd = setup_listen();
 	if (rv < 0)
@@ -540,7 +541,7 @@ static int loop(void)
 	rv = member_fd = setup_member();
 	if (rv < 0)
 		goto out;
-	client_add(member_fd, &maxi);
+	cluster_fd_pos = client_add(member_fd, &maxi);
 
 	rv = groupd_fd = setup_groupd();
 	if (rv < 0)
@@ -551,6 +552,8 @@ static int loop(void)
 		  listen_fd, member_fd, groupd_fd);
 
 	for (;;) {
+                /* We need to re-get the cluster FD eac time */
+		pollfd[cluster_fd_pos].fd = get_member_fd();
 		rv = poll(pollfd, maxi + 1, -1);
 		if (rv < 0) {
 			if (errno == EINTR)
diff --git a/fence/fenced/member_cman.c b/fence/fenced/member_cman.c
index 6ef74c3..8086af4 100644
--- a/fence/fenced/member_cman.c
+++ b/fence/fenced/member_cman.c
@@ -241,6 +241,11 @@ void exit_member(void)
 	cman_finish(ch);
 }
 
+int get_member_fd()
+{
+	return cman_get_fd(ch);
+}
+
 int is_member(char *name)
 {
 	cman_node_t *cn;


More information about the cluster-commits mailing list