public inbox for cluster-cvs@sourceware.org
help / color / mirror / Atom feed
* master - daemons/tools: misc minor cleanups and improvements
@ 2008-10-08 20:06 David Teigland
0 siblings, 0 replies; only message in thread
From: David Teigland @ 2008-10-08 20:06 UTC (permalink / raw)
To: cluster-cvs-relay
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=b6d73f5752306d635f306036438af1fcf26f4332
Commit: b6d73f5752306d635f306036438af1fcf26f4332
Parent: aa24deb8511d8fca8e027a954747648a04ad7988
Author: David Teigland <teigland@redhat.com>
AuthorDate: Wed Oct 8 14:46:46 2008 -0500
Committer: David Teigland <teigland@redhat.com>
CommitterDate: Wed Oct 8 14:46:46 2008 -0500
daemons/tools: misc minor cleanups and improvements
fenced/fence_tool: fix and improve output of ls
daemons: don't attempt cpg exit cleanup after cluster goes down
daemons: fix lazy memset size args to avoid mistakes
dlm_controld: clean up daemon cpg on exit
Signed-off-by: David Teigland <teigland@redhat.com>
---
fence/fence_tool/fence_tool.c | 35 ++++++++++++++++++++++++++++---
fence/fenced/cpg.c | 43 ++++++++++++++++++++++++--------------
fence/fenced/fd.h | 2 +
fence/fenced/main.c | 2 +
fence/fenced/member_cman.c | 2 +-
group/daemon/main.c | 4 ++-
group/dlm_controld/cpg.c | 25 ++++++++++++++++++++++
group/dlm_controld/dlm_daemon.h | 2 +
group/dlm_controld/group.c | 7 +++--
group/dlm_controld/main.c | 6 ++++-
group/gfs_controld/cpg-new.c | 2 +-
group/gfs_controld/cpg-old.c | 4 +-
group/gfs_controld/gfs_daemon.h | 1 +
group/gfs_controld/main.c | 2 +
14 files changed, 108 insertions(+), 29 deletions(-)
diff --git a/fence/fence_tool/fence_tool.c b/fence/fence_tool/fence_tool.c
index b4ce113..e12c398 100644
--- a/fence/fence_tool/fence_tool.c
+++ b/fence/fence_tool/fence_tool.c
@@ -371,8 +371,10 @@ static int node_compare(const void *va, const void *vb)
return a->nodeid - b->nodeid;
}
-#define CGST_WAIT_CONDITIONS 1
-#define CGST_WAIT_MESSAGES 2
+/* copied from fence/fenced/fd.h, should probably be in libfenced.h */
+#define CGST_WAIT_CONDITIONS 1
+#define CGST_WAIT_MESSAGES 2
+#define CGST_WAIT_FENCING 3
static char *wait_str(int state)
{
@@ -383,6 +385,31 @@ static char *wait_str(int state)
return "quorum";
case CGST_WAIT_MESSAGES:
return "messages";
+ case CGST_WAIT_FENCING:
+ return "fencing";
+ }
+ return "unknown";
+}
+
+/* copied from fence/fenced/fd.h, should probably be in libfenced.h */
+#define VIC_DONE_AGENT 1
+#define VIC_DONE_MEMBER 2
+#define VIC_DONE_OVERRIDE 3
+#define VIC_DONE_EXTERNAL 4
+
+static char *how_str(int how)
+{
+ switch (how) {
+ case 0:
+ return "none";
+ case VIC_DONE_AGENT:
+ return "agent";
+ case VIC_DONE_MEMBER:
+ return "member";
+ case VIC_DONE_OVERRIDE:
+ return "override";
+ case VIC_DONE_EXTERNAL:
+ return "external";
}
return "unknown";
}
@@ -444,12 +471,12 @@ static int do_list(void)
np = nodes;
for (i = 0; i < node_count; i++) {
- printf("nodeid %d member %d victim %d last fence master %d how %d\n",
+ printf("nodeid %d member %d victim %d last fence master %d how %s\n",
np->nodeid,
np->member,
np->victim,
np->last_fenced_master,
- np->last_fenced_how);
+ how_str(np->last_fenced_how));
np++;
}
printf("\n");
diff --git a/fence/fenced/cpg.c b/fence/fenced/cpg.c
index 936f787..6d51a78 100644
--- a/fence/fenced/cpg.c
+++ b/fence/fenced/cpg.c
@@ -344,9 +344,15 @@ static void save_history(struct fd *fd, struct fd_info *fi, struct id_info *ids)
id = ids;
for (i = 0; i < fi->id_info_count; i++) {
+ /* create history entries for nodes that were domain members
+ prior to our joining the domain */
+ node_history_init(fd, id->nodeid);
+
node = get_node_history(fd, id->nodeid);
- if (!node)
+ if (!node) {
+ log_error("save_history no nodeid %d", id->nodeid);
goto next;
+ }
if (!node->fence_time && id->fence_time) {
node->fence_master = id->fence_master;
@@ -1039,6 +1045,8 @@ static void apply_changes(struct fd *fd)
case CGST_WAIT_MESSAGES:
if (wait_messages_done(fd)) {
set_master(fd);
+ cg->state = CGST_WAIT_FENCING; /* for queries */
+
if (fd->master == our_nodeid) {
delay_fencing(fd, nodes_added(fd));
fence_victims(fd);
@@ -1849,7 +1857,7 @@ void close_cpg(void)
struct cpg_name name;
int i = 0;
- if (!cpg_handle_daemon)
+ if (!cpg_handle_daemon || cluster_down)
return;
memset(&name, 0, sizeof(name));
@@ -1872,25 +1880,28 @@ int set_node_info(struct fd *fd, int nodeid, struct fenced_node *nodeinfo)
{
struct node_history *node;
struct member *memb;
+ struct change *cg;
nodeinfo->nodeid = nodeid;
nodeinfo->victim = is_victim(fd, nodeid);
- if (!fd->started_change)
- goto history;
+ if (list_empty(&fd->changes))
+ cg = fd->started_change;
+ else
+ cg = list_first_entry(&fd->changes, struct change, list);
- memb = find_memb(fd->started_change, nodeid);
- if (memb)
- nodeinfo->member = memb->disallowed ? 0 : 1;
+ if (cg) {
+ memb = find_memb(cg, nodeid);
+ if (memb)
+ nodeinfo->member = memb->disallowed ? -1 : 1;
+ }
- history:
node = get_node_history(fd, nodeid);
- if (!node)
- return 0;
-
- nodeinfo->last_fenced_master = node->fence_master;
- nodeinfo->last_fenced_how = node->fence_how;
- nodeinfo->last_fenced_time = node->fence_time;
+ if (node) {
+ nodeinfo->last_fenced_master = node->fence_master;
+ nodeinfo->last_fenced_how = node->fence_how;
+ nodeinfo->last_fenced_time = node->fence_time;
+ }
return 0;
}
@@ -1932,7 +1943,7 @@ int set_domain_nodes(struct fd *fd, int option, int *node_count,
nodes = malloc(count * sizeof(struct fenced_node));
if (!nodes)
return -ENOMEM;
- memset(nodes, 0, sizeof(*nodes));
+ memset(nodes, 0, count * sizeof(struct fenced_node));
n = nodes;
list_for_each_entry(memb, &cg->members, list)
@@ -1946,7 +1957,7 @@ int set_domain_nodes(struct fd *fd, int option, int *node_count,
nodes = malloc(count * sizeof(struct fenced_node));
if (!nodes)
return -ENOMEM;
- memset(nodes, 0, sizeof(*nodes));
+ memset(nodes, 0, count * sizeof(struct fenced_node));
n = nodes;
list_for_each_entry(nh, &fd->node_history, list)
diff --git a/fence/fenced/fd.h b/fence/fenced/fd.h
index 0ebd721..1520838 100644
--- a/fence/fenced/fd.h
+++ b/fence/fenced/fd.h
@@ -61,6 +61,7 @@
extern int daemon_debug_opt;
extern int daemon_quit;
+extern int cluster_down;
extern struct list_head domains;
extern int cman_quorate;
extern int our_nodeid;
@@ -118,6 +119,7 @@ struct fd_header {
#define CGST_WAIT_CONDITIONS 1
#define CGST_WAIT_MESSAGES 2
+#define CGST_WAIT_FENCING 3 /* for queries */
struct change {
struct list_head list;
diff --git a/fence/fenced/main.c b/fence/fenced/main.c
index 909720b..0c1d960 100644
--- a/fence/fenced/main.c
+++ b/fence/fenced/main.c
@@ -722,6 +722,7 @@ void cluster_dead(int ci)
{
log_error("cluster is down, exiting");
daemon_quit = 1;
+ cluster_down = 1;
}
static void loop(void)
@@ -1051,6 +1052,7 @@ void daemon_dump_save(void)
int daemon_debug_opt;
int daemon_quit;
+int cluster_down;
struct list_head domains;
int cman_quorate;
int our_nodeid;
diff --git a/fence/fenced/member_cman.c b/fence/fenced/member_cman.c
index a35e746..1e199f2 100644
--- a/fence/fenced/member_cman.c
+++ b/fence/fenced/member_cman.c
@@ -255,7 +255,7 @@ struct node *get_new_node(struct fd *fd, int nodeid)
node = malloc(sizeof(*node));
if (!node)
return NULL;
- memset(node, 0, sizeof(*node));
+ memset(node, 0, sizeof(struct node));
node->nodeid = nodeid;
diff --git a/group/daemon/main.c b/group/daemon/main.c
index 9f4c88f..c598307 100644
--- a/group/daemon/main.c
+++ b/group/daemon/main.c
@@ -827,7 +827,9 @@ static void loop(void)
close_ccs();
close_cman();
- if (!list_empty(&gd_groups))
+ /* in LIBCPG mode, gd_groups is not empty because of the groups we
+ add to "block" old versions of groupd */
+ if ((group_mode == GROUP_LIBGROUP) && !list_empty(&gd_groups))
log_print("groups abandoned");
}
diff --git a/group/dlm_controld/cpg.c b/group/dlm_controld/cpg.c
index 3f8457e..1d3a369 100644
--- a/group/dlm_controld/cpg.c
+++ b/group/dlm_controld/cpg.c
@@ -2005,6 +2005,31 @@ int setup_cpg(void)
return -1;
}
+void close_cpg(void)
+{
+ cpg_error_t error;
+ struct cpg_name name;
+ int i = 0;
+
+ if (!daemon_cpg_handle || cluster_down)
+ return;
+
+ memset(&name, 0, sizeof(name));
+ sprintf(name.value, "dlm:controld");
+ name.length = strlen(name.value) + 1;
+
+ retry:
+ error = cpg_leave(daemon_cpg_handle, &name);
+ if (error == CPG_ERR_TRY_AGAIN) {
+ sleep(1);
+ if (!(++i % 10))
+ log_error("daemon cpg_leave error retrying");
+ goto retry;
+ }
+ if (error != CPG_OK)
+ log_error("daemon cpg_leave error %d", error);
+}
+
/* fs_controld has seen nodedown for nodeid; it's now ok for dlm to do
recovery for the failed node */
diff --git a/group/dlm_controld/dlm_daemon.h b/group/dlm_controld/dlm_daemon.h
index c704b99..a84f541 100644
--- a/group/dlm_controld/dlm_daemon.h
+++ b/group/dlm_controld/dlm_daemon.h
@@ -67,6 +67,7 @@
extern int daemon_debug_opt;
extern int daemon_quit;
+extern int cluster_down;
extern int poll_fencing;
extern int poll_quorum;
extern int poll_fs;
@@ -235,6 +236,7 @@ int get_weight(int nodeid, char *lockspace);
/* cpg.c */
int setup_cpg(void);
+void close_cpg(void);
void process_cpg(int ci);
int set_protocol(void);
void process_lockspace_changes(void);
diff --git a/group/dlm_controld/group.c b/group/dlm_controld/group.c
index ac6c354..c992683 100644
--- a/group/dlm_controld/group.c
+++ b/group/dlm_controld/group.c
@@ -300,15 +300,16 @@ int set_lockspace_nodes_group(struct lockspace *ls, int option, int *node_count,
struct dlmc_node **nodes_out)
{
struct dlmc_node *nodes = NULL, *nodep;
- int i;
+ int i, len;
if (!ls->cb_member_count)
goto out;
- nodes = malloc(ls->cb_member_count * sizeof(struct dlmc_node));
+ len = ls->cb_member_count * sizeof(struct dlmc_node);
+ nodes = malloc(len);
if (!nodes)
return -ENOMEM;
- memset(nodes, 0, sizeof(*nodes));
+ memset(nodes, 0, len);
nodep = nodes;
for (i = 0; i < ls->cb_member_count; i++) {
diff --git a/group/dlm_controld/main.c b/group/dlm_controld/main.c
index b0eba12..f3ab1f1 100644
--- a/group/dlm_controld/main.c
+++ b/group/dlm_controld/main.c
@@ -157,7 +157,7 @@ static struct lockspace *create_ls(char *name)
ls = malloc(sizeof(*ls));
if (!ls)
goto out;
- memset(ls, 0, sizeof(*ls));
+ memset(ls, 0, sizeof(struct lockspace));
strncpy(ls->name, name, DLM_LOCKSPACE_LEN);
INIT_LIST_HEAD(&ls->changes);
@@ -860,6 +860,7 @@ void cluster_dead(int ci)
{
log_error("cluster is down, exiting");
daemon_quit = 1;
+ cluster_down = 1;
}
static void loop(void)
@@ -999,6 +1000,8 @@ static void loop(void)
out:
if (cfgd_groupd_compat)
close_groupd();
+ if (group_mode == GROUP_LIBCPG)
+ close_cpg();
clear_configfs();
close_logging();
close_ccs();
@@ -1285,6 +1288,7 @@ void daemon_dump_save(void)
int daemon_debug_opt;
int daemon_quit;
+int cluster_down;
int poll_fencing;
int poll_quorum;
int poll_fs;
diff --git a/group/gfs_controld/cpg-new.c b/group/gfs_controld/cpg-new.c
index 1fc06f6..839ff4a 100644
--- a/group/gfs_controld/cpg-new.c
+++ b/group/gfs_controld/cpg-new.c
@@ -3242,7 +3242,7 @@ void close_cpg(void)
struct cpg_name name;
int i = 0;
- if (!cpg_handle_daemon)
+ if (!cpg_handle_daemon || cluster_down)
return;
memset(&name, 0, sizeof(name));
diff --git a/group/gfs_controld/cpg-old.c b/group/gfs_controld/cpg-old.c
index 5949054..192a403 100644
--- a/group/gfs_controld/cpg-old.c
+++ b/group/gfs_controld/cpg-old.c
@@ -1182,7 +1182,7 @@ static int add_member(struct mountgroup *mg, int nodeid)
if (!memb)
return -ENOMEM;
- memset(memb, 0, sizeof(*memb));
+ memset(memb, 0, sizeof(struct mg_member));
memb->nodeid = nodeid;
memb->jid = JID_INIT;
@@ -2414,7 +2414,7 @@ void close_cpg_old(void)
cpg_error_t error;
int i = 0;
- if (!cpg_handle_daemon)
+ if (!cpg_handle_daemon || cluster_down)
return;
memset(&name, 0, sizeof(name));
diff --git a/group/gfs_controld/gfs_daemon.h b/group/gfs_controld/gfs_daemon.h
index c3d4688..7ae26ff 100644
--- a/group/gfs_controld/gfs_daemon.h
+++ b/group/gfs_controld/gfs_daemon.h
@@ -64,6 +64,7 @@
extern int daemon_debug_opt;
extern int daemon_quit;
+extern int cluster_down;
extern int poll_dlm;
extern int poll_ignore_plock;
extern int plock_fd;
diff --git a/group/gfs_controld/main.c b/group/gfs_controld/main.c
index 94d370d..b465239 100644
--- a/group/gfs_controld/main.c
+++ b/group/gfs_controld/main.c
@@ -1067,6 +1067,7 @@ void cluster_dead(int ci)
{
log_error("cluster is down, exiting");
daemon_quit = 1;
+ cluster_down = 1;
}
static void dlmcontrol_dead(int ci)
@@ -1497,6 +1498,7 @@ void daemon_dump_save(void)
int daemon_debug_opt;
int daemon_quit;
+int cluster_down;
int poll_ignore_plock;
int poll_dlm;
int plock_fd;
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2008-10-08 20:06 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-10-08 20:06 master - daemons/tools: misc minor cleanups and improvements David Teigland
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).