[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