From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29374 invoked by alias); 25 Apr 2008 17:54:27 -0000 Received: (qmail 29341 invoked by uid 9453); 25 Apr 2008 17:54:26 -0000 Date: Fri, 25 Apr 2008 17:54:00 -0000 Message-ID: <20080425175425.29325.qmail@sourceware.org> From: teigland@sourceware.org To: cluster-cvs@sources.redhat.com, cluster-devel@redhat.com Subject: Cluster Project branch, master, updated. gfs-kernel_0_1_22-215-g1307d58 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 5ec7deb8f5677cc33b6b0c3bf3cc3d3d9d8c2dfd X-Git-Newrev: 1307d58730031a6d9f7401ba7182034e73280b49 Mailing-List: contact cluster-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: cluster-cvs-owner@sourceware.org X-SW-Source: 2008-q2/txt/msg00192.txt.bz2 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=1307d58730031a6d9f7401ba7182034e73280b49 The branch, master has been updated via 1307d58730031a6d9f7401ba7182034e73280b49 (commit) from 5ec7deb8f5677cc33b6b0c3bf3cc3d3d9d8c2dfd (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 1307d58730031a6d9f7401ba7182034e73280b49 Author: David Teigland Date: Fri Apr 25 12:48:29 2008 -0500 fence: using new libs Filling out various incomplete parts, making use of the new interfaces. Signed-off-by: David Teigland ----------------------------------------------------------------------- Summary of changes: fence/fence_node/fence_node.c | 2 + fence/fence_tool/Makefile | 3 +- fence/fence_tool/fence_tool.c | 5 ++- fence/fenced/cpg.c | 54 ++++++++++++++++++++++++++- fence/fenced/fd.h | 1 + fence/fenced/main.c | 37 +++++++++++++----- fence/fenced/member_cman.c | 84 +++++++++++++++++++++++++++++++++++----- fence/libfenced/libfenced.h | 2 - group/dlm_controld/Makefile | 4 +- group/dlm_controld/cpg.c | 37 +++++++++++------- 10 files changed, 186 insertions(+), 43 deletions(-) diff --git a/fence/fence_node/fence_node.c b/fence/fence_node/fence_node.c index 6662f52..00fe6ea 100644 --- a/fence/fence_node/fence_node.c +++ b/fence/fence_node/fence_node.c @@ -108,6 +108,8 @@ int main(int argc, char *argv[]) } else { syslog(LOG_NOTICE, "Fence of \"%s\" was successful\n", victim); + /* Tell fenced what we've done so that it can avoid fencing + this node again if the fence_node() rebooted it. */ fenced_external(victim); exit(EXIT_SUCCESS); diff --git a/fence/fence_tool/Makefile b/fence/fence_tool/Makefile index faf6580..c3b1a22 100644 --- a/fence/fence_tool/Makefile +++ b/fence/fence_tool/Makefile @@ -27,11 +27,10 @@ OBJS=fence_tool.o CFLAGS += -D_FILE_OFFSET_BITS=64 CFLAGS += -I${ccsincdir} -I${cmanincdir} -I${fencedincdir} -CFLAGS += -I$(S)/../include -I$(SRCDIR)/group/lib +CFLAGS += -I$(S)/../include CFLAGS += -I${incdir} LDFLAGS += -L${ccslibdir} -L${cmanlibdir} -L${fencedlibdir} -lccs -lcman -lfenced -LDFLAGS += -L../../group/lib -lgroup ${TARGET}: ${OBJS} $(CC) -o $@ $^ $(LDFLAGS) diff --git a/fence/fence_tool/fence_tool.c b/fence/fence_tool/fence_tool.c index 72c262e..334231c 100644 --- a/fence/fence_tool/fence_tool.c +++ b/fence/fence_tool/fence_tool.c @@ -31,7 +31,6 @@ #include "ccs.h" #include "copyright.cf" #include "libcman.h" -#include "libgroup.h" #include "libfenced.h" #define OPTION_STRING ("Vht:wQ") @@ -142,6 +141,7 @@ static void sigalarm_handler(int sig) static int we_are_in_fence_domain(void) { +#if 0 group_data_t gdata; int rv; @@ -152,6 +152,9 @@ static int we_are_in_fence_domain(void) return 0; return gdata.member; +#endif + printf("FIXME: use libfenced:fenced_domain_members()\n"); + return 1; } /* diff --git a/fence/fenced/cpg.c b/fence/fenced/cpg.c index 0ab6a60..9d1a143 100644 --- a/fence/fenced/cpg.c +++ b/fence/fenced/cpg.c @@ -1247,19 +1247,71 @@ int fd_leave(struct fd *fd) return 0; } -int set_node_info(struct fd *fd, int nodeid, struct fenced_node *node) +int set_node_info(struct fd *fd, int nodeid, struct fenced_node *nodeinfo) { + struct node_history *node; + struct member *memb; + + nodeinfo->nodeid = nodeid; + nodeinfo->victim = is_victim(fd, nodeid); + + if (!fd->started_change) + goto history; + + memb = find_memb(fd->started_change, nodeid); + if (memb) + nodeinfo->member = memb->disallowed ? 0 : 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; + return 0; } int set_domain_info(struct fd *fd, struct fenced_domain *domain) { + struct change *cg = fd->started_change; + + if (cg) { + domain->member_count = cg->member_count; + domain->state = cg->state; + } + domain->master_nodeid = fd->master; + domain->victim_count = list_count(&fd->victims); + return 0; } int set_domain_members(struct fd *fd, int *member_count, struct fenced_node **members) { + struct change *cg = fd->started_change; + struct fenced_node *nodes, *nodep; + struct member *memb; + + if (!cg) { + *member_count = 0; + return 0; + } + + nodes = malloc(cg->member_count * sizeof(struct fenced_node)); + if (!nodes) + return -ENOMEM; + + nodep = nodes; + list_for_each_entry(memb, &cg->members, list) { + set_node_info(fd, memb->nodeid, nodep++); + } + + *member_count = cg->member_count; + *members = nodes; + return 0; } diff --git a/fence/fenced/fd.h b/fence/fenced/fd.h index 605cb1b..413d75c 100644 --- a/fence/fenced/fd.h +++ b/fence/fenced/fd.h @@ -268,6 +268,7 @@ void process_cman(int ci); int setup_cman(void); int is_cman_member(int nodeid); char *nodeid_to_name(int nodeid); +int name_to_nodeid(char *name); struct node *get_new_node(struct fd *fd, int nodeid); /* recover.c */ diff --git a/fence/fenced/main.c b/fence/fenced/main.c index f208378..2e08355 100644 --- a/fence/fenced/main.c +++ b/fence/fenced/main.c @@ -244,23 +244,21 @@ static int do_leave(char *name) return rv; } -static int do_external(char *name, int ci) +static int do_external(char *name, char *extra, int extra_len) { struct fd *fd; - int nodeid = 0; + int rv = 0; fd = find_fd(name); if (!fd) return -EINVAL; if (group_mode == GROUP_LIBGROUP) - return -EINVAL; - - /* FIXME: do_read(client[ci].fd, buf, MAX_NODENAME_LEN); - which gets the nodename, then translate the nodename to nodeid */ + rv = -ENOSYS; + else + send_external(fd, name_to_nodeid(extra)); - send_external(fd, nodeid); - return 0; + return rv; } /* combines a header and the data and sends it back to the client in @@ -397,7 +395,8 @@ static void do_domain_members(int ci, int max) static void process_connection(int ci) { struct fenced_header h; - int rv; + char *extra = NULL; + int rv, extra_len; rv = do_read(client[ci].fd, &h, sizeof(h)); if (rv < 0) { @@ -415,6 +414,22 @@ static void process_connection(int ci) goto out; } + if (h.len > sizeof(h)) { + extra_len = h.len - sizeof(h); + extra = malloc(extra_len); + if (!extra) { + log_error("process_connection no mem %d", extra_len); + goto out; + } + memset(extra, 0, extra_len); + + rv = do_read(client[ci].fd, extra, extra_len); + if (rv < 0) { + log_debug("connection %d extra read error %d", ci, rv); + goto out; + } + } + switch (h.command) { case FENCED_CMD_JOIN: do_join("default"); @@ -423,7 +438,7 @@ static void process_connection(int ci) do_leave("default"); break; case FENCED_CMD_EXTERNAL: - do_external("default", ci); + do_external("default", extra, extra_len); break; case FENCED_CMD_DUMP_DEBUG: do_dump(ci); @@ -442,6 +457,8 @@ static void process_connection(int ci) ci, h.command); } out: + if (extra) + free(extra); client_dead(ci); } diff --git a/fence/fenced/member_cman.c b/fence/fenced/member_cman.c index a2bb318..50afcf3 100644 --- a/fence/fenced/member_cman.c +++ b/fence/fenced/member_cman.c @@ -13,10 +13,61 @@ #include "fd.h" #include +#define BUFLEN MAX_NODENAME_LEN+1 + static cman_handle_t ch; static cman_node_t cman_nodes[MAX_NODES]; static int cman_node_count; + +static int name_equal(char *name1, char *name2) +{ + char name3[BUFLEN], name4[BUFLEN]; + int i, len1, len2; + + len1 = strlen(name1); + len2 = strlen(name2); + + if (len1 == len2 && !strncmp(name1, name2, len1)) + return 1; + + memset(name3, 0, BUFLEN); + memset(name4, 0, BUFLEN); + + for (i = 0; i < BUFLEN && i < len1; i++) { + if (name1[i] != '.') + name3[i] = name1[i]; + else + break; + } + + for (i = 0; i < BUFLEN && i < len2; i++) { + if (name2[i] != '.') + name4[i] = name2[i]; + else + break; + } + + len1 = strlen(name3); + len2 = strlen(name4); + + if (len1 == len2 && !strncmp(name3, name4, len1)) + return 1; + + return 0; +} + +static cman_node_t *find_cman_node_name(char *name) +{ + int i; + + for (i = 0; i < cman_node_count; i++) { + if (name_equal(cman_nodes[i].cn_name, name)) + return &cman_nodes[i]; + } + return NULL; +} + static cman_node_t *find_cman_node(int nodeid) { int i; @@ -28,6 +79,28 @@ static cman_node_t *find_cman_node(int nodeid) return NULL; } +char *nodeid_to_name(int nodeid) +{ + cman_node_t *cn; + + cn = find_cman_node(nodeid); + if (cn) + return cn->cn_name; + + return "unknown"; +} + +int name_to_nodeid(char *name) +{ + cman_node_t *cn; + + cn = find_cman_node_name(name); + if (cn) + return cn->cn_nodeid; + + return -1; +} + static void statechange(void) { int rv; @@ -139,17 +212,6 @@ int is_cman_member(int nodeid) return 0; } -char *nodeid_to_name(int nodeid) -{ - cman_node_t *cn; - - cn = find_cman_node(nodeid); - if (cn) - return cn->cn_name; - - return "unknown"; -} - struct node *get_new_node(struct fd *fd, int nodeid) { cman_node_t cn; diff --git a/fence/libfenced/libfenced.h b/fence/libfenced/libfenced.h index b10055b..a79d188 100644 --- a/fence/libfenced/libfenced.h +++ b/fence/libfenced/libfenced.h @@ -32,8 +32,6 @@ struct fenced_node { int last_fenced_master; int last_fenced_how; uint64_t last_fenced_time; - uint64_t last_joined_time; - uint64_t last_remove_time; }; struct fenced_domain { diff --git a/group/dlm_controld/Makefile b/group/dlm_controld/Makefile index 8098bad..4c6376c 100644 --- a/group/dlm_controld/Makefile +++ b/group/dlm_controld/Makefile @@ -33,12 +33,12 @@ OBJS= action.o \ plock.o \ group.o -CFLAGS += -I${ccsincdir} -I${cmanincdir} -I${dlmincdir} -I${openaisincdir} +CFLAGS += -I${ccsincdir} -I${cmanincdir} -I${dlmincdir} -I${openaisincdir} -I${fencedincdir} CFLAGS += -I${KERNEL_SRC}/include/ CFLAGS += -I$(S)/../lib/ -I$(S)/../include/ CFLAGS += -I${incdir} -LDFLAGS += -L${ccslibdir} -L${cmanlibdir} -L${dlmlibdir} -lccs -lcman -ldlm +LDFLAGS += -L${ccslibdir} -L${cmanlibdir} -L${dlmlibdir} -L${fencedlibdir} -lccs -lcman -ldlm -lfenced LDFLAGS += -L${openaislibdir} -lcpg -lSaCkpt LDFLAGS += -L../lib -lgroup diff --git a/group/dlm_controld/cpg.c b/group/dlm_controld/cpg.c index e531b65..59872d7 100644 --- a/group/dlm_controld/cpg.c +++ b/group/dlm_controld/cpg.c @@ -12,6 +12,7 @@ #include "dlm_daemon.h" #include "config.h" +#include "libfenced.h" uint32_t cpgname_to_crc(const char *data, int len); @@ -36,7 +37,7 @@ struct node { int check_quorum; int check_fs; int fs_notify; - struct timeval add_time; + uint64_t add_time; }; /* One of these change structs is created for every confchg a cpg gets. */ @@ -302,7 +303,7 @@ static void node_history_init(struct lockspace *ls, int nodeid) memset(node, 0, sizeof(struct node)); node->nodeid = nodeid; - timerclear(&node->add_time); + node->add_time = 0; list_add_tail(&node->list, &ls->node_history); } @@ -316,7 +317,7 @@ static void node_history_start(struct lockspace *ls, int nodeid) return; } - gettimeofday(&node->add_time, NULL); + node->add_time = time(NULL); } static void node_history_left(struct lockspace *ls, int nodeid) @@ -329,7 +330,7 @@ static void node_history_left(struct lockspace *ls, int nodeid) return; } - timerclear(&node->add_time); + node->add_time = 0; } static void node_history_fail(struct lockspace *ls, int nodeid) @@ -342,7 +343,7 @@ static void node_history_fail(struct lockspace *ls, int nodeid) return; } - if (!timerisset(&node->add_time)) + if (!node->add_time) node->check_fencing = 1; node->check_quorum = 1; @@ -352,8 +353,10 @@ static void node_history_fail(struct lockspace *ls, int nodeid) static int check_fencing_done(struct lockspace *ls) { struct node *node; - struct timeval last_fenced; + struct fenced_node nodeinfo; + struct fenced_domain domain; int wait_count = 0; + int rv; list_for_each_entry(node, &ls->node_history, list) { if (!node->check_fencing) @@ -362,12 +365,15 @@ static int check_fencing_done(struct lockspace *ls) /* check with fenced to see if the node has been fenced since node->add_time */ - /* fenced_last_success(node->nodeid, &last_fenced); */ - gettimeofday(&last_fenced, NULL); + memset(&nodeinfo, 0, sizeof(nodeinfo)); + + rv = fenced_node_info(node->nodeid, &nodeinfo); + if (rv < 0) + log_error("fenced_node_info error %d", rv); - if (timercmp(&last_fenced, &node->add_time, >)) { + if (nodeinfo.last_fenced_time > node->add_time) { node->check_fencing = 0; - timerclear(&node->add_time); + node->add_time = 0; } else { log_group(ls, "check_fencing %d needs fencing", node->nodeid); @@ -382,11 +388,14 @@ static int check_fencing_done(struct lockspace *ls) we may not have seen in any lockspace), and return 0 if there are any */ - /* - fenced_pending_count(&pending); - if (pending) + rv = fenced_domain_info(&domain); + if (rv < 0) { + log_error("fenced_domain_info error %d", rv); + return 0; + } + + if (domain.victim_count) return 0; - */ return 1; } hooks/post-receive -- Cluster Project