diff options
| author | Csaba Henk <csaba@gluster.com> | 2010-10-02 07:30:39 +0000 | 
|---|---|---|
| committer | Vijay Bellur <vijay@dev.gluster.com> | 2010-10-02 06:30:23 -0700 | 
| commit | ef44323b4ba58fa8c1eb89105851983f828dd91b (patch) | |
| tree | dcbfd98a87e1987145ab97366527b4e6e8900902 /libglusterfs | |
| parent | 067d0e476abe42f1e290039cb903928080e90d8d (diff) | |
volgen: reimplement volgen
Generating a volfile occurs in two steps:
- Build a graph (ie, glusterfs_graph_t instance) by graph manipulation
  primitives
- Write out the graph to a file by the the graph printing API.
Graph builder routines can optionally make use of a "modifier dict",
which can contain overrides wrt. volume options. This can be used
for a "dry-run" graph generation.
Signed-off-by: Csaba Henk <csaba@gluster.com>
Signed-off-by: Vijay Bellur <vijay@dev.gluster.com>
BUG: 1750 (clean up volgen)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1750
Diffstat (limited to 'libglusterfs')
| -rw-r--r-- | libglusterfs/src/graph-utils.h | 2 | ||||
| -rw-r--r-- | libglusterfs/src/graph.c | 71 | ||||
| -rw-r--r-- | libglusterfs/src/graph.y | 40 | 
3 files changed, 51 insertions, 62 deletions
diff --git a/libglusterfs/src/graph-utils.h b/libglusterfs/src/graph-utils.h index 359cdcc7a..c1c8c36d7 100644 --- a/libglusterfs/src/graph-utils.h +++ b/libglusterfs/src/graph-utils.h @@ -26,4 +26,6 @@ glusterfs_graph_print_file (FILE *file, glusterfs_graph_t *graph);  char *  glusterfs_graph_print_buf (glusterfs_graph_t *graph); +int glusterfs_xlator_link (xlator_t *pxl, xlator_t *cxl); +void glusterfs_graph_set_first (glusterfs_graph_t *graph, xlator_t *xl);  #endif diff --git a/libglusterfs/src/graph.c b/libglusterfs/src/graph.c index 0c63c194d..c821b3c2a 100644 --- a/libglusterfs/src/graph.c +++ b/libglusterfs/src/graph.c @@ -124,12 +124,54 @@ _log_if_option_is_invalid (xlator_t *xl, data_pair_t *pair)  int +glusterfs_xlator_link (xlator_t *pxl, xlator_t *cxl) +{ +        xlator_list_t   *xlchild = NULL; +        xlator_list_t   *xlparent = NULL; +        xlator_list_t  **tmp = NULL; + +        xlparent = (void *) GF_CALLOC (1, sizeof (*xlparent), +                                       gf_common_mt_xlator_list_t); +        if (!xlparent) +                return -1; + +        xlchild = (void *) GF_CALLOC (1, sizeof (*xlchild), +                                      gf_common_mt_xlator_list_t); +        if (!xlchild) { +                GF_FREE (xlparent); + +                return -1; +        } + +        xlparent->xlator = pxl; +        for (tmp = &cxl->parents; *tmp; tmp = &(*tmp)->next); +        *tmp = xlparent; + +        xlchild->xlator = cxl; +        for (tmp = &pxl->children; *tmp; tmp = &(*tmp)->next); +        *tmp = xlchild; + +        return 0; +} + + +void +glusterfs_graph_set_first (glusterfs_graph_t *graph, xlator_t *xl) +{ +        xl->next = graph->first; +        if (graph->first) +                ((xlator_t *)graph->first)->prev = xl; +        graph->first = xl; + +        graph->xl_count++; +} + + +int  glusterfs_graph_insert (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx,                          const char *type, const char *name)  {          xlator_t        *ixl = NULL; -        xlator_list_t   *xlchild = NULL; -        xlator_list_t   *xlparent = NULL;          if (!ctx->master) {                  gf_log ("glusterfs", GF_LOG_ERROR, @@ -160,32 +202,11 @@ glusterfs_graph_insert (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx,                  return -1;          } - -        /* children */ -        xlchild = GF_CALLOC (sizeof (*xlchild), 1, gf_common_mt_xlator_list_t); -        if (!xlchild) +        if (glusterfs_xlator_link (ixl, graph->top) == -1)                  goto err; -        xlchild->xlator = graph->top; -        ixl->children = xlchild; xlchild = NULL; - - -        /* parent */ -        xlparent = GF_CALLOC (sizeof (*xlparent), 1, -                              gf_common_mt_xlator_list_t); -        if (!xlparent) -                goto err; -        xlparent->xlator = ixl; - -        ixl->next = graph->first; -        graph->first = ixl; - -        xlparent->next = ((xlator_t *)graph->top)->parents; -        ((xlator_t *)graph->top)->parents = xlparent; - +        glusterfs_graph_set_first (graph, ixl);          graph->top = ixl; -        graph->xl_count++; -          return 0;  err:          xlator_destroy (ixl); diff --git a/libglusterfs/src/graph.y b/libglusterfs/src/graph.y index 14afaae64..19dfff0fd 100644 --- a/libglusterfs/src/graph.y +++ b/libglusterfs/src/graph.y @@ -30,6 +30,7 @@  #include <sys/wait.h>  #include "xlator.h" +#include "graph-utils.h"  #include "logging.h"  static int new_volume (char *name); @@ -270,9 +271,6 @@ volume_sub (char *sub)  {          extern int       yylineno;          xlator_t        *trav = NULL; -        xlator_list_t   *xlchild = NULL; -        xlator_list_t   *tmp = NULL; -        xlator_list_t   *xlparent = NULL;          int              ret = 0;          if (!sub) { @@ -306,45 +304,13 @@ volume_sub (char *sub)                  goto out;          } -        xlparent = (void *) GF_CALLOC (1, sizeof (*xlparent), -                                       gf_common_mt_xlator_list_t); - -        if (!xlparent) { -                gf_log ("parser", GF_LOG_ERROR, "Out of memory"); -                ret = -1; -                goto out; -        } - -        xlparent->xlator = curr; - -        tmp = trav->parents; -        if (tmp == NULL) { -                trav->parents = xlparent; -        } else { -                while (tmp->next) -                        tmp = tmp->next; -                tmp->next = xlparent; -        } - -        xlchild = (void *) GF_CALLOC (1, sizeof(*xlchild), -                                      gf_common_mt_xlator_list_t); -        if (!xlchild) { +	ret = glusterfs_xlator_link (curr, trav); +	if (ret) {                  gf_log ("parser", GF_LOG_ERROR, "Out of memory");                  ret = -1;                  goto out;          } -        xlchild->xlator = trav; - -        tmp = curr->children; -        if (tmp == NULL) { -                curr->children = xlchild; -        } else { -                while (tmp->next) -                        tmp = tmp->next; -                tmp->next = xlchild; -        } -          gf_log ("parser", GF_LOG_TRACE, "child:%s->%s", curr->name, sub);  out:  | 
