From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5347 invoked by alias); 3 Feb 2009 11:28:28 -0000 Received: (qmail 5341 invoked by alias); 3 Feb 2009 11:28:28 -0000 X-SWARE-Spam-Status: No, hits=-1.6 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS X-Spam-Status: No, hits=-1.6 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS X-Spam-Check-By: sourceware.org X-Spam-Checker-Version: SpamAssassin 3.2.4 (2008-01-01) on bastion.fedora.phx.redhat.com Subject: cluster: master - cman: Add some (hopefully) helpful comments To: cluster-cvs-relay@redhat.com X-Project: Cluster Project X-Git-Module: cluster.git X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 5645c0e4fb66781ec3f88d4da5db58b09e1ba3f7 X-Git-Newrev: 3fe661b1d295a1d1068f45db9a2b2e1df60e8bd2 From: Christine Caulfield Message-Id: <20090203112804.A1E9D1205A4@lists.fedorahosted.org> Date: Tue, 03 Feb 2009 11:28:00 -0000 X-Scanned-By: MIMEDefang 2.58 on 172.16.52.254 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: 2009-q1/txt/msg00373.txt.bz2 Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=3fe661b1d295a1d1068f45db9a2b2e1df60e8bd2 Commit: 3fe661b1d295a1d1068f45db9a2b2e1df60e8bd2 Parent: 5645c0e4fb66781ec3f88d4da5db58b09e1ba3f7 Author: Christine Caulfield AuthorDate: Tue Feb 3 11:26:35 2009 +0000 Committer: Christine Caulfield CommitterDate: Tue Feb 3 11:26:35 2009 +0000 cman: Add some (hopefully) helpful comments One of the functions I hope that this libcman will provide is a guide to migrating from libcman to corosync interfaces. So, while this is a functional libcman it also serves as a sort of document as to where the libcman calls have gone (into cfg, votequorum etc) and how to call them. Signed-off-by: Christine Caulfield --- cman/services/cman/lib/libcman.c | 125 ++++++++++++++++++++++++++++---------- 1 files changed, 92 insertions(+), 33 deletions(-) diff --git a/cman/services/cman/lib/libcman.c b/cman/services/cman/lib/libcman.c index 7c575a3..dd64015 100644 --- a/cman/services/cman/lib/libcman.c +++ b/cman/services/cman/lib/libcman.c @@ -236,7 +236,12 @@ int cman_finish ( return 0; } - +/* These next four calls are the only ones that are specific to cman i nthe release. Everything else + * uses standard corosync or 'ccs' libraries. + * If you really want to do inter-node communications then CPG might be more appropriate to + * your needs. These functions are here partly to provide an API compatibility, but mainly + * to provide wire-protocol compatibility with older versions. + */ int cman_start_recv_data ( cman_handle_t handle, cman_datacallback_t callback, @@ -311,31 +316,6 @@ error_exit: return (error?-1:0); } -int cman_get_node_addrs ( - cman_handle_t handle, - int nodeid, - int max_addrs, - int *num_addrs, - struct cman_node_address *addrs) -{ - int error; - struct cman_inst *cman_inst; - - cman_inst = (struct cman_inst *)handle; - VALIDATE_HANDLE(cman_inst); - - if (!cman_inst->cfg_handle) { - if (corosync_cfg_initialize(&cman_inst->cfg_handle, &cfg_callbacks) != CS_OK) { - errno = ENOMEM; - return -1; - } - } - - error = corosync_cfg_get_node_addrs(cman_inst->cfg_handle, nodeid, max_addrs, num_addrs, (corosync_cfg_node_address_t *)addrs); - - return (error==CS_OK?0:-1); -} - int cman_send_data(cman_handle_t handle, const void *message, int len, int flags, uint8_t port, int nodeid) { int error; @@ -416,7 +396,40 @@ error_exit: return (error?-1:0); } -/* an example of how we would query the quorum service */ +/* This call is now handled by cfg */ +int cman_get_node_addrs ( + cman_handle_t handle, + int nodeid, + int max_addrs, + int *num_addrs, + struct cman_node_address *addrs) +{ + int error; + struct cman_inst *cman_inst; + + cman_inst = (struct cman_inst *)handle; + VALIDATE_HANDLE(cman_inst); + + if (!cman_inst->cfg_handle) { + if (corosync_cfg_initialize(&cman_inst->cfg_handle, &cfg_callbacks) != CS_OK) { + errno = ENOMEM; + return -1; + } + } + + error = corosync_cfg_get_node_addrs(cman_inst->cfg_handle, nodeid, max_addrs, num_addrs, (corosync_cfg_node_address_t *)addrs); + + return (error==CS_OK?0:-1); +} + +/* + * An example of how we would query the quorum service. + * In fact we can use the lower-level quorum service if quorate all we + * needed to know - it provides the quorum state regardless of which + * quorum provider is loaded. + * Users of libcman typically are nos and wany to know all sorts of + * other things. + */ int cman_is_quorate(cman_handle_t handle) { struct cman_inst *cman_inst; @@ -437,7 +450,7 @@ int cman_is_quorate(cman_handle_t handle) return quorate; } - +/* This call is now handled by cfg */ int cman_shutdown(cman_handle_t handle, int flags) { struct cman_inst *cman_inst; @@ -454,6 +467,13 @@ int cman_shutdown(cman_handle_t handle, int flags) } } + if (flags && CMAN_LEAVEFLAG_REMOVED) { + if (votequorum_check_and_start(cman_inst)) + return -1; + + votequorum_leaving(cman_inst->cmq_handle); + } + if (flags == CMAN_SHUTDOWN_ANYWAY) cfg_flags = COROSYNC_CFG_SHUTDOWN_FLAG_REGARDLESS; @@ -465,7 +485,11 @@ int cman_shutdown(cman_handle_t handle, int flags) return error; } - +/* + * This call is now mostly handled by cfg. + * However if we want to do a "leave remove" then we need to tell + * votequorum first. + */ int cman_leave_cluster(cman_handle_t handle, int flags) { struct cman_inst *cman_inst; @@ -482,6 +506,15 @@ int cman_leave_cluster(cman_handle_t handle, int flags) } } + /* Tell votequorum to reduce quorum when we go */ + if (flags && CMAN_LEAVEFLAG_REMOVED) { + if (votequorum_check_and_start(cman_inst)) + return -1; + + votequorum_leaving(cman_inst->cmq_handle); + } + + cfg_flags = COROSYNC_CFG_SHUTDOWN_FLAG_IMMEDIATE; error = corosync_cfg_try_shutdown(cman_inst->cfg_handle, cfg_flags); @@ -492,6 +525,7 @@ int cman_leave_cluster(cman_handle_t handle, int flags) return error; } +/* This call is now handled by cfg */ int cman_replyto_shutdown(cman_handle_t handle, int flags) { struct cman_inst *cman_inst; @@ -512,6 +546,7 @@ int cman_replyto_shutdown(cman_handle_t handle, int flags) return error; } +/* This call is now handled by cfg */ int cman_kill_node(cman_handle_t handle, int nodeid) { struct cman_inst *cman_inst; @@ -532,6 +567,7 @@ int cman_kill_node(cman_handle_t handle, int nodeid) return (error==CS_OK?0:-1); } +/* This call is handled by votequorum */ int cman_set_votes(cman_handle_t handle, int votes, int nodeid) { struct cman_inst *cman_inst; @@ -548,6 +584,7 @@ int cman_set_votes(cman_handle_t handle, int votes, int nodeid) return (error==CS_OK?0:-1); } +/* This call is handled by votequorum */ int cman_set_expected_votes(cman_handle_t handle, int expected) { struct cman_inst *cman_inst; @@ -606,7 +643,7 @@ int cman_setprivdata( return (CS_OK); } - +/* This call is handled by votequorum */ int cman_register_quorum_device(cman_handle_t handle, char *name, int votes) { struct cman_inst *cman_inst; @@ -623,6 +660,7 @@ int cman_register_quorum_device(cman_handle_t handle, char *name, int votes) return error; } +/* This call is handled by votequorum */ int cman_unregister_quorum_device(cman_handle_t handle) { struct cman_inst *cman_inst; @@ -638,6 +676,8 @@ int cman_unregister_quorum_device(cman_handle_t handle) return error; } + +/* This call is handled by votequorum */ int cman_poll_quorum_device(cman_handle_t handle, int isavailable) { struct cman_inst *cman_inst; @@ -654,6 +694,7 @@ int cman_poll_quorum_device(cman_handle_t handle, int isavailable) return error; } +/* This call is handled by votequorum */ int cman_get_quorum_device(cman_handle_t handle, struct cman_qdev_info *info) { struct cman_inst *cman_inst; @@ -677,6 +718,7 @@ int cman_get_quorum_device(cman_handle_t handle, struct cman_qdev_info *info) return error; } +/* This call is handled by votequorum */ int cman_set_dirty(cman_handle_t handle) { struct cman_inst *cman_inst; @@ -839,7 +881,11 @@ error_put: return (error); } - +/* + * This call expects to get a listing of all nodes known to the + * system so we query ccs rather than corsync, as some nodes + * might not be up yet + */ int cman_get_node_count(cman_handle_t handle) { struct cman_inst *cman_inst; @@ -877,6 +923,9 @@ int cman_is_active(cman_handle_t handle) return 1; } +/* + * Here we just read values from ccs + */ int cman_get_cluster(cman_handle_t handle, cman_cluster_t *clinfo) { struct cman_inst *cman_inst; @@ -905,6 +954,11 @@ int cman_get_cluster(cman_handle_t handle, cman_cluster_t *clinfo) return 0; } +/* + * libccs doesn't do writes yet so we need to use confdb to + * change the config version. + * This will signal votequorum to reload the configuration 'file' + */ int cman_set_version(cman_handle_t handle, const cman_version_t *version) { struct cman_inst *cman_inst; @@ -950,8 +1004,7 @@ int cman_set_version(cman_handle_t handle, const cman_version_t *version) } - - +/* This mainly just retreives values from ccs */ int cman_get_version(cman_handle_t handle, cman_version_t *version) { struct cman_inst *cman_inst; @@ -988,6 +1041,12 @@ static char *node_name(corosync_cfg_node_address_t *addr) return name; } +/* + * This is a slightly complicated mix of ccs and votequorum queries. + * votequorum only knows about active nodes and does not hold node names. + * so once we have a list of active nodes we fill in the names + * and also the nodes that have never been seen by corosync. + */ int cman_get_nodes(cman_handle_t handle, int maxnodes, int *retnodes, cman_node_t *nodes) { struct cman_inst *cman_inst;