Gitweb: http://git.fedorahosted.org/git/?p=cluster.git;a=commitdiff;h=60dd70f0644493... Commit: 60dd70f06444939ea14bb6a40cfb61ab1eea9616 Parent: 6e4fb7809d4146929c22b8683cb436d38fccdf1d Author: Christine Caulfield ccaulfie@redhat.com AuthorDate: Mon Apr 8 16:11:51 2013 +0100 Committer: Christine Caulfield ccaulfie@redhat.com CommitterDate: Mon Apr 8 16:11:51 2013 +0100
fenced: get the cman fd before each poll
Prevent a rare but possible spinning in poll on the cman fd.
Resolves rhbz#856214
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 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;
cluster-commits@lists.fedorahosted.org