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

David Teigland teigland at fedoraproject.org
Wed Oct 24 19:58:50 UTC 2012


Gitweb:        http://git.fedorahosted.org/git/?p=cluster.git;a=commitdiff;h=1b420aa98fce71f123480dd4eae31e0eb466e864
Commit:        1b420aa98fce71f123480dd4eae31e0eb466e864
Parent:        13dcbb8265eafcdf69c033f45f2a37aa44b18908
Author:        Christine Caulfield <ccaulfie at redhat.com>
AuthorDate:    Wed Oct 24 14:55:00 2012 -0500
Committer:     David Teigland <teigland at redhat.com>
CommitterDate: Wed Oct 24 14:55:00 2012 -0500

fenced: get the cman fd before each poll

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

bz 857952

Signed-off-by: Christine Caulfield <ccaulfie 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 0be3332..205836c 100644
--- a/fence/fenced/fd.h
+++ b/fence/fenced/fd.h
@@ -270,6 +270,7 @@ int name_to_nodeid(char *name);
 struct node *get_new_node(struct fd *fd, int nodeid);
 void kick_node_from_cluster(int nodeid);
 void set_cman_dirty(void);
+int get_cman_fd(void);
 
 /* recover.c */
 
diff --git a/fence/fenced/main.c b/fence/fenced/main.c
index 827dab6..8e4f10b 100644
--- a/fence/fenced/main.c
+++ b/fence/fenced/main.c
@@ -739,6 +739,7 @@ void cluster_dead(int ci)
 static void loop(void)
 {
 	int rv, i;
+	int cman_fd_pos;
 	void (*workfn) (int ci);
 	void (*deadfn) (int ci);
 
@@ -754,7 +755,7 @@ static void loop(void)
 	rv = setup_cluster();
 	if (rv < 0)
 		goto out;
-	client_add(rv, process_cluster, cluster_dead);
+	cman_fd_pos = client_add(rv, process_cluster, cluster_dead);
 
 	rv = setup_ccs();
 	if (rv < 0)
@@ -804,6 +805,8 @@ static void loop(void)
 	}
 
 	for (;;) {
+		/* We need to re-get the cman FD each time */
+		pollfd[cman_fd_pos].fd = get_cman_fd();
 		rv = poll(pollfd, client_maxi + 1, -1);
 		if (rv == -1 && errno == EINTR) {
 			if (daemon_quit && list_empty(&domains))
diff --git a/fence/fenced/member_cman.c b/fence/fenced/member_cman.c
index ee879be..a7f4341 100644
--- a/fence/fenced/member_cman.c
+++ b/fence/fenced/member_cman.c
@@ -12,6 +12,11 @@ static int		old_node_count;
 static cman_node_t	cman_nodes[MAX_NODES];
 static int		cman_node_count;
 
+int get_cman_fd(void)
+{
+	return cman_get_fd(ch);
+}
+
 void set_cman_dirty(void)
 {
 	int rv;


More information about the cluster-commits mailing list