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