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