This is the mail archive of the
cluster-cvs@sourceware.org
mailing list for the cluster.
master - dlm_controld: queries in libgroup mode
- From: David Teigland <teigland at fedoraproject dot org>
- To: cluster-cvs-relay at redhat dot com
- Date: Fri, 8 Aug 2008 21:55:53 +0000 (UTC)
- Subject: master - dlm_controld: queries in libgroup mode
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=4effc0bac4b5a0f627d57c974a2a936faa90eece
Commit: 4effc0bac4b5a0f627d57c974a2a936faa90eece
Parent: 3b1db64b020d50d9bc76b21e14aef52125613914
Author: David Teigland <teigland@redhat.com>
AuthorDate: Fri Aug 8 15:40:35 2008 -0500
Committer: David Teigland <teigland@redhat.com>
CommitterDate: Fri Aug 8 16:47:58 2008 -0500
dlm_controld: queries in libgroup mode
Most of the query info doesn't apply when running in LIBGROUP mode,
but some of the basic info can be provided.
Signed-off-by: David Teigland <teigland@redhat.com>
---
dlm/libdlmcontrol/libdlmcontrol.h | 1 +
group/dlm_controld/dlm_daemon.h | 5 +++
group/dlm_controld/group.c | 64 +++++++++++++++++++++++++++++++++++-
group/dlm_controld/main.c | 3 ++
4 files changed, 71 insertions(+), 2 deletions(-)
diff --git a/dlm/libdlmcontrol/libdlmcontrol.h b/dlm/libdlmcontrol/libdlmcontrol.h
index 83ddf6f..9c95c5e 100644
--- a/dlm/libdlmcontrol/libdlmcontrol.h
+++ b/dlm/libdlmcontrol/libdlmcontrol.h
@@ -38,6 +38,7 @@ struct dlmc_change {
#define DLMC_LF_SAVE_PLOCKS 0x00000020
struct dlmc_lockspace {
+ int group_mode;
struct dlmc_change cg_prev; /* completed change (started_change) */
struct dlmc_change cg_next; /* in-progress change (changes list) */
uint32_t flags;
diff --git a/group/dlm_controld/dlm_daemon.h b/group/dlm_controld/dlm_daemon.h
index 22e82b1..1af4256 100644
--- a/group/dlm_controld/dlm_daemon.h
+++ b/group/dlm_controld/dlm_daemon.h
@@ -186,6 +186,11 @@ struct lockspace {
struct timeval drop_resources_last;
uint64_t plock_ckpt_handle;
+ /* save copy of groupd member callback data for queries */
+
+ int cb_member_count;
+ int cb_members[MAX_NODES];
+
/* deadlock stuff */
int deadlk_low_nodeid;
diff --git a/group/dlm_controld/group.c b/group/dlm_controld/group.c
index acedd08..cd2743b 100644
--- a/group/dlm_controld/group.c
+++ b/group/dlm_controld/group.c
@@ -117,6 +117,7 @@ void process_groupd(int ci)
switch (cb_action) {
case DO_STOP:
log_debug("groupd callback: stop %s", cb_name);
+ ls->kernel_stopped = 1; /* for queries */
set_sysfs_control(cb_name, 0);
group_stop_done(gh, cb_name);
break;
@@ -125,12 +126,17 @@ void process_groupd(int ci)
log_debug("groupd callback: start %s count %d members %s",
cb_name, cb_member_count, str_members());
+ /* save in ls for queries */
+ ls->cb_member_count = cb_member_count;
+ memcpy(ls->cb_members, cb_members, sizeof(cb_members));
+
set_configfs_members(cb_name, cb_member_count, cb_members,
0, NULL);
/* this causes the dlm to do a "start" using the
members we just set */
+ ls->kernel_stopped = 0;
set_sysfs_control(cb_name, 1);
/* the dlm doesn't need/use a "finish" stage following
@@ -234,29 +240,83 @@ void close_groupd(void)
group_exit(gh);
}
-/* FIXME: most of the query info doesn't apply in the LIBGROUP mode,
- but we can emulate some basic parts of it */
+/* most of the query info doesn't apply in the LIBGROUP mode, but we can
+ emulate some basic parts of it */
int set_lockspace_info_group(struct lockspace *ls,
struct dlmc_lockspace *lockspace)
{
+ strncpy(lockspace->name, ls->name, DLM_LOCKSPACE_LEN);
+ lockspace->global_id = ls->global_id;
+
+ if (ls->joining)
+ lockspace->flags |= DLMC_LF_JOINING;
+ if (ls->leaving)
+ lockspace->flags |= DLMC_LF_LEAVING;
+ if (ls->kernel_stopped)
+ lockspace->flags |= DLMC_LF_KERNEL_STOPPED;
+
+ lockspace->cg_prev.member_count = ls->cb_member_count;
+
+ /* we could save the previous cb_members and calculate
+ joined_count and remove_count */
+
return 0;
}
int set_node_info_group(struct lockspace *ls, int nodeid,
struct dlmc_node *node)
{
+ node->nodeid = nodeid;
+ node->flags = DLMC_NF_MEMBER;
return 0;
}
int set_lockspaces_group(int *count, struct dlmc_lockspace **lss_out)
{
+ struct lockspace *ls;
+ struct dlmc_lockspace *lss, *lsp;
+ int ls_count = 0;
+
+ list_for_each_entry(ls, &lockspaces, list)
+ ls_count++;
+
+ lss = malloc(ls_count * sizeof(struct dlmc_lockspace));
+ if (!lss)
+ return -ENOMEM;
+ memset(lss, 0, ls_count * sizeof(struct dlmc_lockspace));
+
+ lsp = lss;
+ list_for_each_entry(ls, &lockspaces, list) {
+ set_lockspace_info(ls, lsp++);
+ }
+
+ *count = ls_count;
+ *lss_out = lss;
return 0;
}
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;
+
+ if (!ls->cb_member_count)
+ goto out;
+
+ nodes = malloc(ls->cb_member_count * sizeof(struct dlmc_node));
+ if (!nodes)
+ return -ENOMEM;
+ memset(nodes, 0, sizeof(*nodes));
+
+ nodep = nodes;
+ for (i = 0; i < cb_member_count; i++) {
+ set_node_info_group(ls, ls->cb_members[i], nodep++);
+ }
+ out:
+ *node_count = ls->cb_member_count;
+ *nodes_out = nodes;
return 0;
}
diff --git a/group/dlm_controld/main.c b/group/dlm_controld/main.c
index 6b866c2..c9a2f56 100644
--- a/group/dlm_controld/main.c
+++ b/group/dlm_controld/main.c
@@ -499,6 +499,9 @@ static void query_lockspace_info(int fd, char *name)
goto out;
}
+ memset(&lockspace, 0, sizeof(lockspace));
+ lockspace.group_mode = group_mode;
+
if (group_mode == GROUP_LIBGROUP)
rv = set_lockspace_info_group(ls, &lockspace);
else