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