[Ocfs2-tools-commits] jlbec commits r656 -
branches/usysfsify/clusterbo
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Thu Mar 17 20:31:07 CST 2005
Author: jlbec
Date: 2005-03-17 20:31:05 -0600 (Thu, 17 Mar 2005)
New Revision: 656
Modified:
branches/usysfsify/clusterbo/o2cb_config.c
branches/usysfsify/clusterbo/o2cb_config.h
branches/usysfsify/clusterbo/o2cb_ctl.c
Log:
o Teach o2cb_ctl to handle multiple clusters in one cluster.conf
gracefully.
Modified: branches/usysfsify/clusterbo/o2cb_config.c
===================================================================
--- branches/usysfsify/clusterbo/o2cb_config.c 2005-03-18 01:46:03 UTC (rev 655)
+++ branches/usysfsify/clusterbo/o2cb_config.c 2005-03-18 02:31:05 UTC (rev 656)
@@ -38,10 +38,14 @@
struct _O2CBConfig {
+ GList *co_clusters;
+ gboolean co_valid;
+};
+
+struct _O2CBCluster {
gchar *c_name;
guint c_num_nodes;
GList *c_nodes;
- gboolean c_valid;
};
struct _O2CBNode {
@@ -63,16 +67,14 @@
if (!config)
return NULL;
- config->c_name = NULL;
- config->c_num_nodes = 0;
- config->c_nodes = NULL;
- config->c_valid = FALSE;
+ config->co_clusters = NULL;
+ config->co_valid = FALSE;
return config;
} /* o2cb_config_initialize() */
-static gint o2cb_config_fill_node(O2CBConfig *config,
- JConfigStanza *cfs)
+static gint o2cb_cluster_fill_node(O2CBCluster *cluster,
+ JConfigStanza *cfs)
{
O2CBNode *node;
gchar *num_s, *name, *addr, *port_s;
@@ -82,7 +84,7 @@
/* NB: _add_node() gives us a node number, but we're going to
* override it, because we know better. */
- node = o2cb_config_add_node(config);
+ node = o2cb_cluster_add_node(cluster);
if (!node)
return -ENOMEM;
@@ -137,25 +139,27 @@
return rc;
} /* o2cb_config_fill_node() */
-static gint o2cb_config_fill(O2CBConfig *config, JConfig *cf)
+static gint o2cb_config_fill_cluster(O2CBConfig *config, JConfig *cf,
+ JConfigStanza *c_cfs)
{
gint rc;
gulong val;
gchar *count, *ptr;
+ O2CBCluster *cluster;
JIterator *iter;
- JConfigStanza *c_cfs, *n_cfs;
+ JConfigStanza *n_cfs;
JConfigMatch match = {J_CONFIG_MATCH_VALUE, "cluster", NULL};
- c_cfs = j_config_get_stanza_nth(cf, "cluster", 0);
- if (!c_cfs)
- return -ENOENT;
-
rc = -ENOENT;
match.value = j_config_get_attribute(c_cfs, "name");
if (!match.value && !*match.value)
goto out_error;
- rc = o2cb_config_set_cluster_name(config, match.value);
+ cluster = o2cb_config_add_cluster(config);
+ if (!cluster)
+ goto out_error;
+
+ rc = o2cb_cluster_set_name(cluster, match.value);
if (rc)
goto out_error;
@@ -168,7 +172,7 @@
while (j_iterator_has_more(iter))
{
n_cfs = (JConfigStanza *)j_iterator_get_next(iter);
- rc = o2cb_config_fill_node(config, n_cfs);
+ rc = o2cb_cluster_fill_node(cluster, n_cfs);
if (rc)
break;
}
@@ -187,7 +191,7 @@
rc = -ERANGE;
if ((val == ULONG_MAX) || (val > UINT_MAX))
goto out_error;
- config->c_num_nodes = val;
+ cluster->c_num_nodes = val;
rc = 0;
@@ -195,8 +199,33 @@
g_free(match.value);
return rc;
-} /* o2cb_config_fill() */
+} /* o2cb_config_fill_cluster() */
+static gint o2cb_config_fill(O2CBConfig *config, JConfig *cf)
+{
+ int rc;
+ JIterator *iter;
+ JConfigStanza *c_cfs;
+
+ rc = -ENOMEM;
+ iter = j_config_get_stanzas(cf, "cluster", NULL, 0);
+ if (!iter)
+ goto out_error;
+
+ rc = 0;
+ while (j_iterator_has_more(iter))
+ {
+ c_cfs = (JConfigStanza *)j_iterator_get_next(iter);
+ rc = o2cb_config_fill_cluster(config, cf, c_cfs);
+ if (rc)
+ break;
+ }
+ j_iterator_free(iter);
+
+out_error:
+ return rc;
+}
+
O2CBConfig *o2cb_config_load(const char *filename)
{
gint rc;
@@ -233,7 +262,7 @@
config = NULL;
}
else
- config->c_valid = TRUE;
+ config->co_valid = TRUE;
}
j_config_free(cf);
@@ -241,32 +270,17 @@
return config;
} /* o2cb_config_load() */
-static gint o2cb_node_store(JConfig *cf, O2CBNode *node)
+static gint o2cb_node_store(JConfig *cf, O2CBCluster *cluster,
+ O2CBNode *node)
{
gchar *val;
JConfigStanza *cfs;
- cfs = j_config_get_stanza_nth(cf, "cluster", 0);
- if (!cfs)
- return -EINVAL;
-
- val = j_config_get_attribute(cfs, "name");
- if (!val)
- return -ENOMEM;
- if (!*val)
- {
- g_free(val);
- return -EINVAL;
- }
-
cfs = j_config_add_stanza(cf, "node");
if (!cfs)
- {
- g_free(val);
return -ENOMEM;
- }
- j_config_set_attribute(cfs, "cluster", val);
+ j_config_set_attribute(cfs, "cluster", cluster->c_name);
g_free(val);
j_config_set_attribute(cfs, "name", node->n_name);
@@ -287,39 +301,61 @@
return 0;
} /* o2cb_node_store() */
-gint o2cb_config_store(O2CBConfig *config, const gchar *filename)
+static gint o2cb_cluster_store(JConfig *cf, O2CBCluster *cluster)
{
int rc;
- JConfig *cf;
+ gchar *count;
+ GList *list;
JConfigStanza *cfs;
O2CBNode *node;
- gchar *count;
- GList *list;
- cf = j_config_parse_memory("", strlen(""));
- if (!cf)
- return -ENOMEM;
-
cfs = j_config_add_stanza(cf, "cluster");
- j_config_set_attribute(cfs, "name", config->c_name);
+ j_config_set_attribute(cfs, "name", cluster->c_name);
- count = g_strdup_printf("%u", config->c_num_nodes);
+ count = g_strdup_printf("%u", cluster->c_num_nodes);
j_config_set_attribute(cfs, "node_count", count);
g_free(count);
rc = 0;
- list = config->c_nodes;
+ list = cluster->c_nodes;
while (list)
{
node = (O2CBNode *)list->data;
- rc = o2cb_node_store(cf, node);
+ rc = o2cb_node_store(cf, cluster, node);
if (rc)
break;
list = list->next;
}
+ return rc;
+}
+
+
+gint o2cb_config_store(O2CBConfig *config, const gchar *filename)
+{
+ int rc;
+ JConfig *cf;
+ O2CBCluster *cluster;
+ GList *list;
+
+ cf = j_config_parse_memory("", strlen(""));
+ if (!cf)
+ return -ENOMEM;
+
+ rc = 0;
+ list = config->co_clusters;
+ while (list)
+ {
+ cluster = (O2CBCluster *)list->data;
+ rc = o2cb_cluster_store(cf, cluster);
+ if (rc)
+ break;
+
+ list = list->next;
+ }
+
if (!rc)
{
if (!j_config_dump_file(cf, filename))
@@ -339,15 +375,15 @@
g_free(node);
} /* o2cb_node_free() */
-void o2cb_config_free(O2CBConfig *config)
+static void o2cb_cluster_free(O2CBCluster *cluster)
{
GList *list;
O2CBNode *node;
- while (config->c_nodes)
+ while (cluster->c_nodes)
{
- list = config->c_nodes;
- config->c_nodes = list->next;
+ list = cluster->c_nodes;
+ cluster->c_nodes = list->next;
node = (O2CBNode *)list->data;
g_list_free(list);
@@ -355,50 +391,113 @@
o2cb_node_free(node);
}
- if (config->c_name)
- g_free(config->c_name);
+ if (cluster->c_name)
+ g_free(cluster->c_name);
+ g_free(cluster);
+} /* o2cb_cluster_free() */
+
+void o2cb_config_free(O2CBConfig *config)
+{
+ GList *list;
+ O2CBCluster *cluster;
+
+ while (config->co_clusters)
+ {
+ list = config->co_clusters;
+ config->co_clusters = list->next;
+
+ cluster = (O2CBCluster *)list->data;
+ g_list_free(list);
+
+ o2cb_cluster_free(cluster);
+ }
+
g_free(config);
-} /* o2cb_config_free() */
+}
-gchar *o2cb_config_get_cluster_name(O2CBConfig *config)
+O2CBCluster *o2cb_config_add_cluster(O2CBConfig *config)
{
+ O2CBCluster *cluster;
+
g_return_val_if_fail(config != NULL, NULL);
- return g_strdup(config->c_name);
-} /* o2cb_config_get_cluster_name() */
+ cluster = g_new(O2CBCluster, 1);
-gint o2cb_config_set_cluster_name(O2CBConfig *config, const gchar *name)
+ cluster->c_name = NULL;
+ cluster->c_num_nodes = 0;
+ cluster->c_nodes = NULL;
+
+ config->co_clusters = g_list_append(config->co_clusters, cluster);
+
+ config->co_valid = TRUE;
+
+ return cluster;
+} /* o2cb_cluster_add_node() */
+
+O2CBCluster *o2cb_config_get_cluster_by_name(O2CBConfig *config,
+ const gchar *name)
{
+ GList *list;
+ O2CBCluster *cluster;
+
+ g_return_val_if_fail(config != NULL, NULL);
+
+ list = config->co_clusters;
+ while (list)
+ {
+ cluster = (O2CBCluster *)list->data;
+ if (!strcmp(cluster->c_name, name))
+ return cluster;
+ list = list->next;
+ }
+
+ return NULL;
+} /* o2cb_config_get_cluster_by_name() */
+
+JIterator *o2cb_config_get_clusters(O2CBConfig *config)
+{
+ g_return_val_if_fail(config != NULL, NULL);
+
+ return j_iterator_new_from_list(config->co_clusters);
+} /* o2cb_config_get_clusters() */
+
+gchar *o2cb_cluster_get_name(O2CBCluster *cluster)
+{
+ g_return_val_if_fail(cluster != NULL, NULL);
+
+ return g_strdup(cluster->c_name);
+} /* o2cb_cluster_get_name() */
+
+gint o2cb_cluster_set_name(O2CBCluster *cluster, const gchar *name)
+{
gchar *new_name;
new_name = g_strdup(name);
if (!new_name)
return -ENOMEM;
- g_free(config->c_name);
- config->c_name = new_name;
+ g_free(cluster->c_name);
+ cluster->c_name = new_name;
- config->c_valid = TRUE;
-
return 0;
} /* o2cb_config_set_cluster_name() */
-JIterator *o2cb_config_get_nodes(O2CBConfig *config)
+JIterator *o2cb_cluster_get_nodes(O2CBCluster *cluster)
{
- g_return_val_if_fail(config != NULL, NULL);
+ g_return_val_if_fail(cluster != NULL, NULL);
- return j_iterator_new_from_list(config->c_nodes);
-} /* o2cb_config_get_nodes() */
+ return j_iterator_new_from_list(cluster->c_nodes);
+} /* o2cb_cluster_get_nodes() */
-O2CBNode *o2cb_config_get_node(O2CBConfig *config, guint n)
+O2CBNode *o2cb_cluster_get_node(O2CBCluster *cluster, guint n)
{
GList *list;
O2CBNode *node;
- g_return_val_if_fail(config != NULL, NULL);
+ g_return_val_if_fail(cluster != NULL, NULL);
- list = config->c_nodes;
+ list = cluster->c_nodes;
while (list)
{
node = (O2CBNode *)list->data;
@@ -408,30 +507,50 @@
}
return NULL;
-} /* o2cb_config_get_node() */
+} /* o2cb_cluster_get_node() */
-O2CBNode *o2cb_config_add_node(O2CBConfig *config)
+O2CBNode *o2cb_cluster_get_node_by_name(O2CBCluster *cluster,
+ const gchar *name)
{
+ GList *list;
O2CBNode *node;
- g_return_val_if_fail(config != NULL, NULL);
+ g_return_val_if_fail(cluster != NULL, NULL);
+ list = cluster->c_nodes;
+ while (list)
+ {
+ node = (O2CBNode *)list->data;
+ if (!strcmp(node->n_name, name))
+ return node;
+ list = list->next;
+ }
+
+ return NULL;
+} /* o2cb_cluster_get_node_by_name() */
+
+O2CBNode *o2cb_cluster_add_node(O2CBCluster *cluster)
+{
+ O2CBNode *node;
+
+ g_return_val_if_fail(cluster != NULL, NULL);
+
node = g_new(O2CBNode, 1);
node->n_name = NULL;
node->n_addr = NULL;
node->n_port = 0;
- node->n_number = config->c_num_nodes;
- config->c_num_nodes++;
+ node->n_number = cluster->c_num_nodes;
+ cluster->c_num_nodes++;
- config->c_nodes = g_list_append(config->c_nodes, node);
+ cluster->c_nodes = g_list_append(cluster->c_nodes, node);
return node;
-} /* o2cb_config_add_node() */
+} /* o2cb_cluster_add_node() */
-void o2cb_config_delete_node(O2CBConfig *config, O2CBNode *node)
+void o2cb_cluster_delete_node(O2CBCluster *cluster, O2CBNode *node)
{
-} /* o2cb_config_delete_node() */
+} /* o2cb_cluster_delete_node() */
gint o2cb_node_get_number(O2CBNode *node)
{
Modified: branches/usysfsify/clusterbo/o2cb_config.h
===================================================================
--- branches/usysfsify/clusterbo/o2cb_config.h 2005-03-18 01:46:03 UTC (rev 655)
+++ branches/usysfsify/clusterbo/o2cb_config.h 2005-03-18 02:31:05 UTC (rev 656)
@@ -26,6 +26,7 @@
#define _O2CB_CONFIG_H
typedef struct _O2CBConfig O2CBConfig;
+typedef struct _O2CBCluster O2CBCluster;
typedef struct _O2CBNode O2CBNode;
O2CBConfig *o2cb_config_initialize(void);
@@ -33,14 +34,21 @@
gint o2cb_config_store(O2CBConfig *config, const gchar *filename);
void o2cb_config_free(O2CBConfig *config);
-gchar *o2cb_config_get_cluster_name(O2CBConfig *config);
-gint o2cb_config_set_cluster_name(O2CBConfig *config,
- const gchar *name);
+O2CBCluster *o2cb_config_add_cluster(O2CBConfig *config);
+void o2cb_config_delete_cluster(O2CBConfig *config,
+ O2CBCluster *cluster);
+JIterator *o2cb_config_get_clusters(O2CBConfig *config);
+O2CBCluster *o2cb_config_get_cluster_by_name(O2CBConfig *config,
+ const gchar *name);
-JIterator *o2cb_config_get_nodes(O2CBConfig *config);
-O2CBNode *o2cb_config_get_node(O2CBConfig *config, guint n);
-O2CBNode *o2cb_config_add_node(O2CBConfig *config);
-void o2cb_config_delete_node(O2CBConfig *config, O2CBNode *node);
+gchar *o2cb_cluster_get_name(O2CBCluster *cluster);
+gint o2cb_cluster_set_name(O2CBCluster *cluster, const gchar *name);
+JIterator *o2cb_cluster_get_nodes(O2CBCluster *cluster);
+O2CBNode *o2cb_cluster_get_node(O2CBCluster *cluster, guint n);
+O2CBNode *o2cb_cluster_get_node_by_name(O2CBCluster *cluster,
+ const gchar *name);
+O2CBNode *o2cb_cluster_add_node(O2CBCluster *cluster);
+void o2cb_cluster_delete_node(O2CBCluster *cluster, O2CBNode *node);
gint o2cb_node_get_number(O2CBNode *node);
gchar *o2cb_node_get_name(O2CBNode *node);
Modified: branches/usysfsify/clusterbo/o2cb_ctl.c
===================================================================
--- branches/usysfsify/clusterbo/o2cb_ctl.c 2005-03-18 01:46:03 UTC (rev 655)
+++ branches/usysfsify/clusterbo/o2cb_ctl.c 2005-03-18 02:31:05 UTC (rev 656)
@@ -119,6 +119,7 @@
{O2CB_TYPE_CLUSTER, "name"},
{O2CB_TYPE_CLUSTER, "online"},
{O2CB_TYPE_NODE, "name"},
+ {O2CB_TYPE_NODE, "cluster"},
{O2CB_TYPE_NODE, "number"},
{O2CB_TYPE_NODE, "ip_address"},
{O2CB_TYPE_NODE, "ip_port"},
@@ -513,60 +514,49 @@
int rc;
gchar *object, *name;
gulong num;
- JIterator *iter;
+ JIterator *c_iter;
O2CBNode *node;
+ O2CBCluster *cluster;
object = (gchar *)ctxt->oc_objects->data;
- name = o2cb_config_get_cluster_name(ctxt->oc_config);
- if (!strcmp(name, object))
+ cluster = o2cb_config_get_cluster_by_name(ctxt->oc_config,
+ object);
+ if (cluster)
{
+ rc = 0;
ctxt->oc_type = O2CB_TYPE_CLUSTER;
- return 0;
+ goto out;
}
- g_free(name);
num = strtoul(object, &name, 10);
- if (name && !*name && (num < UINT_MAX))
+ if (!name || *name || (num == UINT_MAX))
+ num = UINT_MAX;
+
+ rc = -ENOMEM;
+ c_iter = o2cb_config_get_clusters(ctxt->oc_config);
+ if (!c_iter)
+ goto out;
+
+ rc = -ENOENT;
+ while (j_iterator_has_more(c_iter))
{
- /* The object key is a number, hence a node number.
- * object == NULL means check num, not object. */
- g_free(object);
- object = NULL;
- }
+ cluster = (O2CBCluster *)j_iterator_get_next(c_iter);
- iter = o2cb_config_get_nodes(ctxt->oc_config);
- if (!iter)
- return -ENOMEM;
+ node = o2cb_cluster_get_node_by_name(cluster, object);
+ if (!node && (num < UINT_MAX))
+ node = o2cb_cluster_get_node(cluster, num);
- rc = -ENOENT;
- while (j_iterator_has_more(iter))
- {
- node = (O2CBNode *)j_iterator_get_next(iter);
- if (object)
+ if (node)
{
- name = o2cb_node_get_name(node);
- rc = strcmp(name, object);
- g_free(name);
- if (!rc)
- {
- ctxt->oc_type = O2CB_TYPE_NODE;
- break;
- }
+ ctxt->oc_type = O2CB_TYPE_NODE;
+ rc = 0;
+ break;
}
- else
- {
- if (num == o2cb_node_get_number(node))
- {
- ctxt->oc_type = O2CB_TYPE_NODE;
- rc = 0;
- break;
- }
- }
}
-
- j_iterator_free(iter);
-
+ j_iterator_free(c_iter);
+
+out:
return rc;
} /* find_type_for_objects() */
@@ -589,7 +579,7 @@
return local;
}
-static gint online_cluster(O2CBContext *ctxt)
+static gint online_cluster(O2CBContext *ctxt, O2CBCluster *cluster)
{
errcode_t ret;
gint rc;
@@ -598,7 +588,7 @@
O2CBNode *node;
rc = -ENOMEM;
- name = o2cb_config_get_cluster_name(ctxt->oc_config);
+ name = o2cb_cluster_get_name(cluster);
if (!name)
goto out_error;
@@ -616,7 +606,7 @@
fprintf(stdout, "Cluster %s created\n", name);
rc = -ENOMEM;
- iter = o2cb_config_get_nodes(ctxt->oc_config);
+ iter = o2cb_cluster_get_nodes(cluster);
if (!iter)
goto out_error;
@@ -661,14 +651,15 @@
return rc;
} /* online_cluster() */
-static gint offline_cluster(O2CBContext *ctxt)
+static gint offline_cluster(O2CBContext *ctxt, O2CBCluster *cluster)
{
fprintf(stderr,
PROGNAME ": Offline of cluster not supported yet\n");
return -ENOTSUP;
} /* offline_cluster() */
-static gint run_change_cluster(O2CBContext *ctxt)
+static gint run_change_cluster_one(O2CBContext *ctxt,
+ O2CBCluster *cluster)
{
gint rc = 0;
const gchar *val;
@@ -688,7 +679,7 @@
PROGNAME ": Empty name for cluster\n");
return -EINVAL;
}
- rc = o2cb_config_set_cluster_name(ctxt->oc_config, val);
+ rc = o2cb_cluster_set_name(cluster, val);
if (rc)
return rc;
}
@@ -696,14 +687,44 @@
if (attr_set(ctxt, "online"))
{
if (attr_boolean(ctxt, "online", FALSE))
- rc = online_cluster(ctxt);
+ rc = online_cluster(ctxt, cluster);
else
- rc = offline_cluster(ctxt);
+ rc = offline_cluster(ctxt, cluster);
}
return rc;
-} /* run_change_cluster() */
+} /* run_change_cluster_one() */
+static gint run_change_clusters(O2CBContext *ctxt)
+{
+ gint rc = 0;
+ O2CBCluster *cluster;
+ GList *list;
+
+ list = ctxt->oc_objects;
+ while (list)
+ {
+ cluster = o2cb_config_get_cluster_by_name(ctxt->oc_config,
+ (gchar *)list->data);
+ if (!cluster)
+ {
+ rc = -ENOENT;
+ fprintf(stderr,
+ PROGNAME ": Cluster \"%s\" does not exist\n",
+ (gchar *)list->data);
+ break;
+ }
+
+ rc = run_change_cluster_one(ctxt, cluster);
+ if (rc)
+ break;
+
+ list = list->next;
+ }
+
+ return rc;
+}
+
static gint run_change(O2CBContext *ctxt)
{
gint rc;
@@ -745,7 +766,7 @@
}
else if (ctxt->oc_type == O2CB_TYPE_CLUSTER)
{
- rc = run_change_cluster(ctxt);
+ rc = run_change_clusters(ctxt);
if (rc)
goto out_error;
}
@@ -757,7 +778,6 @@
goto out_error;
}
-
rc = write_config(ctxt);
out_error:
More information about the Ocfs2-tools-commits
mailing list