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 | |
| 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
| -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 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.c | 52 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 16 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.c | 2913 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.h | 134 | 
7 files changed, 735 insertions, 2493 deletions
diff --git a/libglusterfs/src/graph-utils.h b/libglusterfs/src/graph-utils.h index 359cdcc7a34..c1c8c36d703 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 0c63c194d01..c821b3c2abc 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 14afaae6475..19dfff0fd6e 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: diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index 98ca78b5f62..317eab700ba 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -1119,50 +1119,16 @@ out:  } -char *set_option_list[] = { -	"max-file-size", -	"min-file-size", -	"cache-timeout", -	"priority", -	"entry-change-log", -	"read-subvolume", -	"background-self-heal-count", -	"metadata-self-heal", -	"data-self-heal", -	"entry-self-heal", -	"strict-readdir", -	"data-self-heal-window-size", -	"data-change-log", -	"metadata-change-log", -	"frame-timeout", -	"ping-timeout", -	"cache-size", -	"disk-usage-limit", -	"min-free-disk-limit", -	"block-size", -	"inode-lru-limit", -	"thread-count"	, -	"lookup-unhashed", -	"min-free-disk", -        "write-behind", -        "read-ahead", -        "io-cache", -        "quick-read", -        "stat-prefetch", -        "latency-measurement", -        "dump-fd-stats", -}; - -  gf_boolean_t  glusterd_check_option_exists(char *optstring)  { -	//struct set_option_list		       *list; -	char 				      **list = NULL; +        struct volopt_map_entry *vme = NULL; -	for (list = &set_option_list[0]; *list ;list++) -		if (!strcmp (optstring, *list)) +        for (vme = glusterd_volopt_map; vme->key; vme++) { +                if (strcmp (vme->key, optstring) == 0)  			return _gf_true; +        } +  	return _gf_false;  } @@ -1781,7 +1747,7 @@ rb_regenerate_volfiles (glusterd_volinfo_t *volinfo,                  goto out;          } -        ret = glusterd_rb_create_volfiles (volinfo, brickinfo); +        ret = glusterd_create_rb_volfiles (volinfo, brickinfo);  out:          return ret; @@ -2844,7 +2810,11 @@ glusterd_op_set_volume (gd1_mgmt_stage_op_req *req)  			goto out;          	} -		ret = set_xlator_option (volinfo->dict, key, value); +                value = gf_strdup (value); +                if (value) +		        ret = dict_set_dynstr (volinfo->dict, key, value); +                else +                        ret = -1;  		if (ret) {                  	gf_log ("", GF_LOG_ERROR, "Unable to set the options" diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 3fa965c8800..8ad9379a73f 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -495,8 +495,8 @@ glusterd_volinfo_new (glusterd_volinfo_t **volinfo)          INIT_LIST_HEAD (&new_volinfo->vol_list);          INIT_LIST_HEAD (&new_volinfo->bricks); -        ret = glusterd_default_xlator_options (new_volinfo); -        if (ret) { +        new_volinfo->dict = dict_new (); +        if (!new_volinfo->dict) {                  if (new_volinfo)                          GF_FREE (new_volinfo); @@ -1620,7 +1620,7 @@ glusterd_nfs_server_start ()          glusterd_conf_t         *priv = NULL;          char                    pidfile[PATH_MAX] = {0,};          char                    logfile[PATH_MAX] = {0,}; -        char                    *volfile = NULL; +        char                    volfile[PATH_MAX] = {0,};          char                    path[PATH_MAX] = {0,};          char                    cmd_str[8192] = {0,};          char                    rundir[PATH_MAX] = {0,}; @@ -1641,11 +1641,7 @@ glusterd_nfs_server_start ()          }          GLUSTERD_GET_NFS_PIDFILE(pidfile); -        volfile = glusterd_get_nfs_filepath (); -        if (!volfile) { -                ret = -1; -                goto out; -        } +        glusterd_get_nfs_filepath (volfile);          ret = access (volfile, F_OK);          if (ret) { @@ -1662,8 +1658,6 @@ glusterd_nfs_server_start ()          ret = gf_system (cmd_str);  out: -        if (volfile) -                GF_FREE(volfile);          return ret;  } @@ -1721,7 +1715,7 @@ glusterd_check_generate_start_nfs (glusterd_volinfo_t *volinfo)                  goto out;          } -        ret = volgen_generate_nfs_volfile (volinfo); +        ret = glusterd_create_nfs_volfile ();          if (ret)                  goto out; diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index bed21b30030..be3e55a4745 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -1,5 +1,5 @@  /* -  Copyright (c) 2006-2009 Gluster, Inc. <http://www.gluster.com> +  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com>    This file is part of GlusterFS.    GlusterFS is GF_FREE software; you can redistribute it and/or modify @@ -24,1987 +24,631 @@  #endif  #include "xlator.h" -#include "protocol-common.h"  #include "glusterd.h"  #include "defaults.h" -#include "list.h" +#include "logging.h"  #include "dict.h" -#include "compat.h" -#include "compat-errno.h" -#include "glusterd-sm.h" -#include "glusterd-op-sm.h" -#include "cli1.h" +#include "graph-utils.h"  #include "glusterd-mem-types.h" +#include "cli1.h"  #include "glusterd-volgen.h" -#include "glusterd-utils.h" -int -set_xlator_option (dict_t *dict, char *key, -                   char *value) -{ -        int  ret      = 0; -        char *str     = NULL; -        str = GF_CALLOC (1, strlen (value) + 1, -                         gf_gld_mt_char); +/* dispatch table for VOLUME SET + * + * First field is the <key>, for the purpose of looking it up + * in volume dictionary. + * + * Second field is of the format "<xlator-type>:<action-specifier>". + * The ":<action-specifier>" part can be omitted, which is handled + * as if <action-specifier> is same as <key>. + * + * There are two type of entries: basic and special. + * + * - Basic entries are the ones where the <action-specifier> + *   does _not_ start with the bang! character ('!'). + *   In their case, <action-specifier> is understood as + *   an option for <xlator-type>. Their effect is to copy over + *   the volinfo->dict[<key>] value to the graph nodes of + *   type <xlator-type> (if such a value is set). You are free to + *   add entries of this type, they will become functional just + *   by being present in the table. + * + * - Special entries where the <action-specifier> starts + *   with the bang!. They are not applied to all graphs + *   during generation, and you cannot extend them in a + *   trivial way which could be just picked up. Better + *   not touch them unless you know what you do. + */ + +struct volopt_map_entry glusterd_volopt_map[] = { +        {"lookup-unhashed",             "cluster/distribute"}, +        {"min-free-disk",               "cluster/distribute"}, + +        {"entry-change-log",            "cluster/replicate"}, +        {"read-subvolume",              "cluster/replicate"}, +        {"background-self-heal-count",  "cluster/replicate"}, +        {"metadata-self-heal",          "cluster/replicate"}, +        {"data-self-heal",              "cluster/replicate"}, +        {"entry-self-heal",             "cluster/replicate"}, +        {"strict-readdir",              "cluster/replicate"}, +        {"data-self-heal-window-size",  "cluster/replicate"}, +        {"data-change-log",             "cluster/replicate"}, +        {"metadata-change-log",         "cluster/replicate"}, + +        {"block-size",                  "cluster/stripe"}, + +        {"latency-measurement",         "debug/io-stats"}, +        {"dump-fd-stats",               "debug/io-stats"}, + +        {"max-file-size",               "performance/io-cache"}, +        {"min-file-size",               "performance/io-cache"}, +        {"cache-timeout",               "performance/io-cache"}, +        {"cache-size",                  "performance/io-cache"}, +        {"priority",                    "performance/io-cache"}, + +        {"thread-count",                "performance/io-threads"}, + +        {"disk-usage-limit",            "performance/quota"}, +        {"min-free-disk-limit",         "performance/quota"}, + +        {"window-size",                 "performance/write-behind:cache-size"}, + +        {"frame-timeout",               "protocol/client"}, +        {"ping-timeout",                "protocol/client"}, + +        {"inode-lru-limit",             "protocol/server"}, + +        {"write-behind",                "performance/write-behind:!perf"}, +        {"read-ahead",                  "performance/read-ahead:!perf"}, +        {"io-cache",                    "performance/io-cache:!perf"}, +        {"quick-read",                  "performance/quick-read:!perf"}, +        {"stat-prefetch",               "performance/stat-prefetch:!perf"}, + +        {NULL,                          } +}; + + +/* Default entries (as of now, only for special volopts). */ + +struct volopt_map_entry2 { +        char *key; +        char *voltype; +        char *option; +        char *value; +}; + +static struct volopt_map_entry2 default_volopt_map2[] = { +        {"write-behind",  NULL, NULL, "on"}, +        {"read-ahead",    NULL, NULL, "on"}, +        {"io-cache",      NULL, NULL, "on"}, +        {"quick-read",    NULL, NULL, "on"}, +        {NULL,                            } +}; + +#define VOLGEN_GET_NFS_DIR(path)                                        \ +        do {                                                            \ +                glusterd_conf_t *priv = THIS->private;                  \ +                snprintf (path, PATH_MAX, "%s/nfs", priv->workdir);     \ +        } while (0);                                                    \ + +#define VOLGEN_GET_VOLUME_DIR(path, volinfo)                            \ +        do {                                                            \ +                glusterd_conf_t *priv = THIS->private;                  \ +                snprintf (path, PATH_MAX, "%s/vols/%s", priv->workdir,  \ +                          volinfo->volname);                            \ +        } while (0);                                                    \ + + + + +/********************************************* + * + * xlator generation / graph manipulation API + * + *********************************************/ + + -        if (!str) -                return -1; - -        strncpy (str, value, strlen (value)); - -        ret = dict_set_dynstr (dict, key, str); - -        return ret; -} - -static int32_t -set_default_options (dict_t *dict, char *volname) +static xlator_t * +xlator_instantiate_va (const char *type, const char *format, va_list arg)  { -        int     ret       = -1; - -        ret = dict_set_str (dict, "volname", -                            volname); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_POSIX_OPTION_ODIRECT, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_POSIX_OPTION_STATFSSIZE, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_POSIX_OPTION_MANDATTR, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_POSIX_OPTION_SPANDEVICES, -                                 "1"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_POSIX_OPTION_BCKUNLINK, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_LOCKS_OPTION_TRACE, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_LOCKS_OPTION_MAND, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_CLIENT_OPTION_TRANSTYPE, -                                 "tcp"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_CLIENT_OPTION_NODELAY, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_IOT_OPTION_THREADCOUNT, -                                 "16"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_IOT_OPTION_AUTOSCALING, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_IOT_OPTION_MINTHREADS, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_IOT_OPTION_MAXTHREADS, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_SERVER_OPTION_TRANSTYPE, -                                 "tcp"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_SERVER_OPTION_NODELAY, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_REPLICATE_OPTION_READSUBVOL, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_REPLICATE_OPTION_FAVCHILD, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_REPLICATE_OPTION_BCKSHCOUNT, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_REPLICATE_OPTION_DATASH, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_REPLICATE_OPTION_DATASHALGO, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_REPLICATE_OPTION_SHWINDOWSIZE, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_REPLICATE_OPTION_METASH, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_REPLICATE_OPTION_ENTRYSH, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_REPLICATE_OPTION_DATACHANGELOG, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_REPLICATE_OPTION_METADATACHANGELOG, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_REPLICATE_OPTION_ENTRYCHANGELOG, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_REPLICATE_OPTION_STRICTREADDIR, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_STRIPE_OPTION_BLOCKSIZE, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_STRIPE_OPTION_USEXATTR, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_DHT_OPTION_LOOKUPUNHASH, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_DHT_OPTION_MINFREEDISK, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_DHT_OPTION_UNHASHSTICKY, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_WB_OPTION_FLUSHBEHIND, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_WB_OPTION_CACHESIZE, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_WB_OPTION_DISABLENBYTES, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_WB_OPTION_OSYNC, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_WB_OPTION_TRICKLINGWRITES, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_RA_OPTION_ATIME, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_RA_OPTION_PAGECOUNT, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_IOCACHE_OPTION_PRIORITY, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_IOCACHE_OPTION_TIMEOUT, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_IOCACHE_OPTION_CACHESIZE, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_IOCACHE_OPTION_MINFILESIZE, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_IOCACHE_OPTION_MAXFILESIZE, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_QR_OPTION_PRIORITY, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_QR_OPTION_TIMEOUT, -                                 "on"); -        if (ret) -                goto out; - -        ret = set_xlator_option (dict, VOLGEN_QR_OPTION_CACHESIZE, -                                 "on"); -        if (ret) -                goto out; +        xlator_t *xl = NULL; +        char *volname = NULL; +        int ret = 0; -        ret = set_xlator_option (dict, VOLGEN_QR_OPTION_MAXFILESIZE, -                                 "on"); -        if (ret) -                goto out; +        ret = gf_vasprintf (&volname, format, arg); +        if (ret < 0) { +                volname = NULL; -        ret = set_xlator_option (dict, VOLGEN_IOS_OPTION_DUMP_FD_STATS, -                                 "no"); -        if (ret) -                goto out; +                goto error; +        } -        ret = set_xlator_option (dict, VOLGEN_IOS_OPTION_MEASURE_LATENCY, -                                 "no"); +        xl = GF_CALLOC (1, sizeof (*xl), gf_common_mt_xlator_t); +        if (!xl) +                goto error; +        ret = xlator_set_type_virtual (xl, type);          if (ret) -                goto out; - -        ret = 0; - -out: -        return ret; +                goto error; +        xl->options = get_new_dict(); +        if (!xl->options) +                goto error; +        xl->name = volname; + +        return xl; + + error: +        gf_log ("", GF_LOG_ERROR, "creating xlator of type %s failed", +                type); +        if (volname) +                GF_FREE (volname); +        if (xl) +                xlator_destroy (xl); + +        return NULL;  } -int32_t -glusterd_default_xlator_options (glusterd_volinfo_t *volinfo) +static xlator_t * +xlator_instantiate (const char *type, const char *format, ...)  { -        int ret = -1; - -        volinfo->dict = dict_new (); -        if (!volinfo->dict) { -                ret = -1; -                goto out; -        } - -        ret = set_default_options (volinfo->dict, -                                   volinfo->volname); -        if (ret) { -                dict_unref (volinfo->dict); -                goto out; -        } - -        ret = 0; +        va_list arg; +        xlator_t *xl; -out: -        return ret; +        va_start (arg, format); +        xl = xlator_instantiate_va (type, format, arg); +        va_end (arg); +        return xl;  }  static int -__write_posix_xlator (FILE *file, dict_t *dict, -                      char *posix_directory) +volgen_xlator_link (xlator_t *pxl, xlator_t *cxl)  { -         char      *volname                 = NULL; -        char       *opt_odirect             = NULL; -        char       *opt_statfssize          = NULL; -        char       *opt_mandattr            = NULL; -        char       *opt_spandevices         = NULL; -        char       *opt_bckunlink           = NULL; -        int         ret                     = -1; - -        const char *posix_str = "volume %s-%s\n" -                "    type storage/posix\n" -                "    option directory %s\n" -                "#   option o-direct %s\n" -                "#   option export-statfs-size %s\n" -                "#   option mandate-attribute %s\n" -                "#   option span-devices %s\n" -                "#   option background-unlink %s\n" -                "end-volume\n\n"; - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } - -        ret = dict_get_str (dict, VOLGEN_POSIX_OPTION_ODIRECT, -                            &opt_odirect); -        if (ret) { -                goto out; -        } - -        ret = dict_get_str (dict, VOLGEN_POSIX_OPTION_STATFSSIZE, -                            &opt_statfssize); -        if (ret) { -                goto out; -        } - -        ret = dict_get_str (dict, VOLGEN_POSIX_OPTION_MANDATTR, -                            &opt_mandattr); -        if (ret) { -                goto out; -        } - -        ret = dict_get_str (dict, VOLGEN_POSIX_OPTION_SPANDEVICES, -                            &opt_spandevices); -        if (ret) { -                goto out; -        } +        int ret = 0; -        ret = dict_get_str (dict, VOLGEN_POSIX_OPTION_BCKUNLINK, -                            &opt_bckunlink); -        if (ret) { -                goto out; +        ret = glusterfs_xlator_link (pxl, cxl); +        if (ret == -1) { +                gf_log ("", GF_LOG_ERROR, +                        "Out of memory, cannot link xlators %s <- %s", +                        pxl->name, cxl->name);          } -        fprintf (file, posix_str, -                 volname, -                 "posix", -                 posix_directory, -                 opt_odirect, -                 opt_statfssize, -                 opt_mandattr, -                 opt_spandevices, -                 opt_bckunlink); - -        ret = 0; - -out:          return ret;  }  static int -__write_locks_xlator (FILE *file, dict_t *dict, -                      char *subvolume) +volgen_graph_insert (glusterfs_graph_t *graph, xlator_t *xl)  { -        char       *volname           = NULL; -        char       *opt_trace         = NULL; -        char       *opt_mand          = NULL; -        int         ret               = -1; - -        const char *locks_str = "volume %s-%s\n" -                "    type features/locks\n" -                "#   option trace %s\n" -                "#   option mandatory %s\n" -                "    subvolumes %s\n" -                "end-volume\n\n"; - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } +        int ret = 0; -        ret = dict_get_str (dict, VOLGEN_LOCKS_OPTION_TRACE, -                            &opt_trace); -        if (ret) { -                goto out; -        } +        /* no need to care about graph->top here */ +        if (graph->first) +                ret = volgen_xlator_link (xl, graph->first); +        if (ret == -1) { +                gf_log ("", GF_LOG_ERROR, "failed to add graph entry %s", +                        xl->name); -        ret = dict_get_str (dict, VOLGEN_LOCKS_OPTION_MAND, -                            &opt_mand); -        if (ret) { -                goto out; +                return -1;          } -        fprintf (file, locks_str, -                 volname, -                 "locks", -                 opt_trace, -                 opt_mand, -                 subvolume); - -        ret = 0; +        glusterfs_graph_set_first (graph, xl); -out: -        return ret; +        return 0;  }  static int -__write_client_xlator (FILE *file, dict_t *dict, -                       char *remote_subvol, -                       char *remote_host, -                       int count, -                       char *last_xlator) +volgen_graph_add_as (glusterfs_graph_t *graph, const char *type, +                     const char *format, ...)  { -        char       *volname               = NULL; -        char       *opt_transtype         = NULL; -        char       *opt_nodelay           = NULL; -        int         ret                   = 0; -	char	   *ping                  = NULL; -	char	   *frame                 = NULL; -	char	    ping_timeout[100]	  = {0, }; -	char 	    frame_timeout[100]	  = {0, }; - -        const char *client_str = "volume %s-%s-%d\n" -                "    type protocol/client\n" -                "    option transport-type %s\n" -                "    option remote-host %s\n" -                "    option transport.socket.nodelay %s\n" -		"%s" //for frame-timeout -		"%s" //for ping-timeout -                "    option remote-subvolume %s\n" -                "end-volume\n\n"; - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } +        va_list arg; +        xlator_t *xl; -        ret = dict_get_str (dict, VOLGEN_CLIENT_OPTION_TRANSTYPE, -                            &opt_transtype); -        if (ret) { -                goto out; -        } +        va_start (arg, format); +        xl = xlator_instantiate_va (type, format, arg); +        va_end (arg); -        ret = dict_get_str (dict, VOLGEN_CLIENT_OPTION_NODELAY, -                            &opt_nodelay); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "frame-timeout")) { -		ret = dict_get_str (dict, "frame-timeout", &frame); -		if (ret) { -                	goto out; -        	} -		gf_log ("", GF_LOG_DEBUG, "Reconfiguring frame-timeout %s", -			frame); -		sprintf(frame_timeout, "    option frame-timeout %s\n",frame); -	}  - -	if (dict_get (dict, "ping-timeout")) { -		ret = dict_get_str (dict, "ping-timeout", &ping); -		if (ret) { -                	goto out; -        	} -		gf_log ("", GF_LOG_DEBUG, "Reconfiguring ping-timeout %s", -			ping); -		sprintf(ping_timeout, "    option ping-timeout %s\n",ping); -	}  - -        fprintf (file, client_str, -                 volname, -                 "client", -                 count, -                 opt_transtype, -                 remote_host, -                 opt_nodelay, -		 frame_timeout, -		 ping_timeout, -                 remote_subvol); - -        ret = 0; - -        snprintf (last_xlator, 1024, "%s-%s-%d", -                  volname, "client", count); +        if (!xl) +                return -1; -out: -        return ret; +        return volgen_graph_insert(graph, xl);  }  static int -__write_replace_brick_xlator (FILE *file, dict_t *dict) +volgen_graph_add (glusterfs_graph_t *graph, char *type, char *volname)  { -        char       *volname               = NULL; -        char       *opt_transtype         = NULL; -        char       *opt_nodelay           = NULL; -        int         ret                   = 0; - - -        const char *client_str = "volume %s-%s\n" -                "    type protocol/client\n" -                "    option transport-type %s\n" -                "    option remote-port 34034\n" -                "    option transport.socket.nodelay %s\n" -                "end-volume\n\n"; - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } +        char *shorttype = NULL; -        ret = dict_get_str (dict, VOLGEN_CLIENT_OPTION_TRANSTYPE, -                            &opt_transtype); -        if (ret) { -                goto out; -        } - -        ret = dict_get_str (dict, VOLGEN_CLIENT_OPTION_NODELAY, -                            &opt_nodelay); -        if (ret) { -                goto out; -        } - -        fprintf (file, client_str, -                 volname, -                 "replace-brick", -                 opt_transtype, -                 opt_nodelay); +        shorttype = strrchr (type, '/'); +        GF_ASSERT (shorttype); +        shorttype++; +        GF_ASSERT (*shorttype); -        ret = 0; - -out: -        return ret; +        return volgen_graph_add_as (graph, type, "%s-%s", volname, shorttype);  } +/* XXX Seems there is no such generic routine? + * Maybe should put to xlator.c ?? + */  static int -__write_pump_xlator (FILE *file, dict_t *dict, -                     char *subvolume) +xlator_set_option (xlator_t *xl, char *key, char *value)  { -        char *volname   = NULL; -        int   ret       = -1; +        char *dval     = NULL; -        const char *pump_str = "volume %s-%s\n" -                "    type cluster/pump\n" -                "    subvolumes %s %s-replace-brick\n" -                "end-volume\n\n"; +        dval = gf_strdup (value); +        if (!dval) { +                gf_log ("", GF_LOG_ERROR, +                        "failed to set xlator opt: %s[%s] = %s", +                        xl->name, key, value); -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; +                return -1;          } -        fprintf (file, pump_str, -                 volname, "pump", -                 subvolume, -                 volname); - -        ret = 0; - -out: -        return ret; +        return dict_set_dynstr (xl->options, key, dval);  } -static int -__write_iothreads_xlator (FILE *file, dict_t *dict, -                          char *subvolume) +static inline xlator_t * +first_of (glusterfs_graph_t *graph)  { -        char       *volname           = NULL; -        char       *opt_threadcount   = NULL; -        char       *opt_autoscaling   = NULL; -        char       *opt_minthreads    = NULL; -        char       *opt_maxthreads    = NULL; -        int         ret               = -1; - -        const char *iot_str = "volume %s-iot\n" -                "    type performance/io-threads\n" -                "    option thread-count %s\n" -                "#   option autoscaling %s\n" -                "#   option min-threads %s\n" -                "#   option max-threads %s\n" -                "    subvolumes %s\n" -                "end-volume\n\n"; - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "thread-count")) { -		gf_log("", GF_LOG_DEBUG, "Resetting the thread-count value"); -        	ret = dict_get_str (dict, "thread-count", &opt_threadcount); -	} else -		ret = dict_get_str (dict, VOLGEN_IOT_OPTION_THREADCOUNT, -                	            &opt_threadcount); - -        if (ret) { -                goto out; -        } - -        ret = dict_get_str (dict, VOLGEN_IOT_OPTION_AUTOSCALING, -                            &opt_autoscaling); -        if (ret) { -                goto out; -        } +        return (xlator_t *)graph->first; +} -        ret = dict_get_str (dict, VOLGEN_IOT_OPTION_MINTHREADS, -                            &opt_minthreads); -        if (ret) { -                goto out; -        } -        ret = dict_get_str (dict, VOLGEN_IOT_OPTION_MAXTHREADS, -                            &opt_maxthreads); -        if (ret) { -                goto out; -        } -        fprintf (file, iot_str, -                 volname, -                 opt_threadcount, -                 opt_autoscaling, -                 opt_minthreads, -                 opt_maxthreads, -                 subvolume); -        ret = 0; +/************************** + * + * Volume generation engine + * + **************************/ -out: -        return ret; -}  static int -__write_access_control_xlator (FILE *file, dict_t *dict, -                               char *subvolume) +volgen_graph_set_options_generic (glusterfs_graph_t *graph, dict_t *dict, +                                  void *param, +                                  int (*handler) (glusterfs_graph_t *graph, +                                                  struct volopt_map_entry2 *vme2, +                                                  void *param))  { -        char  *volname       = NULL; -        int    ret           = -1; - -        const char *ac_str = "volume %s-access-control\n" -                             "    type features/access-control\n" -                             "    subvolumes %s\n" -                             "end-volume\n\n"; - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } - +        struct volopt_map_entry *vme = NULL; +        struct volopt_map_entry2 vme2 = {0,}; +        struct volopt_map_entry2 *vme2x = NULL; +        char *value = NULL; +        int ret = 0; -        fprintf (file, ac_str, volname, subvolume); -        ret = 0; +        for (vme = glusterd_volopt_map; vme->key; vme++) { +                ret = dict_get_str (dict, vme->key, &value); +                if (ret) { +                        for (vme2x = default_volopt_map2; vme2x->key; +                             vme2x++) { +                                if (strcmp (vme2x->key, vme->key) == 0) { +                                        value = vme2x->value; +                                        ret = 0; +                                        break; +                                } +                        } +                } +                if (ret) +                        continue; -out: -        return ret; -} +                vme2.key = vme->key; +                vme2.voltype = gf_strdup (vme->voltype); +                if (!vme2.voltype) { +                        gf_log ("", GF_LOG_ERROR, "Out of memory"); -static int -__write_server_xlator (FILE *file, dict_t *dict, -                       char *subvolume) -{ -        char  *volname              = NULL; -        char  *opt_transtype        = NULL; -        char  *opt_nodelay          = NULL; -        int    ret                  = -1; -	char  *lru_count            = NULL; -	char   inode_lru_count[100] = {0,};  - -        const char *server_str = "volume %s-%s\n" -                "    type protocol/server\n" -                "    option transport-type %s\n" -                "    option auth.addr.%s.allow *\n" -                "    option transport.socket.nodelay %s\n" -		"%s"//for inode-lru-limit -                "    subvolumes %s\n" -                "end-volume\n\n"; - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } +                        return -1; +                } +                vme2.option = strchr (vme2.voltype, ':'); +                if (vme2.option) { +                        *vme2.option = '\0'; +                        vme2.option++; +                } else +                        vme2.option = vme->key; +                vme2.value = value; -        ret = dict_get_str (dict, VOLGEN_SERVER_OPTION_TRANSTYPE, -                            &opt_transtype); -        if (ret) { -                goto out; -        } +                ret = handler (graph, &vme2, param); -        ret = dict_get_str (dict, VOLGEN_SERVER_OPTION_NODELAY, -                            &opt_nodelay); -        if (ret) { -                goto out; +                GF_FREE (vme2.voltype); +                if (ret) +                        return -1;          } -	if (dict_get (dict, "inode-lru-limit")) { -		ret = dict_get_str (dict, "inode-lru-limit", &lru_count); -		if (ret) { -                	goto out; -        	} -		gf_log ("", GF_LOG_DEBUG, "Reconfiguring inode-lru-limit %s", -			lru_count); -		sprintf (inode_lru_count, "    option inode-lru-limit %s\n",  -			 lru_count); -	}  - -        fprintf (file, server_str, -                 volname, "server", -                 opt_transtype, -                 subvolume, -                 opt_nodelay, -		 inode_lru_count, -                 subvolume -		 ); - -        ret = 0; - -out: -        return ret; +        return 0;  }  static int -__write_replicate_xlator (FILE *file, dict_t *dict, -                          char *subvolume, -                          int replicate_count, -                          int subvol_count, -                          int count, -                          char *last_xlator) +basic_option_handler (glusterfs_graph_t *graph, struct volopt_map_entry2 *vme2, +                      void *param)  { -        char *volname               = NULL; -        char       *opt_readsubvol        = NULL; -        char       *opt_favchild          = NULL; -        char       *opt_bckshcount        = NULL; -        char       *opt_datash            = NULL; -        char       *opt_datashalgo        = NULL; -        char       *opt_shwindowsize      = NULL; -        char       *opt_metash            = NULL; -        char       *opt_entrysh           = NULL; -        char       *opt_datachangelog     = NULL; -        char       *opt_metadatachangelog = NULL; -        char       *opt_entrychangelog    = NULL; -        char       *opt_strictreaddir     = NULL; -        char        *subvol_str           = NULL; -        char        tmp[4096]             = {0,}; -        int         ret                   = -1; -        int         subvolume_count       = 0; -        int         i                     = 0; -        int         len                   = 0; -        int         subvol_len            = 0; - - -        char replicate_str[] = "volume %s-%s-%d\n" -                "    type cluster/replicate\n" -                "#   option read-subvolume %s\n" -                "#   option favorite-child %s\n" -                "#   option background-self-heal-count %s\n" -                "#   option data-self-heal %s\n" -                "#   option data-self-heal-algorithm %s\n" -                "#   option data-self-heal-window-size %s\n" -                "#   option metadata-self-heal %s\n" -                "#   option entry-self-heal %s\n" -                "#   option data-change-log %s\n" -                "#   option metadata-change-log %s\n" -                "#   option entry-change-log %s\n" -                "#   option strict-readdir %s\n" -                "    subvolumes %s\n" -                "end-volume\n\n"; - -        subvolume_count = subvol_count; - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "read-subvolume")) { -		ret = dict_get_str (dict, "read-subvolume", &opt_readsubvol); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring read-subvolume: %s",  -		       &opt_readsubvol); -		uncomment_option (replicate_str, -				  (char *) "#   option read-subvolume %s\n"); -	} -	else -        	ret = dict_get_str (dict, VOLGEN_REPLICATE_OPTION_READSUBVOL, -                            &opt_readsubvol); -        if (ret) { -                goto out; -        } - -        ret = dict_get_str (dict, VOLGEN_REPLICATE_OPTION_FAVCHILD, -                            &opt_favchild); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "background-self-heal-count")) { -		ret = dict_get_str (dict,"background-self-heal-count",  -				    &opt_bckshcount); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring background-self-heal-" -					 "count: %s", &opt_bckshcount); -		uncomment_option (replicate_str, -				  (char *) "#   option background-self-heal-count %s\n"); -	} -	else -	        ret = dict_get_str (dict, VOLGEN_REPLICATE_OPTION_BCKSHCOUNT, -                            &opt_bckshcount); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "data-self-heal")) { -		ret = dict_get_str (dict,"data-self-heal",  -				    &opt_datash); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring data-self-heal" -					 "count: %s", &opt_datash); -		uncomment_option (replicate_str, -				  (char *) "#   option data-self-heal %s\n"); -	} -	else -	        ret = dict_get_str (dict, VOLGEN_REPLICATE_OPTION_DATASH, -                                    &opt_datash); -        if (ret) { -                goto out; -        } - -        ret = dict_get_str (dict, VOLGEN_REPLICATE_OPTION_DATASHALGO, -                            &opt_datashalgo); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "data-self-heal-window-size")) { -		ret = dict_get_str (dict,"data-self-heal-window-size",  -				    &opt_shwindowsize); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring data-self-heal" -					 "window-size: %s", &opt_shwindowsize); -		uncomment_option (replicate_str, -				  (char *) "#   option data-self-heal-window-size %s\n"); -	} -	else -	        ret = dict_get_str (dict, VOLGEN_REPLICATE_OPTION_SHWINDOWSIZE, -                            &opt_shwindowsize); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "metadata-self-heal")) { -		ret = dict_get_str (dict,"metadata-self-heal",  -				    &opt_metash); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring metadata-self-heal" -					 "count: %s", &opt_metash); -		uncomment_option (replicate_str, -				  (char *) "#   option metadata-self-heal %s\n"); -	} -	else -        	ret = dict_get_str (dict, VOLGEN_REPLICATE_OPTION_METASH, -                            &opt_metash); -        if (ret) { -                goto out; -        } -	 -	if (dict_get (dict, "entry-self-heal")) { -		ret = dict_get_str (dict,"entry-self-heal",  -				    &opt_entrysh); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring entry-self-heal" -					 "count: %s", &opt_entrysh); -		uncomment_option (replicate_str, -				  (char *) "#   option entry-self-heal %s\n"); -	} -	else -	        ret = dict_get_str (dict, VOLGEN_REPLICATE_OPTION_ENTRYSH, -                            &opt_entrysh); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "data-change-log")) { -		ret = dict_get_str (dict,"data-change-log",  -				    &opt_datachangelog); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring data-change-log" -					 "count: %s", &opt_datachangelog); -		uncomment_option (replicate_str, -				  (char *) "#   option data-change-log %s\n"); -	} -	else -        	ret = dict_get_str (dict, VOLGEN_REPLICATE_OPTION_DATACHANGELOG, -                            &opt_datachangelog); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "metadata-change-log")) { -		ret = dict_get_str (dict,"metadata-change-log",  -				    &opt_metadatachangelog); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring metadata-change-log" -					 "count: %s", &opt_metadatachangelog); -		uncomment_option (replicate_str, -				  (char *) "#   option metadata-change-log %s\n"); -	} -	else -	        ret = dict_get_str (dict, VOLGEN_REPLICATE_OPTION_METADATACHANGELOG, -                            &opt_metadatachangelog); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "entry-change-log")) { -		ret = dict_get_str (dict, "entry-change-log", &opt_entrychangelog); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring entry-change-log: %s",  -		       &opt_entrychangelog); -		uncomment_option (replicate_str, -				  (char *) "#   option entry-change-log %s\n"); -	} -	else - -        ret = dict_get_str (dict, VOLGEN_REPLICATE_OPTION_ENTRYCHANGELOG, -                            &opt_entrychangelog); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "strict-readdir")) { -		ret = dict_get_str (dict,"strict-readdir",  -				    &opt_strictreaddir); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring sstrict-readdir" -					 "count: %s", &opt_strictreaddir); -		uncomment_option (replicate_str, -				  (char *) "#   option strict-readdir %s\n"); -	} -	else -        	ret = dict_get_str (dict, VOLGEN_REPLICATE_OPTION_STRICTREADDIR, -                            &opt_strictreaddir); -        if (ret) { -                goto out; -        } - -        for (i = 0; i < replicate_count; i++) { -                snprintf (tmp, 4096, "%s-%d ", subvolume, -                          subvolume_count); -                len = strlen (tmp); -                subvol_len += len; -                subvolume_count++; -        } +        xlator_t *trav; +        int ret = 0; -        subvolume_count = subvol_count; -        subvol_len++; +        if (vme2->option[0] == '!') +                return 0; -        subvol_str = GF_CALLOC (1, subvol_len, gf_gld_mt_char); -        if (!subvol_str) { -                gf_log ("glusterd", GF_LOG_ERROR, -                        "Out of memory"); -                ret = -1; -                goto out; -        } +        for (trav = first_of (graph); trav; trav = trav->next) { +                if (strcmp (trav->type, vme2->voltype) != 0) +                        continue; -        for (i = 0; i < replicate_count ; i++) { -                snprintf (tmp, 4096, "%s-%d ", subvolume, -                          subvolume_count); -                strncat (subvol_str, tmp, strlen (tmp)); -                subvolume_count++; +                ret = xlator_set_option (trav, vme2->option, vme2->value); +                if (ret) +                        return -1;          } -        fprintf (file, replicate_str, -                 volname, -                 "replicate", -                 count, -                 opt_readsubvol, -                 opt_favchild, -                 opt_bckshcount, -                 opt_datash, -                 opt_datashalgo, -                 opt_shwindowsize, -                 opt_metash, -                 opt_entrysh, -                 opt_datachangelog, -                 opt_metadatachangelog, -                 opt_entrychangelog, -                 opt_strictreaddir, -                 subvol_str); - - -        ret = 0; - -        snprintf (last_xlator, 1024, "%s-%s-%d", -                  volname, "replicate", count); - -out: -        if (subvol_str) -                GF_FREE (subvol_str); -        return ret; +        return 0;  }  static int -__write_stripe_xlator (FILE *file, dict_t *dict, -                       char *subvolume, -                       int stripe_count, -                       int subvol_count, -                       int count, -                       char *last_xlator) +volgen_graph_set_options (glusterfs_graph_t *graph, dict_t *dict)  { -        char *volname = NULL; -        char       *opt_blocksize    = NULL; -        char       *opt_usexattr     = NULL; -        char       *subvol_str       = NULL; -        char        tmp[4096]        = {0,}; -        int         subvolume_count  = 0; -        int         ret              = -1; -        int         i                = 0; -        int         subvol_len        = 0; -        int         len              = 0; - -        char stripe_str[] = "volume %s-%s-%d\n" -                "    type cluster/stripe\n" -                "#   option block-size %s\n" -                "#   option use-xattr %s\n" -                "    subvolumes %s\n" -                "end-volume\n\n"; - -        subvolume_count = subvol_count; - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "block-size")) { -		ret = dict_get_str (dict, "block-size", &opt_blocksize); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring Stripe Count %s",  -		       opt_blocksize); -		uncomment_option (stripe_str, -				  (char *) "#   option block-size %s\n"); -	} -	else -        	ret = dict_get_str (dict, VOLGEN_STRIPE_OPTION_BLOCKSIZE, -                            &opt_blocksize); -        if (ret) { -                goto out; -        } - -        ret = dict_get_str (dict, VOLGEN_STRIPE_OPTION_USEXATTR, -                            &opt_usexattr); -        if (ret) { -                goto out; -        } - - -        for (i = 0; i < stripe_count; i++) { -                snprintf (tmp, 4096, "%s-%d ", subvolume, subvolume_count); -                len = strlen (tmp); -                subvol_len += len; -                subvolume_count++; -        } - -        subvolume_count = subvol_count; -        subvol_len++; - -        subvol_str = GF_CALLOC (1, subvol_len, gf_gld_mt_char); -        if (!subvol_str) { -                gf_log ("glusterd", GF_LOG_ERROR, -                        "Out of memory"); -                ret = -1; -                goto out; -        } - -        for (i = 0; i < stripe_count; i++) { -                snprintf (tmp, 4096, "%s-%d ", subvolume, subvolume_count); -                strncat (subvol_str, tmp, strlen (tmp)); -                subvolume_count++; -        } - -        fprintf (file, stripe_str, -                 volname, -                 "stripe", -                 count, -                 opt_blocksize, -                 opt_usexattr, -                 subvol_str); - - -        ret = 0; - -        snprintf (last_xlator, 1024, "%s-%s-%d", -                  volname, "stripe", count); - -out: -        if (subvol_str) -                GF_FREE (subvol_str); -        return ret; -         +        return volgen_graph_set_options_generic (graph, dict, NULL, +                                                 &basic_option_handler);  }  static int -__write_distribute_xlator (FILE *file, dict_t *dict, -                           char *subvolume, -                           int dist_count, -                           char *last_xlator) +volgen_graph_merge_sub (glusterfs_graph_t *dgraph, glusterfs_graph_t *sgraph)  { -        char       *volname          = NULL; -        char       *subvol_str       = NULL; -        char       tmp[4096]         = {0,}; -        char       *opt_lookupunhash = NULL; -        char       *opt_minfreedisk  = NULL; -        char       *opt_unhashsticky = NULL; -        int        ret               = -1; -        int        i                 = 0; -        int        subvol_len        = 0; -        int        len               = 0; -         -        char       dht_str[] = "volume %s-%s\n" -                "type cluster/distribute\n" -                "#   option lookup-unhashed %s\n" -                "#   option min-free-disk %s\n" -                "#   option unhashed-sticky-bit %s\n" -                "    subvolumes %s\n" -                "end-volume\n\n"; - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "lookup-unhashed")) { -		ret = dict_get_str (dict, "lookup-unhashed", &opt_lookupunhash); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring lookup-unhashed %s", -		       opt_lookupunhash); -		uncomment_option (dht_str,  -				  (char *) "#   option lookup-unhashed %s\n"); -	} -	else -        	ret = dict_get_str (dict, VOLGEN_DHT_OPTION_LOOKUPUNHASH, -                            &opt_lookupunhash); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "min-free-disk")) { -		ret = dict_get_str (dict, "min-free-disk", &opt_minfreedisk); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring min-free-disk", -		       opt_minfreedisk); -		uncomment_option (dht_str,  -				  (char *) "#   option min-free-disk %s\n"); -	} -	else -        ret = dict_get_str (dict, VOLGEN_DHT_OPTION_MINFREEDISK, -                            &opt_minfreedisk); -        if (ret) { -                goto out; -        } - -        ret = dict_get_str (dict, VOLGEN_DHT_OPTION_UNHASHSTICKY, -                            &opt_unhashsticky); -        if (ret) { -                goto out; -        } - -        for (i = 0; i < dist_count; i++) { -                snprintf (tmp, 4096, "%s-%d ", subvolume, i); -                len = strlen (tmp); -                subvol_len += len; -        } - -        subvol_len++; -        subvol_str = GF_CALLOC (1, subvol_len, gf_gld_mt_char); -        if (!subvol_str) { -                gf_log ("glusterd", GF_LOG_ERROR, -                        "Out of memory"); -                ret = -1; -                goto out; -        } - -        for (i = 0; i < dist_count ; i++) { -                snprintf (tmp, 4096, "%s-%d ", subvolume, i); -                strncat (subvol_str, tmp, strlen (tmp)); -        } +        xlator_t *trav = NULL; -        fprintf (file, dht_str, -                 volname, -                 "dht", -                 opt_lookupunhash, -                 opt_minfreedisk, -                 opt_unhashsticky, -                 subvol_str); +        GF_ASSERT (dgraph->first); +        if (volgen_xlator_link (first_of (dgraph), first_of (sgraph)) == -1) +                return -1; -        ret = 0; +        for (trav = first_of (dgraph); trav->next; trav = trav->next); -        snprintf (last_xlator, 1024, "%s-%s", -                  volname, "dht"); +        trav->next = sgraph->first; +        trav->next->prev = trav; +        dgraph->xl_count += sgraph->xl_count; -out: -        if (subvol_str) -                GF_FREE (subvol_str); -        return ret; +        return 0;  } - -int -uncomment_option( char *opt_str,char *comment_str) -{ -	char *ptr; - -	ptr = strstr (opt_str,comment_str); -	if (!ptr) -		return -1; -	 -	if (*ptr != '#') -		return -1; - -	*ptr = ' '; - -	return 0; -}  -  static int -__write_wb_xlator (FILE *file, dict_t *dict, -                   char *subvolume) +volgen_write_volfile (glusterfs_graph_t *graph, char *filename)  { -        char        *volname              = NULL; -        char        *opt_flushbehind     = NULL; -        char        *opt_cachesize       = NULL; -        char        *opt_disablenbytes   = NULL; -        char        *opt_osync           = NULL; -        char        *opt_tricklingwrites = NULL; -        int          ret                 = -1; - -        char dht_str[] = "volume %s-%s\n" -                "    type performance/write-behind\n" -                "#   option flush-behind %s\n" -                "#   option cache-size %s\n" -                "#   option disable-for-first-nbytes %s\n" -                "#   option enable-O_SYNC %s\n" -                "#   option enable-trickling-writes %s\n" -                "    subvolumes %s\n" -                "end-volume\n\n"; - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } - -        ret = dict_get_str (dict, VOLGEN_WB_OPTION_FLUSHBEHIND, -                            &opt_flushbehind); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "cache-size")) { -		gf_log("",GF_LOG_DEBUG, "Uncommenting option cache-size"); -		uncomment_option (dht_str,(char *) "#   option cache-size %s\n"); -		ret = dict_get_str (dict, "cache-size", &opt_cachesize); -	} -	else -        	ret = dict_get_str (dict, VOLGEN_WB_OPTION_CACHESIZE, -                            &opt_cachesize); -        if (ret) { -                goto out; -        } - -        ret = dict_get_str (dict, VOLGEN_WB_OPTION_DISABLENBYTES, -                            &opt_disablenbytes); -        if (ret) { -                goto out; -        } +        char *ftmp = NULL; +        FILE *f = NULL; -        ret = dict_get_str (dict, VOLGEN_WB_OPTION_OSYNC, -                            &opt_osync); -        if (ret) { -                goto out; -        } +        if (gf_asprintf (&ftmp, "%s.tmp", filename) == -1) { +                ftmp = NULL; -        ret = dict_get_str (dict, VOLGEN_WB_OPTION_TRICKLINGWRITES, -                            &opt_tricklingwrites); -        if (ret) { -                goto out; +                goto error;          } -        fprintf (file, dht_str, -                 volname, -                 "write-behind", -                 opt_flushbehind, -                 opt_cachesize, -                 opt_disablenbytes, -                 opt_osync, -                 opt_tricklingwrites, -                 subvolume); +        f = fopen (ftmp, "w"); +        if (!f) +                goto error; +        if (glusterfs_graph_print_file (f, graph) == -1) +                goto error; -        ret = 0; - -out: -        return ret; -} +        if (fclose (f) == -1) +                goto error; -static int -__write_ra_xlator (FILE *file, dict_t *dict, -                   char *subvolume) -{ -        char       *volname       = NULL; -        char       *opt_atime     = NULL; -        char       *opt_pagecount = NULL; -        int         ret           = -1; - -        const char *ra_str = "volume %s-%s\n" -                "    type performance/read-ahead\n" -                "#   option force-atime-update %s\n" -                "#   option page-count %s\n" -                "    subvolumes %s\n" -                "end-volume\n\n"; - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } +        if (rename (ftmp, filename) == -1) +                goto error; -        ret = dict_get_str (dict, VOLGEN_RA_OPTION_ATIME, -                            &opt_atime); -        if (ret) { -                goto out; -        } +        GF_FREE (ftmp); -        ret = dict_get_str (dict, VOLGEN_RA_OPTION_PAGECOUNT, -                            &opt_pagecount); -        if (ret) { -                goto out; -        } +        return 0; -        fprintf (file, ra_str, -                 volname, -                 "read-ahead", -                 opt_atime, -                 opt_pagecount, -                 subvolume); + error: +        if (ftmp) +                GF_FREE (ftmp); +        if (f) +                fclose (f); -        ret = 0; +        gf_log ("", GF_LOG_ERROR, "failed to create volfile %s", filename); -out: -        return ret; +        return -1;  } -static int -__write_iocache_xlator (FILE *file, dict_t *dict, -                        char *subvolume) +static void +volgen_graph_free (glusterfs_graph_t *graph)  { -        char       *volname         = NULL; -        char       *opt_priority    = NULL; -        char       *opt_timeout     = NULL; -        char       *opt_cachesize   = NULL; -        char       *opt_minfilesize = NULL; -        char       *opt_maxfilesize = NULL; -        int         ret             = -1; - -        char        iocache_str[] = "volume %s-%s\n" -                "    type performance/io-cache\n" -                "#   option priority %s\n" -                "#   option cache-timeout %s\n" -                "#   option cache-size %s\n" -                "#   option min-file-size %s\n" -                "#   option max-file-size %s\n" -                "    subvolumes %s\n" -                "end-volume\n\n"; - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "priority")) { -		ret = dict_get_str (dict, "priority", &opt_priority); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring priority", -		       opt_priority); -		uncomment_option (iocache_str,  -				  (char *) "#   option priority %s\n"); -	} -	else -        	ret = dict_get_str (dict, VOLGEN_IOCACHE_OPTION_PRIORITY, -                            &opt_priority); -        if (ret) { -                goto out; -        } +        xlator_t *trav = NULL; +        xlator_t *trav_old = NULL; -	if (dict_get (dict, "cache-timeout")) { -		ret = dict_get_str (dict, "cache-timeout", &opt_timeout); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring cache-timeout", -		       opt_timeout); -		uncomment_option (iocache_str,  -				  (char *) "#   option cache-timeout %s\n"); -	} -	else -        	ret = dict_get_str (dict, VOLGEN_IOCACHE_OPTION_TIMEOUT, -                            &opt_timeout); -        if (ret) { -                goto out; -        } - -	if (dict_get (dict, "cache-size")) { -		ret = dict_get_str (dict, "cache-size", &opt_cachesize); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring cache-size :%s", -		       opt_cachesize); -		uncomment_option (iocache_str,  -				  (char *) "#   option cache-size %s\n"); -	} -	else -	        ret = dict_get_str (dict, VOLGEN_IOCACHE_OPTION_CACHESIZE, -                            &opt_cachesize); -        if (ret) { -                goto out; -        } +        for (trav = first_of (graph) ;; trav = trav->next) { +                if (trav_old) +                        xlator_destroy (trav_old); -	if (dict_get (dict, "min-file-size")) { -		ret = dict_get_str (dict, "min-file-size", &opt_minfilesize); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring min-file-size: %s", -		       opt_minfilesize); -		uncomment_option (iocache_str,  -				  (char *) "#   option min-file-size %s\n"); -	} -	else -        	ret = dict_get_str (dict, VOLGEN_IOCACHE_OPTION_MINFILESIZE, -                            &opt_minfilesize); -        if (ret) { -                goto out; -        } +                trav_old = trav; -	if (dict_get (dict, "max-file-size")) { -		ret = dict_get_str (dict, "max-file-size", &opt_maxfilesize); -		gf_log("", GF_LOG_DEBUG, "Reconfiguring max-file-size: %s", -		       opt_maxfilesize); -		uncomment_option (iocache_str,  -				  (char *) "#   option max-file-size %s\n"); -	} -	else -        	ret = dict_get_str (dict, VOLGEN_IOCACHE_OPTION_MAXFILESIZE, -                            &opt_maxfilesize); -        if (ret) { -                goto out; +                if (!trav) +                        break;          } - -        fprintf (file, iocache_str, -                 volname, -                 "io-cache", -                 opt_priority, -                 opt_timeout, -                 opt_cachesize, -                 opt_minfilesize, -                 opt_maxfilesize, -                 subvolume); - - -        ret = 0; - -out: -        return ret;  }  static int -__write_qr_xlator (FILE *file, dict_t *dict, -                        char *subvolume) +build_graph_generic (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo, +                     dict_t *mod_dict, void *param, +                     int (*builder) (glusterfs_graph_t *graph, +                                     glusterd_volinfo_t *volinfo, +                                     dict_t *set_dict, void *param))  { -        char       *volname         = NULL; -        char       *opt_priority    = NULL; -        char       *opt_timeout     = NULL; -        char       *opt_cachesize   = NULL; -        char       *opt_maxfilesize = NULL; -        int         ret             = -1; - -        const char *qr_str = "volume %s-%s\n" -                "    type performance/quick-read\n" -                "#   option priority %s\n" -                "#   option cache-timeout %s\n" -                "#   option cache-size %s\n" -                "#   option max-file-size %s\n" -                "    subvolumes %s\n" -                "end-volume\n\n"; - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } - -        ret = dict_get_str (dict, VOLGEN_QR_OPTION_PRIORITY, -                            &opt_priority); -        if (ret) { -                goto out; -        } - -        ret = dict_get_str (dict, VOLGEN_QR_OPTION_TIMEOUT, -                            &opt_timeout); -        if (ret) { -                goto out; -        } - -        ret = dict_get_str (dict, VOLGEN_QR_OPTION_CACHESIZE, -                            &opt_cachesize); -        if (ret) { -                goto out; -        } +        dict_t *set_dict = NULL; +        int ret = 0; -        ret = dict_get_str (dict, VOLGEN_QR_OPTION_MAXFILESIZE, -                            &opt_maxfilesize); -        if (ret) { -                goto out; -        } +        if (mod_dict) { +                set_dict = dict_copy (volinfo->dict, NULL); +                if (!set_dict) +                        return -1; +                set_dict = dict_copy (mod_dict, set_dict); +        } else +                set_dict = volinfo->dict; -        fprintf (file, qr_str, -                 volname, -                 "quick-read", -                 opt_priority, -                 opt_timeout, -                 opt_cachesize, -                 opt_maxfilesize, -                 subvolume); +        ret = builder (graph, volinfo, set_dict, param); +        if (!ret) +                ret = volgen_graph_set_options (graph, set_dict); -        ret = 0; +        if (mod_dict) +                dict_destroy (set_dict); -out:          return ret;  } -static int -__write_statprefetch_xlator (FILE *file, dict_t *dict, -                             char *subvolume) +static void +get_vol_transport_type (glusterd_volinfo_t *volinfo, char *tt)  { -        char *volname = NULL; -        int   ret     = -1; - -        const char *statprefetch_str = "volume %s-%s\n" -                "    type performance/stat-prefetch\n" -                "    subvolumes %s\n" -                "end-volume\n\n"; - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } - -        fprintf (file, statprefetch_str, -                 volname, -                 "stat-prefetch", -                 subvolume); - -        ret = 0; - -out: -        return ret; +        volinfo->transport_type == GF_TRANSPORT_RDMA ? +        strcpy (tt, "rdma"): +        strcpy (tt, "tcp");  }  static int -__write_iostats_xlator (FILE *file, dict_t *dict, -                        char *subvolume) +server_graph_builder (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo, +                      dict_t *set_dict, void *param)  { -        char *volname = NULL; -        char *dumpfd  = NULL; -        char *latency = NULL; -        int ret       = -1; - -        const char *iostats_str = "volume %s\n" -                "    type debug/io-stats\n" -                "    option dump-fd-stats %s\n" -                "    option latency-measurement %s\n" -                "    subvolumes %s\n" -                "end-volume\n\n"; - -        ret = dict_get_str (dict, "iostat-volname", &volname); -        if (ret) { -                goto out; -        } +        char     *volname = NULL; +        char     *path = NULL; +        int       pump = 0; +        xlator_t *xl = NULL; +        char     *aaa = NULL; +        int       ret = 0; +        char      transt[16] = {0,}; + +        path = param; +        volname = volinfo->volname; +        get_vol_transport_type (volinfo, transt); -        ret = dict_get_str (dict, VOLGEN_IOS_OPTION_DUMP_FD_STATS, &dumpfd); +        ret = volgen_graph_add (graph, "storage/posix", volname);          if (ret) -                goto out; +                return -1; -        ret = dict_get_str (dict, VOLGEN_IOS_OPTION_MEASURE_LATENCY, &latency); +        ret = xlator_set_option (first_of (graph), "directory", path);          if (ret) -                goto out; - -        fprintf (file, iostats_str, volname, dumpfd, latency, subvolume); - -        ret = 0; - -out: -        return ret; -} - -static int -generate_server_volfile (glusterd_brickinfo_t *brickinfo, -                         dict_t *dict, -                         const char *filename) -{ -        FILE *file          = NULL; -        char  subvol[2048]  = {0,}; -        char *volname       = NULL; -        int   ret           = -1; -        int   activate_pump = 0; - -        GF_ASSERT (filename); - -        file = fopen (filename, "w+"); -        if (!file) { -                gf_log ("", GF_LOG_DEBUG, -                        "Could not open file %s", filename); -                ret = -1; -                goto out; -        } - -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) { -                goto out; -        } - -        /* Call functions in the same order -           as you'd call if you were manually -           writing a volfile top-down -        */ - -        ret = __write_posix_xlator (file, dict, brickinfo->path); -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, -                        "Could not write xlator"); -                goto out; -        } - -        VOLGEN_GENERATE_VOLNAME (subvol, volname, "posix"); - -        ret = __write_access_control_xlator (file, dict, subvol); -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, -                        "Could not write xlator"); -                goto out; -        } - -        VOLGEN_GENERATE_VOLNAME (subvol, volname, "access-control"); - -        ret = __write_locks_xlator (file, dict, subvol); -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, -                        "Could not write xlator"); -                goto out; -        } - -        ret = dict_get_int32 (dict, "enable-pump", &activate_pump); -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, -                        "Pump is disabled"); -        } - -        if (activate_pump) { -                gf_log ("", GF_LOG_DEBUG, -                        "Pump is enabled"); - -                VOLGEN_GENERATE_VOLNAME (subvol, volname, "locks"); - -                ret = __write_replace_brick_xlator (file, dict); -                if (ret) { -                        gf_log ("", GF_LOG_DEBUG, -                                "Could not write xlator"); -                        goto out; -                } - -                ret = __write_pump_xlator (file, dict, subvol); -                if (ret) { -                        gf_log ("", GF_LOG_DEBUG, -                                "Could not write xlator"); -                        goto out; -                } - -                VOLGEN_GENERATE_VOLNAME (subvol, volname, "pump"); -        } else -                VOLGEN_GENERATE_VOLNAME (subvol, volname, "locks"); - -        ret = __write_iothreads_xlator (file, dict, subvol); -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, -                        "Could not write xlator"); -                goto out; -        } - -        ret = dict_set_str (dict, "iostat-volname", brickinfo->path); -        if (ret) { -                goto out; -        } - -        VOLGEN_GENERATE_VOLNAME (subvol, volname, "iot"); - -        ret = __write_iostats_xlator (file, dict, subvol); -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, -                        "Could not write io-stats xlator"); -                goto out; -        } - -        ret = __write_server_xlator (file, dict, brickinfo->path); -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, -                        "Could not write xlator"); -                goto out; -        } - -        fclose (file); -        file = NULL; - -out: -        return ret; -} - -static int -__write_perf_xlator (char *xlator_name, FILE *file, -                     dict_t *dict, char *subvol) -{ -        int ret = 0; - -        if (strcmp (xlator_name, "write-behind") == 0) { - -                ret = __write_wb_xlator (file, dict, subvol); - -        } else if (strcmp (xlator_name, "read-ahead") == 0) { - -                ret = __write_ra_xlator (file, dict, subvol); - -        } else if (strcmp (xlator_name, "io-cache") == 0) { +                return -1; -                ret = __write_iocache_xlator (file, dict, subvol); +        ret = volgen_graph_add (graph, "features/access-control", volname); +        if (ret) +                return -1; -        } else if (strcmp (xlator_name, "quick-read") == 0) { +        ret = volgen_graph_add (graph, "features/locks", volname); +        if (ret) +                return -1; -                ret = __write_qr_xlator (file, dict, subvol); +        ret = dict_get_int32 (volinfo->dict, "enable-pump", &pump); +        if (ret == -ENOENT) +                pump = 0; +        if (pump) { +                xl = first_of (graph); -        } else if (strcmp (xlator_name, "stat-prefetch") == 0) { +                ret = volgen_graph_add_as (graph, "protocol/client", "%s-%s", +                                           volname, "replace-brick"); +                if (ret) +                        return -1; +                ret = xlator_set_option (first_of (graph), "transport-type", +                                         transt); +                if (ret) +                        return -1; +                ret = xlator_set_option (first_of (graph), "remote-port", +                                         "34034"); +                if (ret) +                        return -1; -                ret = __write_statprefetch_xlator (file, dict, subvol); +                ret = volgen_graph_add (graph, "cluster/pump", volname); +                if (ret) +                        return -1; +                ret = volgen_xlator_link (first_of (graph), xl); +                if (ret) +                        return -1;          } -        return ret; - -} - -static -int -add_perf_xlator_list_item (dict_t *dict, char **perf_xlator_list, -                           char *xlator_name, int *idx) -{ -        int ret = 0; +        ret = volgen_graph_add (graph, "performance/io-threads", volname); +        if (ret) +                return -1; +        ret = xlator_set_option (first_of (graph), "thread-count", "16"); +        if (ret) +                return -1; -        ret = dict_get_str_boolean (dict, xlator_name, 1); -        switch (ret) { -        case -1: -                goto out; -        case 1: -                gf_log ("", GF_LOG_DEBUG, -                        "%s is enabled", xlator_name); -                perf_xlator_list[*idx] = gf_strdup (xlator_name); -                if (!perf_xlator_list[*idx]) { -                        gf_log ("", GF_LOG_ERROR, "Out of memory"); +        ret = volgen_graph_add_as (graph, "debug/io-stats", path); +        if (ret) +                return -1; -                        return -1; -                } +        ret = volgen_graph_add (graph, "protocol/server", volname); +        if (ret) +                return -1; +        xl = first_of (graph); +        ret = xlator_set_option (xl, "transport-type", transt); +        if (ret) +                return -1; -                (*idx)++; +        ret = gf_asprintf (&aaa, "auth.addr.%s.allow", path); +        if (ret == -1) { +                gf_log ("", GF_LOG_ERROR, "Out of memory"); -                break; -        case 0: -                gf_log ("", GF_LOG_DEBUG, "%s option is disabled", xlator_name); -                break; -        default: -                GF_ASSERT (!"Biohazard!"); +                return -1;          } +        ret = xlator_set_option (xl, aaa, "*"); +        GF_FREE (aaa); -        ret = 0; - -out:          return ret;  } -static int -generate_perf_xlator_list (dict_t *dict, char *perf_xlator_list[]) -{ -        int i   = 0; -        int ret = 0; - -        GF_ASSERT (dict); - -        ret = add_perf_xlator_list_item (dict, perf_xlator_list, -                                         "write-behind", &i); -        if (ret == -1) -                goto out; - -        ret = add_perf_xlator_list_item (dict, perf_xlator_list, -                                         "read-ahead", &i); -        if (ret == -1) -                goto out; - -        ret = add_perf_xlator_list_item (dict, perf_xlator_list, -                                         "io-cache", &i); -        if (ret == -1) -                goto out; - -        ret = add_perf_xlator_list_item (dict, perf_xlator_list, -                                         "quick-read", &i); -        if (ret == -1) -                goto out; - -        ret = add_perf_xlator_list_item (dict, perf_xlator_list, -                                         "stat-prefetch", &i); -        if (ret == -1) -                goto out; - -out: -        return ret; -} +/* builds a graph for server role , with option overrides in mod_dict */  static int -destroy_perf_xlator_list (char *perf_xlator_list[]) +build_server_graph (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo, +                    dict_t *mod_dict, char *path)  { -        int i = 0; - -        while (perf_xlator_list[i]) { -                GF_FREE (perf_xlator_list[i]); -                i++; -        } - -        return 0; +        return build_graph_generic (graph, volinfo, mod_dict, path, +                                    &server_graph_builder);  }  static int -write_perf_xlators (glusterd_volinfo_t *volinfo, FILE *file, -                    int32_t dist_count, int32_t replicate_count, -                    int32_t stripe_count, char *last_xlator) +perfxl_option_handler (glusterfs_graph_t *graph, struct volopt_map_entry2 *vme2, +                       void *param)  { -        char *perf_xlator_list[256]     = {0,}; -        char  subvol[2048]              = {0,}; -        int   i                         = 0; -        int   last_idx                  = 0; -        int  ret                        = 0; -        char  *volname                  = NULL; -        dict_t *dict                    = NULL; - -        dict    = volinfo->dict; -        volname = volinfo->volname; - -        ret = generate_perf_xlator_list ( -                dict, perf_xlator_list); -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, -                        "Could not generate perf xlator list"); -                goto out; -        } - -        while (perf_xlator_list[i]) { -                i++; -        } - -        if (i == 0) { -                gf_log ("", GF_LOG_DEBUG, -                        "No perf xlators enabled"); -                ret = 0; -                goto out; -        } - -        i = 0; - -        if (dist_count > 1) { -                VOLGEN_GENERATE_VOLNAME (subvol, volname, "dht"); -                ret = __write_perf_xlator (perf_xlator_list[i], file, -                                           dict, subvol); -                i++; -        } -        else if (replicate_count > 1) { -                VOLGEN_GENERATE_VOLNAME (subvol, volname, "replicate-0"); -                ret = __write_perf_xlator (perf_xlator_list[i], file, -                                           dict, subvol); -                i++; - -        } -        else if (stripe_count > 1) { -                VOLGEN_GENERATE_VOLNAME (subvol, volname, "stripe-0"); -                ret = __write_perf_xlator (perf_xlator_list[i], file, -                                           dict, subvol); -                i++; - -        } -        else { -                VOLGEN_GENERATE_VOLNAME (subvol, volname, "client-0"); -                ret = __write_perf_xlator (perf_xlator_list[i], file, -                                           dict, subvol); -                i++; - -        } -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, -                        "Could not write xlator"); -                goto out; -        } - -        while (perf_xlator_list[i]) { -                VOLGEN_GENERATE_VOLNAME (subvol, volname, perf_xlator_list[i-1]); -                ret = __write_perf_xlator (perf_xlator_list[i], file, -                                           dict, subvol); -                i++; - -                if (ret) { -                        gf_log ("", GF_LOG_DEBUG, -                                "Could not write xlator"); -                        goto out; -                } -        } - -        if (i >= 1) { -                last_idx = i - 1; +        char *volname = NULL; +        gf_boolean_t enabled = _gf_false; +        int ret = 0; -                if (perf_xlator_list[last_idx] && last_idx >= 0) { -                        VOLGEN_GENERATE_VOLNAME (last_xlator, volname, -                                                 perf_xlator_list[last_idx]); -                        gf_log ("", GF_LOG_DEBUG, -                                "last xlator copied to %s", last_xlator); -                } -        } +        volname = param; +        if (strcmp (vme2->option, "!perf") != 0) +                return 0; -out: -        destroy_perf_xlator_list (perf_xlator_list); -        return ret; +        ret = gf_string2boolean (vme2->value, &enabled); +        if (ret) +                return -1; +        if (!enabled) +                return 0; +        return volgen_graph_add (graph, vme2->voltype, volname);  }  static int -generate_client_volfile (glusterd_volinfo_t *volinfo, char *filename) +client_graph_builder (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo, +                      dict_t *set_dict, void *param)  { -        FILE    *file               = NULL; -        dict_t  *dict               = NULL; -        char    *volname            = NULL; -        glusterd_brickinfo_t *brick = NULL; -        char     last_xlator[1024]  = {0,}; -        char     subvol[2048]       = {0,}; -        int32_t  replicate_count    = 0; -        int32_t  stripe_count       = 0; -        int32_t  dist_count         = 0; -        int32_t  num_bricks         = 0; -        int      subvol_count       = 0; -        int      count              = 0; -        int      i                  = 0; -        int      ret                = -1; - -        GF_ASSERT (filename); +        int                      replicate_count    = 0; +        int                      stripe_count       = 0; +        int                      dist_count         = 0; +        int                      num_bricks         = 0; +        char                     transt[16]         = {0,}; +        int                      cluster_count      = 0; +        char                    *volname            = NULL; +        dict_t                  *dict               = NULL; +        glusterd_brickinfo_t    *brick = NULL; +        char                    *replicate_args[]   = {"cluster/replicate", +                                                       "%s-replicate-%d"}; +        char                    *stripe_args[]      = {"cluster/stripe", +                                                       "%s-stripe-%d"}; +        char                   **cluster_args       = NULL; +        int                      i                  = 0; +        int                      j                  = 0; +        int                      ret                = 0; +        xlator_t                *xl                 = NULL; +        xlator_t                *txl                = NULL; +        xlator_t                *trav               = NULL;          volname = volinfo->volname;          dict    = volinfo->dict; +        GF_ASSERT (dict); +        get_vol_transport_type (volinfo, transt);          list_for_each_entry (brick, &volinfo->bricks, brick_list)                  num_bricks++; @@ -2044,156 +688,184 @@ generate_client_volfile (glusterd_volinfo_t *volinfo, char *filename)                  dist_count = num_bricks;          } - -        file = fopen (filename, "w+"); -        if (!file) { +        if (stripe_count && replicate_count) {                  gf_log ("", GF_LOG_DEBUG, -                        "Could not open file %s", filename); -                ret = -1; -                goto out; +                        "Striped Replicate config not allowed"); +                return -1; +        } +        if (replicate_count > 1) { +                cluster_count = replicate_count; +                cluster_args = replicate_args; +        } +        if (stripe_count > 1) { +                cluster_count = stripe_count; +                cluster_args = stripe_args;          } -        /* Call functions in the same order -           as you'd call if you were manually -           writing a volfile top-down -        */ - -        count = 0; - +        i = 0;          list_for_each_entry (brick, &volinfo->bricks, brick_list) { +                xl = xlator_instantiate ("protocol/client", "%s-client-%d", volname, i); +                if (!xl) +                        return -1; +                glusterfs_graph_set_first (graph, xl); -                ret = __write_client_xlator (file, dict, brick->path, -                                             brick->hostname, count, -                                             last_xlator); -                if (ret) { -                        gf_log ("", GF_LOG_DEBUG, -                                "Could not write xlator"); -                        goto out; -                } - -                count++; -        } +                ret = xlator_set_option (xl, "remote-host", brick->hostname); +                if (ret) +                        return -1; +                ret = xlator_set_option (xl, "remote-subvolume", brick->path); +                if (ret) +                        return -1; +                ret = xlator_set_option (xl, "transport-type", transt); +                if (ret) +                        return -1; -        if (stripe_count && replicate_count) { -                gf_log ("", GF_LOG_DEBUG, -                        "Striped Replicate config not allowed"); -                ret = -1; -                goto out; +                i++;          } -        if (replicate_count > 1) { -                subvol_count = 0; -                for (i = 0; i < dist_count; i++) { - -                        VOLGEN_GENERATE_VOLNAME (subvol, volname, "client"); - -                        ret = __write_replicate_xlator (file, dict, subvol, -                                                        replicate_count, -                                                        subvol_count, -                                                        i, -                                                        last_xlator); -                        if (ret) { -                                gf_log ("", GF_LOG_DEBUG, -                                        "Count not write xlator"); -                                goto out; +        if (cluster_count > 1) { +                j = 0; +                i = 0; +                txl = first_of (graph); +                for (trav = txl; trav->next; trav = trav->next); +                for (;; trav = trav->prev) { +                        if (i % cluster_count == 0) { +                                xl = xlator_instantiate (cluster_args[0], +                                                         cluster_args[1], +                                                         volname, j); +                                if (!xl) +                                        return -1; +                                glusterfs_graph_set_first (graph, xl); +                                j++;                          } -                        subvol_count += replicate_count; +                        ret = volgen_xlator_link (xl, trav); +                        if (ret) +                                return -1; +                        if (trav == txl) +                                break; +                        i++;                  }          } -        if (stripe_count > 1) { -                subvol_count = 0; -                for (i = 0; i < dist_count; i++) { - -                        VOLGEN_GENERATE_VOLNAME (subvol, volname, "client"); - -                        ret = __write_stripe_xlator (file, dict, subvol, -                                                     stripe_count, -                                                     subvol_count, -                                                     i, -                                                     last_xlator); -                        if (ret) { -                                gf_log ("", GF_LOG_DEBUG, -                                        "Count not write xlator"); -                                goto out; -                        } - -                        subvol_count += stripe_count; +        if (dist_count > 1) { +                xl = xlator_instantiate ("cluster/distribute", "%s-dht", +                                         volname); +                if (!xl) +                        return -1; +                glusterfs_graph_set_first (graph, xl); + +                trav = first_of (graph); +                for (i = 0; i < dist_count; i++) +                        trav = trav->next; +                for (; trav != xl; trav = trav->prev) { +                        ret = volgen_xlator_link (xl, trav); +                        if (ret) +                                return -1;                  } -          } -        if (dist_count > 1) { -                if (replicate_count) { -                        VOLGEN_GENERATE_VOLNAME (subvol, volname, -                                                 "replicate"); -                } else if (stripe_count) { -                        VOLGEN_GENERATE_VOLNAME (subvol, volname, -                                                 "stripe"); -                } else { -                        VOLGEN_GENERATE_VOLNAME (subvol, volname, -                                                 "client"); -                } +        ret = volgen_graph_set_options_generic (graph, set_dict, volname, +                                                &perfxl_option_handler); +        if (ret) +                return -1; +        ret = volgen_graph_add_as (graph, "debug/io-stats", volname); +        if (ret) +                return -1; -                ret = __write_distribute_xlator (file, -                                                 dict, -                                                 subvol, -                                                 dist_count, -                                                 last_xlator); -                if (ret) { -                        gf_log ("", GF_LOG_DEBUG, -                                "Count not write xlator"); -                        goto out; -                } -        } +        return 0; +} -        ret = write_perf_xlators (volinfo, file, dist_count, -                                  replicate_count, stripe_count, -                                  last_xlator); -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, -                        "Could not write performance xlators"); -                goto out; -        } +/* builds a graph for client role , with option overrides in mod_dict */ +static int +build_client_graph (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo, +                    dict_t *mod_dict) +{ +        return build_graph_generic (graph, volinfo, mod_dict, NULL, +                                    &client_graph_builder); +} -        ret = dict_set_str (dict, "iostat-volname", volname); -        if (ret) { -                goto out; -        } -        ret = __write_iostats_xlator (file, -                                      dict, -                                      last_xlator); -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, -                        "Could not write io-stats xlator"); -                goto out; -        } +/* builds a graph for nfs server role */ +static int +build_nfs_graph (glusterfs_graph_t *graph) +{ +        glusterfs_graph_t   cgraph        = {{0,},}; +        glusterd_volinfo_t *voliter       = NULL; +        xlator_t           *this          = NULL; +        glusterd_conf_t    *priv          = NULL; +        xlator_t           *nfsxl         = NULL; +        char               *skey          = NULL; +        char                volume_id[64] = {0,}; +        int                 ret           = 0; -out: -        if (file) -                fclose (file); -        file = NULL; +        this = THIS; +        GF_ASSERT (this); +        priv = this->private; +        GF_ASSERT (priv); + +        ret = volgen_graph_add_as (graph, "nfs/server", "nfs-server"); +        nfsxl = first_of (graph); +        ret = xlator_set_option (nfsxl, "nfs.dynamic-volumes", "on"); +        if (ret) +                return -1; + +        list_for_each_entry (voliter, &priv->volumes, vol_list) { +                if (voliter->status != GLUSTERD_STATUS_STARTED) +                        continue; + +                ret = gf_asprintf (&skey, "rpc-auth.addr.%s.allow", +                                   voliter->volname); +                if (ret == -1) +                        goto oom; +                ret = xlator_set_option (nfsxl, skey, "*"); +                GF_FREE (skey); +                if (ret) +                        return -1; + +                ret = gf_asprintf (&skey, "nfs3.%s.volume-id", +                                   voliter->volname); +                if (ret == -1) +                        goto oom; +                uuid_unparse (voliter->volume_id, volume_id); +                ret = xlator_set_option (nfsxl, skey, volume_id); +                GF_FREE (skey); +                if (ret) +                        return -1; + +                memset (&cgraph, 0, sizeof (cgraph)); +                ret = build_client_graph (&cgraph, voliter, NULL); +                if (ret) +                        return -1; +                ret = volgen_graph_merge_sub (graph, &cgraph); +        }          return ret; + + oom: +        gf_log ("", GF_LOG_ERROR, "Out of memory"); + +        return -1;  } -static char * -get_brick_filename (glusterd_volinfo_t *volinfo, + + + +/**************************** + * + * Volume generation interface + * + ****************************/ + + +static void +get_brick_filepath (char *filename, glusterd_volinfo_t *volinfo,                      glusterd_brickinfo_t *brickinfo)  {          char  path[PATH_MAX]   = {0,}; -        char *ret              = NULL;          char  brick[PATH_MAX]  = {0,}; -        char *filename         = NULL; - -        filename = GF_CALLOC (1, PATH_MAX, gf_gld_mt_char); -        if (!filename) -                goto out;          GLUSTERD_REMOVE_SLASH_FROM_PATH (brickinfo->path, brick);          VOLGEN_GET_VOLUME_DIR (path, volinfo); @@ -2202,53 +874,27 @@ get_brick_filename (glusterd_volinfo_t *volinfo,                    path, volinfo->volname,                    brickinfo->hostname,                    brick); - -        ret = filename; -out: -        return ret;  } -char * -glusterd_get_nfs_filepath () +static int +glusterd_generate_brick_volfile (glusterd_volinfo_t *volinfo, +                                 glusterd_brickinfo_t *brickinfo)  { -        char  path[PATH_MAX] = {0,}; -        char *ret            = NULL; -        char *filepath       = NULL; - -        filepath = GF_CALLOC (1, PATH_MAX, gf_common_mt_char); -        if (!filepath) { -                gf_log ("", GF_LOG_ERROR, "Unable to allocate nfs file path"); -                goto out; -        } - -        VOLGEN_GET_NFS_DIR (path); - -        snprintf (filepath, PATH_MAX, "%s/nfs-server.vol", path); - -        ret = filepath; -out: -        return ret; -} - +        glusterfs_graph_t graph = {{0,},}; +        char    filename[PATH_MAX] = {0,}; +        int     ret = -1; -static char * -get_client_filepath (glusterd_volinfo_t *volinfo) -{ -        char  path[PATH_MAX] = {0,}; -        char *ret            = NULL; -        char *filename       = NULL; +        GF_ASSERT (volinfo); +        GF_ASSERT (brickinfo); -        filename = GF_CALLOC (1, PATH_MAX, gf_gld_mt_char); -        if (!filename) -                goto out; +        get_brick_filepath (filename, volinfo, brickinfo); -        VOLGEN_GET_VOLUME_DIR (path, volinfo); +        ret = build_server_graph (&graph, volinfo, NULL, brickinfo->path); +        if (!ret) +                ret = volgen_write_volfile (&graph, filename); -        snprintf (filename, PATH_MAX, "%s/%s-fuse.vol", -                  path, volinfo->volname); +        volgen_graph_free (&graph); -        ret = filename; -out:          return ret;  } @@ -2276,279 +922,47 @@ out:          return ret;  } -static int -glusterfsd_write_nfs_xlator (int fd, char *subvols, char *volume_ids) +static void +get_client_filepath (char *filename, glusterd_volinfo_t *volinfo)  { -        char    *dup_subvols = NULL; -        char    *subvols_remain = NULL; -        char    *subvol      = NULL; -        char    *str         = NULL; -        char    *free_ptr    = NULL; -        const char *nfs_str = "volume nfs-server\n" -                              "type nfs/server\n"; - -        if (fd <= 0) -                return -1; - -        dup_subvols = gf_strdup (subvols); -        if (!dup_subvols) -                return -1; -        else -                free_ptr = dup_subvols; - -        write (fd, nfs_str, strlen(nfs_str)); - -        subvol = strtok_r (dup_subvols, " \n", &subvols_remain); -        while (subvol) { -                str = "option rpc-auth.addr."; -                write (fd, str, strlen (str)); -                write (fd, subvol, strlen (subvol)); -                str = ".allow *\n"; -                write (fd, str, strlen (str)); -                subvol = strtok_r (NULL, " \n", &subvols_remain); -        } -        str = "option nfs.dynamic-volumes on\n"; -        write (fd, str, strlen (str)); - -        /* Write fsids */ -        write (fd, volume_ids, strlen (volume_ids)); - -        str = "subvolumes "; -        write (fd, str, strlen (str)); -        write (fd, subvols, strlen (subvols)); -        str = "\nend-volume\n"; -        write (fd, str, strlen (str)); -        GF_FREE (free_ptr); - -        return 0; -} - -int -volgen_generate_nfs_volfile (glusterd_volinfo_t *volinfo) -{ -        char               *nfs_filepath             = NULL; -        char               *fuse_filepath            = NULL; -        int                 nfs_fd                   = -1; -        int                 fuse_fd                  = -1; -        int                 ret                      = -1; -        char                nfs_orig_path[PATH_MAX]  = {0,}; -        char               *pad                      = NULL; -        char               *nfs_subvols              = NULL; -        char                fuse_subvols[2048]       = {0,}; -        int                 subvol_len               = 0; -        char               *nfs_vol_id               = NULL; -        char                nfs_vol_id_opt[512]      = {0,}; -        char                volume_id[64]            = {0,}; -        int                 nfs_volid_len            = 0; -        glusterd_volinfo_t *voliter                  = NULL; -        glusterd_conf_t    *priv                     = NULL; -        xlator_t           *this                     = NULL; - -        this = THIS; -        GF_ASSERT (this); -        priv = this->private; -        GF_ASSERT (priv); -        if (!volinfo) { -                gf_log ("", GF_LOG_ERROR, "Invalid Volume info"); -                goto out; -        } - -        nfs_filepath = glusterd_get_nfs_filepath (volinfo); -        if (!nfs_filepath) -                goto out; - -        strncat (nfs_filepath, ".tmp", PATH_MAX); -        nfs_fd = open (nfs_filepath, O_WRONLY|O_TRUNC|O_CREAT, 0666); -        if (nfs_fd < 0) { -                gf_log ("", GF_LOG_ERROR, "Could not open file: %s", -                        nfs_filepath); -                goto out; -        } - - -        list_for_each_entry (voliter, &priv->volumes, vol_list) { -                if (voliter->status != GLUSTERD_STATUS_STARTED) -                        continue; -                else { -                        subvol_len += (strlen (voliter->volname) + 1); // ' ' -                        // "option nfs3.<volume>.volume-id <uuid>\n" -                        nfs_volid_len += (7 + 4 + 11 + 40 + -                                          strlen (voliter->volname)); -                } -        } - -        if (subvol_len == 0) { -                gf_log ("", GF_LOG_ERROR, "No volumes started"); -                ret = -1; -                goto out; -        } -        subvol_len++; //null character -        nfs_subvols = GF_CALLOC (subvol_len, sizeof(*nfs_subvols), -                                 gf_common_mt_char); -        if (!nfs_subvols) { -                gf_log ("", GF_LOG_ERROR, "Memory not available"); -                ret = -1; -                goto out; -        } - -        nfs_vol_id = GF_CALLOC (nfs_volid_len, sizeof (char), -                                 gf_common_mt_char); -        if (!nfs_vol_id) { -                gf_log ("", GF_LOG_ERROR, "Memory not available"); -                ret = -1; -                goto out; -        } - -        voliter = NULL; -        list_for_each_entry (voliter, &priv->volumes, vol_list) { -                if (voliter->status != GLUSTERD_STATUS_STARTED) -                        continue; - -                gf_log ("", GF_LOG_DEBUG, -                        "adding fuse info of - %s", voliter->volname); - -                snprintf (fuse_subvols, sizeof(fuse_subvols), " %s", voliter->volname); -                fuse_filepath = get_client_filepath (voliter); -                if (!fuse_filepath) { -                        ret = -1; -                        goto out; -                } - -                fuse_fd = open (fuse_filepath, O_RDONLY); -                if (fuse_fd < 0) { -                        gf_log ("", GF_LOG_ERROR, "Could not open file: %s", -                                fuse_filepath); -                        ret = -1; -                        goto out; -                } - -                ret = glusterd_file_copy (nfs_fd, fuse_fd); -                if (ret) -                        goto out; -                GF_FREE (fuse_filepath); -                fuse_filepath = NULL; -                close (fuse_fd); -                fuse_fd = -1; -                if (subvol_len > strlen (fuse_subvols)) { -                        strncat (nfs_subvols, fuse_subvols, subvol_len - 1); -                        subvol_len -= strlen (fuse_subvols); -                } else { -                        ret = -1; -                        gf_log ("", GF_LOG_ERROR, "Too many subvolumes"); -                        goto out; -                } -                uuid_unparse (voliter->volume_id, volume_id); -                snprintf (nfs_vol_id_opt, 512, "option nfs3.%s.volume-id %s\n", -                          voliter->volname, volume_id); -                strcat (nfs_vol_id, nfs_vol_id_opt); -        } +        char  path[PATH_MAX] = {0,}; -        ret = glusterfsd_write_nfs_xlator (nfs_fd, nfs_subvols, nfs_vol_id); -        if (ret) -                goto out; +        VOLGEN_GET_VOLUME_DIR (path, volinfo); -        strncpy (nfs_orig_path, nfs_filepath, PATH_MAX); -        pad = strrchr (nfs_orig_path, '.'); -        if (!pad) { -                gf_log ("", GF_LOG_ERROR, "Failed to find the pad in nfs pat"); -                ret = -1; -                goto out; -        } -        *pad = '\0'; -        ret = rename (nfs_filepath, nfs_orig_path); -out: -        if (ret && nfs_filepath) -                unlink (nfs_filepath); -        if (fuse_filepath) -                GF_FREE (fuse_filepath); -        if (nfs_filepath) -                GF_FREE (nfs_filepath); -        if (nfs_vol_id) -                GF_FREE (nfs_vol_id); -        if (nfs_subvols) -                GF_FREE (nfs_subvols); -        if (fuse_fd > 0) -                close (fuse_fd); -        if (nfs_fd > 0) -                close (nfs_fd); -        return ret; +        snprintf (filename, PATH_MAX, "%s/%s-fuse.vol", +                  path, volinfo->volname);  }  static int -generate_client_volfiles (glusterd_volinfo_t *volinfo) +generate_client_volfile (glusterd_volinfo_t *volinfo)  { -        char                 *filename    = NULL; -        int                   ret         = -1; +        glusterfs_graph_t graph = {{0,},}; +        char    filename[PATH_MAX] = {0,}; +        int     ret = -1; -        filename = get_client_filepath (volinfo); -        if (!filename) { -                gf_log ("", GF_LOG_ERROR, -                        "Out of memory"); -                ret = -1; -                goto out; -        } +        get_client_filepath (filename, volinfo); -        ret = generate_client_volfile (volinfo, filename); -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, -                        "Could not generate volfile for client"); -                goto out; -        } +        ret = build_client_graph (&graph, volinfo, NULL); +        if (!ret) +                ret = volgen_write_volfile (&graph, filename); -out: -        if (filename) -                GF_FREE (filename); +        volgen_graph_free (&graph);          return ret;  } -static int -glusterd_volgen_set_transport (glusterd_volinfo_t *volinfo) -{ -        int ret = 0; - -        GF_ASSERT (volinfo->dict); - -        if(volinfo->transport_type == GF_TRANSPORT_RDMA) { -                ret = set_xlator_option (volinfo->dict, VOLGEN_CLIENT_OPTION_TRANSTYPE, -                                        "rdma"); -                ret = set_xlator_option (volinfo->dict, VOLGEN_SERVER_OPTION_TRANSTYPE, -                                        "rdma"); -        } else { -                ret = set_xlator_option (volinfo->dict, VOLGEN_CLIENT_OPTION_TRANSTYPE, -                                 "tcp"); -                ret = set_xlator_option (volinfo->dict, VOLGEN_SERVER_OPTION_TRANSTYPE, -                                 "tcp"); -        } - -        return 0; -} -  int -glusterd_rb_create_volfiles (glusterd_volinfo_t *volinfo, +glusterd_create_rb_volfiles (glusterd_volinfo_t *volinfo,                               glusterd_brickinfo_t *brickinfo)  {          int ret = -1; -        glusterd_volgen_set_transport (volinfo); -          ret = glusterd_generate_brick_volfile (volinfo, brickinfo); -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, -                        "Could not generate volfiles for bricks"); -                goto out; -        } - -        ret = generate_client_volfiles (volinfo); -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, -                        "Could not generate volfile for client"); -                goto out; -        } - -        ret = glusterd_fetchspec_notify (THIS); +        if (!ret) +                ret = generate_client_volfile (volinfo); +        if (!ret) +                ret = glusterd_fetchspec_notify (THIS); -out:          return ret;  } @@ -2557,8 +971,6 @@ glusterd_create_volfiles (glusterd_volinfo_t *volinfo)  {          int ret = -1; -        glusterd_volgen_set_transport (volinfo); -          ret = generate_brick_volfiles (volinfo);          if (ret) {                  gf_log ("", GF_LOG_ERROR, @@ -2566,7 +978,7 @@ glusterd_create_volfiles (glusterd_volinfo_t *volinfo)                  goto out;          } -        ret = generate_client_volfiles (volinfo); +        ret = generate_client_volfile (volinfo);          if (ret) {                  gf_log ("", GF_LOG_ERROR,                          "Could not generate volfile for client"); @@ -2579,58 +991,43 @@ out:          return ret;  } -int -glusterd_delete_volfile (glusterd_volinfo_t *volinfo, -                         glusterd_brickinfo_t *brickinfo) +void +glusterd_get_nfs_filepath (char *filename)  { -        char                    *filename  = NULL; - -        GF_ASSERT (volinfo); -        GF_ASSERT (brickinfo); - -        filename = get_brick_filename (volinfo, brickinfo); +        char  path[PATH_MAX] = {0,}; -        if (filename) -                unlink (filename); +        VOLGEN_GET_NFS_DIR (path); -        if (filename) -                GF_FREE (filename); -        return 0; +        snprintf (filename, PATH_MAX, "%s/nfs-server.vol", path);  }  int -glusterd_generate_brick_volfile (glusterd_volinfo_t  *volinfo, -                                 glusterd_brickinfo_t *brickinfo) +glusterd_create_nfs_volfile ()  { -        char    *filename  = NULL; +        glusterfs_graph_t graph = {{0,},}; +        char    filename[PATH_MAX] = {0,};          int     ret = -1; -        GF_ASSERT (volinfo); -        GF_ASSERT (brickinfo); +        glusterd_get_nfs_filepath (filename); -        filename = get_brick_filename (volinfo, brickinfo); +        ret = build_nfs_graph (&graph); +        if (!ret) +                ret = volgen_write_volfile (&graph, filename); -        if (!filename) { -                gf_log ("", GF_LOG_ERROR, -                        "Out of memory"); -                ret = -1; -                goto out; -        } +        volgen_graph_free (&graph); -        ret = generate_server_volfile (brickinfo, volinfo->dict, -                                       filename); -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, -                        "Could not generate volfile for brick %s:%s", -                        brickinfo->hostname, brickinfo->path); -                goto out; -        } +        return ret; +} -        ret = 0; +int +glusterd_delete_volfile (glusterd_volinfo_t *volinfo, +                         glusterd_brickinfo_t *brickinfo) +{ +        char filename[PATH_MAX] = {0,}; -out: -        if (filename) -                GF_FREE (filename); +        GF_ASSERT (volinfo); +        GF_ASSERT (brickinfo); -        return ret; +        get_brick_filepath (filename, volinfo, brickinfo); +        return unlink (filename);  } diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.h b/xlators/mgmt/glusterd/src/glusterd-volgen.h index 8173631a426..3e877fd7b08 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.h +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.h @@ -24,134 +24,26 @@  #define _CONFIG_H  #include "config.h"  #endif -#include "xlator.h" -#include "protocol-common.h" -#include "glusterd.h" -#include "defaults.h" -#include "list.h" -#include "dict.h" -#include "compat.h" -#include "compat-errno.h" -#include "glusterd-sm.h" -#include "glusterd-op-sm.h" -#include "cli1.h" -#include "glusterd-mem-types.h" - -#define VOLGEN_GET_NFS_DIR(path)                                      \ -        do {                                                            \ -                glusterd_conf_t *priv = THIS->private;                  \ -                snprintf (path, PATH_MAX, "%s/nfs", priv->workdir);\ -        } while (0);                                                    \ - -#define VOLGEN_GET_VOLUME_DIR(path, volinfo)                            \ -        do {                                                            \ -                glusterd_conf_t *priv = THIS->private;                  \ -                snprintf (path, PATH_MAX, "%s/vols/%s", priv->workdir,  \ -                          volinfo->volname);                            \ -        } while (0);                                                    \ - - -#define VOLGEN_GET_BRICK_DIR(path, volinfo)                             \ -        do {                                                            \ -                glusterd_conf_t *priv = THIS->private;                  \ -                snprintf (path, PATH_MAX, "%s/%s/%s/%s", priv->workdir, \ -                          GLUSTERD_VOLUME_DIR_PREFIX, volinfo->volname, \ -                          GLUSTERD_BRICK_INFO_DIR);                     \ -        } while (0);                                                    \ - - -#define VOLGEN_GENERATE_VOLNAME(str, volname, subvol)             \ -        do {                                                      \ -                snprintf (str, 2048, "%s-%s", volname, subvol);   \ -        } while (0);                                              \ - -#define VOLGEN_POSIX_OPTION_ODIRECT "volgen_posix_option_statfssize" -#define VOLGEN_POSIX_OPTION_STATFSSIZE "volgen_posix_option_statfssize" -#define VOLGEN_POSIX_OPTION_MANDATTR "volgen_posix_option_mandattr" -#define VOLGEN_POSIX_OPTION_SPANDEVICES "volgen_posix_option_spandevices" -#define VOLGEN_POSIX_OPTION_BCKUNLINK "volgen_posix_option_bckunlink" - -#define VOLGEN_LOCKS_OPTION_TRACE "volgen_locks_option_trace" -#define VOLGEN_LOCKS_OPTION_MAND "volgen_locks_option_mand" - -#define VOLGEN_CLIENT_OPTION_TRANSTYPE "volgen_client_option_transtype" -#define VOLGEN_CLIENT_OPTION_NODELAY "volgen_client_option_nodelay" - -#define VOLGEN_IOT_OPTION_THREADCOUNT "volgen_iot_option_threadcount" -#define VOLGEN_IOT_OPTION_AUTOSCALING "volgen_iot_option_autoscaling" -#define VOLGEN_IOT_OPTION_MINTHREADS "volgen_iot_option_minthreads" -#define VOLGEN_IOT_OPTION_MAXTHREADS "volgen_iot_option_maxthreads" - -#define VOLGEN_SERVER_OPTION_TRANSTYPE "volgen_server_option_transtype" -#define VOLGEN_SERVER_OPTION_NODELAY "volgen_server_option_nodelay" -#define VOLGEN_REPLICATE_OPTION_READSUBVOL "volgen_replicate_option_readsubvol" -#define VOLGEN_REPLICATE_OPTION_FAVCHILD "volgen_replicate_option_favchild" -#define VOLGEN_REPLICATE_OPTION_BCKSHCOUNT "volgen_replicate_option_bckshcount" -#define VOLGEN_REPLICATE_OPTION_DATASH "volgen_replicate_option_datash" -#define VOLGEN_REPLICATE_OPTION_DATASHALGO "volgen_replicate_option_datashalgo" -#define VOLGEN_REPLICATE_OPTION_SHWINDOWSIZE "volgen_replicate_option_shwindowsize" -#define VOLGEN_REPLICATE_OPTION_METASH "volgen_replicate_option_metash" -#define VOLGEN_REPLICATE_OPTION_ENTRYSH "volgen_replicate_option_entrysh" -#define VOLGEN_REPLICATE_OPTION_DATACHANGELOG "volgen_replicate_option_datachangelog" -#define VOLGEN_REPLICATE_OPTION_METADATACHANGELOG "volgen_replicate_option_metadatachangelog" -#define VOLGEN_REPLICATE_OPTION_ENTRYCHANGELOG "volgen_replicate_option_entrychangelog" -#define VOLGEN_REPLICATE_OPTION_STRICTREADDIR "volgen_replicate_option_strictreaddir" - -#define VOLGEN_STRIPE_OPTION_BLOCKSIZE "volgen_stripe_option_blocksize" -#define VOLGEN_STRIPE_OPTION_USEXATTR  "volgen_stripe_option_usexattr" - -#define VOLGEN_DHT_OPTION_LOOKUPUNHASH "volgen_dht_option_lookupunhash" -#define VOLGEN_DHT_OPTION_MINFREEDISK "volgen_dht_option_minfreedisk" -#define VOLGEN_DHT_OPTION_UNHASHSTICKY "volgen_dht_option_unhashsticky" - -#define VOLGEN_WB_OPTION_FLUSHBEHIND "volgen_wb_option_flushbehind" -#define VOLGEN_WB_OPTION_CACHESIZE "volgen_wb_option_cachesize" -#define VOLGEN_WB_OPTION_DISABLENBYTES "volgen_wb_option_disablenbytes" -#define VOLGEN_WB_OPTION_OSYNC "volgen_wb_option_osync" -#define VOLGEN_WB_OPTION_TRICKLINGWRITES "volgen_wb_option_tricklingwrites" - -#define VOLGEN_RA_OPTION_ATIME "volgen_ra_option_atime" -#define VOLGEN_RA_OPTION_PAGECOUNT "volgen_ra_option_pagecount" - -#define VOLGEN_IOCACHE_OPTION_PRIORITY "volgen_iocache_option_priority" -#define VOLGEN_IOCACHE_OPTION_TIMEOUT "volgen_iocache_option_timeout" -#define VOLGEN_IOCACHE_OPTION_CACHESIZE "volgen_iocache_option_cachesize" -#define VOLGEN_IOCACHE_OPTION_MINFILESIZE "volgen_iocache_option_minfilesize" -#define VOLGEN_IOCACHE_OPTION_MAXFILESIZE "volgen_iocache_option_maxfilesize" - -#define VOLGEN_QR_OPTION_PRIORITY "volgen_qr_option_priority" -#define VOLGEN_QR_OPTION_TIMEOUT "volgen_qr_option_timeout" -#define VOLGEN_QR_OPTION_CACHESIZE "volgen_qr_option_cachesize" -#define VOLGEN_QR_OPTION_MAXFILESIZE "volgen_qr_option_maxfilesize" - -#define VOLGEN_IOS_OPTION_DUMP_FD_STATS   "dump-fd-stats" -#define VOLGEN_IOS_OPTION_MEASURE_LATENCY "latency-measurement" - -int -glusterd_create_volfiles (glusterd_volinfo_t *volinfo); +#include "glusterd.h" -int -glusterd_delete_volfile (glusterd_volinfo_t *volinfo, -                         glusterd_brickinfo_t *brickinfo); +struct volopt_map_entry { +        char *key; +        char *voltype; +}; -int32_t -glusterd_default_xlator_options (glusterd_volinfo_t *volinfo); +extern struct volopt_map_entry glusterd_volopt_map[]; -char * -glusterd_get_nfs_filepath (); +int glusterd_create_rb_volfiles (glusterd_volinfo_t *volinfo, +                                 glusterd_brickinfo_t *brickinfo); -int -volgen_generate_nfs_volfile (glusterd_volinfo_t *volinfo); +int glusterd_create_volfiles (glusterd_volinfo_t *volinfo); -int -uncomment_option( char *opt_str,char *comment_str); +void glusterd_get_nfs_filepath (char *filename); -int -glusterd_generate_brick_volfile (glusterd_volinfo_t  *volinfo, -                                 glusterd_brickinfo_t *brickinfo); +int glusterd_create_nfs_volfile (); -int -glusterd_rb_create_volfiles (glusterd_volinfo_t *volinfo, +int glusterd_delete_volfile (glusterd_volinfo_t *volinfo,                               glusterd_brickinfo_t *brickinfo); +  #endif  | 
