From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30917 invoked by alias); 27 Jan 2009 15:37:35 -0000 Received: (qmail 30911 invoked by alias); 27 Jan 2009 15:37:35 -0000 X-SWARE-Spam-Status: No, hits=-0.7 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_73,J_CHICKENPOX_74,KAM_MX,SPF_HELO_PASS X-Spam-Status: No, hits=-0.7 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_73,J_CHICKENPOX_74,KAM_MX,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: make cman_tool -X work 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: ae050d89cf32c6408af1ca7a28c832f7b546c790 X-Git-Newrev: 4f9794db2ef36e061ce41cfcc2d8a00b64b8b344 From: Christine Caulfield Message-Id: <20090127153714.20924C024D@lists.fedorahosted.org> Date: Tue, 27 Jan 2009 15:37: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/msg00298.txt.bz2 Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=4f9794db2ef36e061ce41cfcc2d8a00b64b8b344 Commit: 4f9794db2ef36e061ce41cfcc2d8a00b64b8b344 Parent: ae050d89cf32c6408af1ca7a28c832f7b546c790 Author: Christine Caulfield AuthorDate: Tue Jan 27 15:36:09 2009 +0000 Committer: Christine Caulfield CommitterDate: Tue Jan 27 15:36:09 2009 +0000 cman: make cman_tool -X work cman_tool -X starts a config-less cluster with defaults. You probably need the accompanying DLM patch before attempting to use this with GFS! Signed-off-by: Christine Caulfield --- cman/cman_tool/main.c | 2 + cman/config/cman-preconfig.c | 12 ++++++- cman/services/cman/lib/libcman.c | 68 +++++++++++++++++++++++++++---------- cman/services/cman/lib/libcman.h | 1 + 4 files changed, 63 insertions(+), 20 deletions(-) diff --git a/cman/cman_tool/main.c b/cman/cman_tool/main.c index 9447291..a6d5102 100644 --- a/cman/cman_tool/main.c +++ b/cman/cman_tool/main.c @@ -235,6 +235,8 @@ static void show_status(void) printf(" DisallowedNodes"); if (einfo->ei_flags & CMAN_EXTRA_FLAG_HASSTATE) printf(" HasState"); + if (einfo->ei_flags & CMAN_EXTRA_FLAG_NOCONFIG) + printf(" NoConfig"); printf(" \n"); memset(&node, 0, sizeof(node)); diff --git a/cman/config/cman-preconfig.c b/cman/config/cman-preconfig.c index ce63545..fe57c45 100644 --- a/cman/config/cman-preconfig.c +++ b/cman/config/cman-preconfig.c @@ -958,10 +958,20 @@ static int set_noccs_defaults(struct objdb_iface_ver0 *objdb) objdb->object_key_create(object_handle, "nodeid", strlen("nodeid"), tmp, strlen(tmp)+1); - /* Write the default cluster name & ID in here too */ + /* Write the default cluster name */ objdb->object_key_create(cluster_parent_handle, "name", strlen("name"), cluster_name, strlen(cluster_name)+1); + /* Add a dummy config_version */ + sprintf(tmp, "%d", 0); + objdb->object_key_create(cluster_parent_handle, "config_version", strlen("config_version"), + tmp, strlen(tmp)+1); + + /* A flag to show there is no configuration file */ + sprintf(tmp, "%d", 1); + objdb->object_key_create(cluster_parent_handle, "no_config", strlen("no_config"), + tmp, strlen(tmp)+1); + return 0; } diff --git a/cman/services/cman/lib/libcman.c b/cman/services/cman/lib/libcman.c index 735a04c..04da953 100644 --- a/cman/services/cman/lib/libcman.c +++ b/cman/services/cman/lib/libcman.c @@ -983,6 +983,7 @@ int cman_get_nodes(cman_handle_t handle, int maxnodes, int *retnodes, cman_node_ int i; int num_nodes = 0; char path[PATH_MAX]; + int noconfig_flag; cman_inst = (struct cman_inst *)handle; VALIDATE_HANDLE(cman_inst); @@ -990,32 +991,52 @@ int cman_get_nodes(cman_handle_t handle, int maxnodes, int *retnodes, cman_node_ refresh_node_list(cman_inst); ccs_handle = ccs_connect(); - do { - sprintf(path, "/cluster/clusternodes/clusternode[%d]/@name", num_nodes+1); - ccs_get(ccs_handle, path, &value); - if (value) { - strcpy(nodes[num_nodes].cn_name, value); - free(value); - } + if (!ccs_get(ccs_handle, "/cluster/@no_config", &value)) { + noconfig_flag = atoi(value); + free(value); + } - sprintf(path, "/cluster/clusternodes/clusternode[%d]/@nodeid", num_nodes+1); - ret = ccs_get(ccs_handle, path, &value); - if (value) { - nodes[num_nodes].cn_nodeid = atoi(value); - free(value); - } + /* If we don't have a config file we will have to make up node names */ + if (noconfig_flag) { - /* Reconcile with active nodes list. */ for (i=0; i < cman_inst->node_count; i++) { - if (cman_inst->node_list[i].nodeid == nodes[num_nodes].cn_nodeid) { - nodes[num_nodes].cn_member = (cman_inst->node_list[i].state == NODESTATE_MEMBER); - } + nodes[i].cn_nodeid = cman_inst->node_list[i].nodeid; + nodes[i].cn_member = 1; + sprintf(nodes[i].cn_name, "Node-%x", nodes[i].cn_nodeid); } + } + else { - num_nodes++; - } while (ret == 0 && num_nodes < maxnodes); + /* We DO have a config file, reconcile in-memory with configuration */ + do { + sprintf(path, "/cluster/clusternodes/clusternode[%d]/@name", num_nodes+1); + ret = ccs_get(ccs_handle, path, &value); + if (!ret) { + strcpy(nodes[num_nodes].cn_name, value); + free(value); + } + + sprintf(path, "/cluster/clusternodes/clusternode[%d]/@nodeid", num_nodes+1); + ret = ccs_get(ccs_handle, path, &value); + if (!ret) { + nodes[num_nodes].cn_nodeid = atoi(value); + free(value); + } + + /* Reconcile with active nodes list. */ + for (i=0; i < cman_inst->node_count; i++) { + if (cman_inst->node_list[i].nodeid == nodes[num_nodes].cn_nodeid) { + nodes[num_nodes].cn_member = (cman_inst->node_list[i].state == NODESTATE_MEMBER); + } + } + + num_nodes++; + } while (ret == 0 && num_nodes < maxnodes); + } *retnodes = num_nodes-1; + if (cman_inst->node_count > *retnodes) + *retnodes = cman_inst->node_count; ccs_disconnect(ccs_handle); return 0; } @@ -1047,6 +1068,9 @@ int cman_get_disallowed_nodes(cman_handle_t handle, int maxnodes, int *retnodes, strcpy(nodes[num_nodes].cn_name, value); free(value); } + else { + sprintf(nodes[i].cn_name, "Node-%x", nodes[i].cn_nodeid); + } } } *retnodes = num_nodes; @@ -1174,6 +1198,12 @@ int cman_get_extra_info(cman_handle_t handle, cman_extra_info_t *info, int maxle free(value); } + if (!ccs_get(ccs_handle, "/cluster/@no_config", &value)) { + free(value); + info->ei_flags |= CMAN_EXTRA_FLAG_NOCONFIG; + } + + ccs_disconnect(ccs_handle); return 0; diff --git a/cman/services/cman/lib/libcman.h b/cman/services/cman/lib/libcman.h index 5f50f2a..404af07 100644 --- a/cman/services/cman/lib/libcman.h +++ b/cman/services/cman/lib/libcman.h @@ -146,6 +146,7 @@ typedef struct cman_cluster #define CMAN_EXTRA_FLAG_DISALLOWED 2 #define CMAN_EXTRA_FLAG_2NODE 4 #define CMAN_EXTRA_FLAG_QUORATE 8 +#define CMAN_EXTRA_FLAG_NOCONFIG 256 typedef struct cman_extra_info { int ei_node_state;