public inbox for cluster-cvs@sourceware.org help / color / mirror / Atom feed
From: teigland@sourceware.org To: cluster-cvs@sources.redhat.com, cluster-devel@redhat.com Subject: Cluster Project branch, master, updated. cluster-2.99.05-55-g6fb8dc9 Date: Mon, 07 Jul 2008 21:03:00 -0000 [thread overview] Message-ID: <20080707210349.31846.qmail@sourceware.org> (raw) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Cluster Project". http://sources.redhat.com/git/gitweb.cgi?p=cluster.git;a=commitdiff;h=6fb8dc9d73db3a5e48589ee274f1c34ee4bc76c5 The branch, master has been updated via 6fb8dc9d73db3a5e48589ee274f1c34ee4bc76c5 (commit) from 8f1689a1cfc859aa3307ff92e06242d32f2c5f8a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 6fb8dc9d73db3a5e48589ee274f1c34ee4bc76c5 Author: David Teigland <teigland@redhat.com> Date: Mon Jul 7 15:35:32 2008 -0500 gfs_controld: support queries from gfs_control through libgfscontrol Signed-off-by: David Teigland <teigland@redhat.com> ----------------------------------------------------------------------- Summary of changes: group/gfs_control/main.c | 224 ++++++++++++++++++++++++++++++++++- group/gfs_controld/cpg-new.c | 93 ++++++++------- group/libgfscontrol/libgfscontrol.h | 24 +++- 3 files changed, 291 insertions(+), 50 deletions(-) diff --git a/group/gfs_control/main.c b/group/gfs_control/main.c index 9d2e1ef..265713a 100644 --- a/group/gfs_control/main.c +++ b/group/gfs_control/main.c @@ -14,7 +14,7 @@ #include "libgfscontrol.h" -#define OPTION_STRING "hV" +#define OPTION_STRING "vhV" #define OP_LIST 1 #define OP_DUMP 2 @@ -27,6 +27,7 @@ static char *prog_name; static char *fsname; static int operation; static int opt_ind; +static int verbose; static void print_usage(void) { @@ -35,6 +36,7 @@ static void print_usage(void) printf("%s [options] [ls|dump|plocks]\n", prog_name); printf("\n"); printf("Options:\n"); + printf(" -v Verbose output\n"); printf(" -h Print this help, then exit\n"); printf(" -V Print program version information, then exit\n"); printf("\n"); @@ -142,12 +144,230 @@ static int do_write(int fd, void *buf, size_t count) return 0; } -void do_leave(char *name) +void do_leave(char *table) { + struct gfsc_mount_args ma; + int rv; + + memset(&ma, 0, sizeof(ma)); + + strncpy(ma.table, table, sizeof(ma.table)); + + rv = gfsc_fs_leave(&ma, 0); + if (rv < 0) + fprintf(stderr, "gfs_controld leave error %d\n", rv); +} + +char *gfsc_mf_str(uint32_t flags) +{ + static char str[128]; + + memset(str, 0, sizeof(str)); + + if (flags & GFSC_MF_JOINING) + strcat(str, "joining "); + if (flags & GFSC_MF_LEAVING) + strcat(str, "leaving "); + if (flags & GFSC_MF_KERNEL_STOPPED) + strcat(str, "kernel_stopped "); + if (flags & GFSC_MF_KERNEL_MOUNT_DONE) + strcat(str, "kernel_mount_done "); + if (flags & GFSC_MF_KERNEL_MOUNT_ERROR) + strcat(str, "kernel_mount_error "); + if (flags & GFSC_MF_FIRST_RECOVERY_NEEDED) + strcat(str, "first_recovery_needed "); + if (flags & GFSC_MF_FIRST_RECOVERY_MSG) + strcat(str, "first_recovery_msg "); + if (flags & GFSC_MF_LOCAL_RECOVERY_BUSY) + strcat(str, "local_recovery_busy "); + + return str; +} + +char *gfsc_nf_str(uint32_t flags) +{ + static char str[128]; + + memset(str, 0, sizeof(str)); + + if (flags & GFSC_NF_MEMBER) + strcat(str, "member "); + if (flags & GFSC_NF_START) + strcat(str, "start "); + if (flags & GFSC_NF_DISALLOWED) + strcat(str, "disallowed "); + if (flags & GFSC_NF_KERNEL_MOUNT_DONE) + strcat(str, "kernel_mount_done "); + if (flags & GFSC_NF_KERNEL_MOUNT_ERROR) + strcat(str, "kernel_mount_error "); + if (flags & GFSC_NF_READONLY) + strcat(str, "readonly "); + if (flags & GFSC_NF_SPECTATOR) + strcat(str, "spectator "); + if (flags & GFSC_NF_CHECK_DLM) + strcat(str, "check_dlm "); + + return str; +} + +char *condition_str(int cond) +{ + switch (cond) { + case 0: + return ""; + case 1: + return "kernel_mount_done"; + case 2: + return "notify_nodeid"; + case 3: + return "poll_dlm"; + case 4: + return "pending"; + default: + return "unknown"; + } +} + +static void show_mg(struct gfsc_mountgroup *mg) +{ + printf("gfs mountgroup \"%s\"\n", mg->name); + printf("id 0x%x flags 0x%x %s\n", mg->global_id, mg->flags, + gfsc_mf_str(mg->flags)); + printf("journals needing recovery %d\n", mg->journals_need_recovery); + + printf("seq %u-%u counts member %d joined %d remove %d failed %d\n", + mg->cg_prev.combined_seq, mg->cg_prev.seq, + mg->cg_prev.member_count, mg->cg_prev.joined_count, + mg->cg_prev.remove_count, mg->cg_prev.failed_count); + + if (!mg->cg_next.seq) + return; + + printf("new seq %u-%u counts member %d joined %d remove %d failed %d\n", + mg->cg_next.combined_seq, mg->cg_next.seq, + mg->cg_next.member_count, mg->cg_next.joined_count, + mg->cg_next.remove_count, mg->cg_next.failed_count); + + printf("new wait_messages %d wait_condition %d %s\n", + mg->cg_next.wait_messages, mg->cg_next.wait_condition, + condition_str(mg->cg_next.wait_condition)); +} + +static void show_all_nodes(int count, struct gfsc_node *nodes) +{ + struct gfsc_node *n = nodes; + int i; + + for (i = 0; i < count; i++) { + printf("nodeid %d jid %d add_seq %u rem_seq %u failed %d flags 0x%x %s\n", + n->nodeid, n->jid, n->added_seq, n->removed_seq, + n->failed_reason, n->flags, gfsc_nf_str(n->flags)); + n++; + } +} + +static void show_nodeids(int count, struct gfsc_node *nodes) +{ + struct gfsc_node *n = nodes; + int i; + + for (i = 0; i < count; i++) { + printf("%d ", n->nodeid); + n++; + } + printf("\n"); } +static int node_compare(const void *va, const void *vb) +{ + const struct gfsc_node *a = va; + const struct gfsc_node *b = vb; + + return a->nodeid - b->nodeid; +} + +#define MAX_MG 128 +#define MAX_NODES 128 + +struct gfsc_mountgroup mgs[MAX_MG]; +struct gfsc_node nodes[MAX_NODES]; + static void do_list(char *name) { + struct gfsc_mountgroup *mg; + int node_count; + int mg_count; + int rv; + int i; + + memset(mgs, 0, sizeof(mgs)); + + if (name) { + rv = gfsc_mountgroup_info(name, mgs); + if (rv < 0) + goto out; + mg_count = 1; + } else { + rv = gfsc_mountgroups(MAX_MG, &mg_count, mgs); + if (rv < 0) + goto out; + } + + for (i = 0; i < mg_count; i++) { + mg = &mgs[i]; + + show_mg(mg); + + node_count = 0; + memset(&nodes, 0, sizeof(nodes)); + + rv = gfsc_mountgroup_nodes(mg->name, GFSC_NODES_MEMBERS, + MAX_NODES, &node_count, nodes); + if (rv < 0) + goto out; + + qsort(nodes, node_count, sizeof(struct gfsc_node),node_compare); + + printf("members "); + show_nodeids(node_count, nodes); + + if (!mg->cg_next.seq) + goto show_all; + + node_count = 0; + memset(&nodes, 0, sizeof(nodes)); + + rv = gfsc_mountgroup_nodes(mg->name, GFSC_NODES_NEXT, + MAX_NODES, &node_count, nodes); + if (rv < 0) + goto out; + + qsort(nodes, node_count, sizeof(struct gfsc_node),node_compare); + + printf("new members "); + show_nodeids(node_count, nodes); + + show_all: + if (!verbose) + continue; + + node_count = 0; + memset(&nodes, 0, sizeof(nodes)); + + rv = gfsc_mountgroup_nodes(mg->name, GFSC_NODES_ALL, + MAX_NODES, &node_count, nodes); + if (rv < 0) + goto out; + + qsort(nodes, node_count, sizeof(struct gfsc_node),node_compare); + + printf("all nodes\n"); + show_all_nodes(node_count, nodes); + } + return; + out: + fprintf(stderr, "gfs_controld query error %d\n", rv); + } static void do_plocks(char *name) diff --git a/group/gfs_controld/cpg-new.c b/group/gfs_controld/cpg-new.c index d43d53b..95cc007 100644 --- a/group/gfs_controld/cpg-new.c +++ b/group/gfs_controld/cpg-new.c @@ -2392,38 +2392,41 @@ int setup_dlmcontrol(void) return dlmcontrol_fd; } -#if 0 -int set_mountgroup_info(struct mountgroup *mg, struct gfsc_mountgroup *mountgroup) +int set_mountgroup_info(struct mountgroup *mg, struct gfsc_mountgroup *out) { struct change *cg, *last = NULL; - strncpy(mountgroup->name, mg->name, GFS_LOCKSPACE_LEN); - mountgroup->global_id = mg->id; + strncpy(out->name, mg->name, GFS_MOUNTGROUP_LEN); + out->global_id = mg->id; if (mg->joining) - mountgroup->flags |= GFSC_LF_JOINING; + out->flags |= GFSC_MF_JOINING; if (mg->leaving) - mountgroup->flags |= GFSC_LF_LEAVING; + out->flags |= GFSC_MF_LEAVING; if (mg->kernel_stopped) - mountgroup->flags |= GFSC_LF_KERNEL_STOPPED; - if (mg->fs_registered) - mountgroup->flags |= GFSC_LF_FS_REGISTERED; - if (mg->need_plocks) - mountgroup->flags |= GFSC_LF_NEED_PLOCKS; - if (mg->save_plocks) - mountgroup->flags |= GFSC_LF_SAVE_PLOCKS; + out->flags |= GFSC_MF_KERNEL_STOPPED; + if (mg->kernel_mount_done) + out->flags |= GFSC_MF_KERNEL_MOUNT_DONE; + if (mg->kernel_mount_error) + out->flags |= GFSC_MF_KERNEL_MOUNT_ERROR; + if (mg->first_recovery_needed) + out->flags |= GFSC_MF_FIRST_RECOVERY_NEEDED; + if (mg->first_recovery_msg) + out->flags |= GFSC_MF_FIRST_RECOVERY_MSG; + if (mg->local_recovery_busy) + out->flags |= GFSC_MF_LOCAL_RECOVERY_BUSY; if (!mg->started_change) goto next; cg = mg->started_change; - mountgroup->cg_prev.member_count = cg->member_count; - mountgroup->cg_prev.joined_count = cg->joined_count; - mountgroup->cg_prev.remove_count = cg->remove_count; - mountgroup->cg_prev.failed_count = cg->failed_count; - mountgroup->cg_prev.combined_seq = cg->combined_seq; - mountgroup->cg_prev.seq = cg->seq; + out->cg_prev.member_count = cg->member_count; + out->cg_prev.joined_count = cg->joined_count; + out->cg_prev.remove_count = cg->remove_count; + out->cg_prev.failed_count = cg->failed_count; + out->cg_prev.combined_seq = cg->combined_seq; + out->cg_prev.seq = cg->seq; next: if (list_empty(&mg->changes)) @@ -2434,24 +2437,27 @@ int set_mountgroup_info(struct mountgroup *mg, struct gfsc_mountgroup *mountgrou cg = list_first_entry(&mg->changes, struct change, list); - mountgroup->cg_next.member_count = cg->member_count; - mountgroup->cg_next.joined_count = cg->joined_count; - mountgroup->cg_next.remove_count = cg->remove_count; - mountgroup->cg_next.failed_count = cg->failed_count; - mountgroup->cg_next.combined_seq = last->seq; - mountgroup->cg_next.seq = cg->seq; + out->cg_next.member_count = cg->member_count; + out->cg_next.joined_count = cg->joined_count; + out->cg_next.remove_count = cg->remove_count; + out->cg_next.failed_count = cg->failed_count; + out->cg_next.combined_seq = last->seq; + out->cg_next.seq = cg->seq; + + /* FIXME: use real definitions for these conditions + (also in dlm_controld) */ if (cg->state == CGST_WAIT_CONDITIONS) - mountgroup->cg_next.wait_condition = 4; - if (poll_fencing) - mountgroup->cg_next.wait_condition = 1; - else if (poll_quorum) - mountgroup->cg_next.wait_condition = 2; - else if (poll_fs) - mountgroup->cg_next.wait_condition = 3; + out->cg_next.wait_condition = 4; + if (!mg->kernel_mount_done) + out->cg_next.wait_condition = 1; + if (mg->dlm_notify_nodeid) + out->cg_next.wait_condition = 2; + if (poll_dlm) + out->cg_next.wait_condition = 3; if (cg->state == CGST_WAIT_MESSAGES) - mountgroup->cg_next.wait_messages = 1; + out->cg_next.wait_messages = 1; out: return 0; } @@ -2481,14 +2487,18 @@ static int _set_node_info(struct mountgroup *mg, struct change *cg, int nodeid, if (!n) goto out; - if (n->check_fencing) - node->flags |= GFSC_NF_CHECK_FENCING; - if (n->check_quorum) - node->flags |= GFSC_NF_CHECK_QUORUM; - if (n->check_fs) - node->flags |= GFSC_NF_CHECK_FS; - if (n->fs_notified) - node->flags |= GFSC_NF_FS_NOTIFIED; + node->jid = n->jid; + + if (n->kernel_mount_done) + node->flags |= GFSC_NF_KERNEL_MOUNT_DONE; + if (n->kernel_mount_error) + node->flags |= GFSC_NF_KERNEL_MOUNT_ERROR; + if (n->check_dlm) + node->flags |= GFSC_NF_CHECK_DLM; + if (n->ro) + node->flags |= GFSC_NF_READONLY; + if (n->spectator) + node->flags |= GFSC_NF_SPECTATOR; node->added_seq = n->added_seq; node->removed_seq = n->removed_seq; @@ -2583,4 +2593,3 @@ int set_mountgroup_nodes(struct mountgroup *mg, int option, int *node_count, *nodes_out = nodes; return 0; } -#endif diff --git a/group/libgfscontrol/libgfscontrol.h b/group/libgfscontrol/libgfscontrol.h index 028b32b..90578e5 100644 --- a/group/libgfscontrol/libgfscontrol.h +++ b/group/libgfscontrol/libgfscontrol.h @@ -10,12 +10,18 @@ #define GFSC_DUMP_SIZE (1024 * 1024) -#define GFSC_NF_MEMBER 0x00000001 /* node is member in cg */ -#define GFSC_NF_START 0x00000002 /* start message recvd for cg */ -#define GFSC_NF_DISALLOWED 0x00000004 /* node disallowed in cg */ +#define GFSC_NF_MEMBER 0x00000001 /* node is member in cg */ +#define GFSC_NF_START 0x00000002 /* start message recvd */ +#define GFSC_NF_DISALLOWED 0x00000004 /* node disallowed in cg */ +#define GFSC_NF_KERNEL_MOUNT_DONE 0x00000008 +#define GFSC_NF_KERNEL_MOUNT_ERROR 0x00000010 +#define GFSC_NF_READONLY 0x00000010 +#define GFSC_NF_SPECTATOR 0x00000010 +#define GFSC_NF_CHECK_DLM 0x00000010 struct gfsc_node { int nodeid; + int jid; uint32_t flags; uint32_t added_seq; uint32_t removed_seq; @@ -33,13 +39,19 @@ struct gfsc_change { uint32_t combined_seq; }; -#define GFSC_LF_JOINING 0x00000001 -#define GFSC_LF_LEAVING 0x00000002 -#define GFSC_LF_KERNEL_STOPPED 0x00000004 +#define GFSC_MF_JOINING 0x00000001 +#define GFSC_MF_LEAVING 0x00000002 +#define GFSC_MF_KERNEL_STOPPED 0x00000004 +#define GFSC_MF_KERNEL_MOUNT_DONE 0x00000004 +#define GFSC_MF_KERNEL_MOUNT_ERROR 0x00000004 +#define GFSC_MF_FIRST_RECOVERY_NEEDED 0x00000008 +#define GFSC_MF_FIRST_RECOVERY_MSG 0x00000010 +#define GFSC_MF_LOCAL_RECOVERY_BUSY 0x00000020 struct gfsc_mountgroup { struct gfsc_change cg_prev; /* completed change (started_change) */ struct gfsc_change cg_next; /* in-progress change (changes list) */ + int journals_need_recovery; /* count of jounals need_recovery */ uint32_t flags; uint32_t global_id; char name[GFS_MOUNTGROUP_LEN+1]; hooks/post-receive -- Cluster Project
reply other threads:[~2008-07-07 21:03 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20080707210349.31846.qmail@sourceware.org \ --to=teigland@sourceware.org \ --cc=cluster-cvs@sources.redhat.com \ --cc=cluster-devel@redhat.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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).