summaryrefslogtreecommitdiffstats
path: root/xlators/performance/io-threads
diff options
context:
space:
mode:
authorJeff Darcy <jdarcy@redhat.com>2016-07-21 14:49:55 -0400
committerJeff Darcy <jdarcy@redhat.com>2016-07-28 07:50:52 -0700
commit25d1bdc094a8408afc074817ec6d63c812c571f9 (patch)
tree20cf0fc0ff7089a4f4c66f2ee892ea3ba3b252fa /xlators/performance/io-threads
parentb8e8bfc7e4d3eaf76bb637221bc6392ec10ca54b (diff)
io-threads: remove least-rate-limit option and code
This will be unnecessary, and mostly in the way, as real fairness guarantees are implemented. Change-Id: Ic61ec1c9e9add58385f1a4eafcfe2cc554ceefc8 BUG: 1360402 Signed-off-by: Jeff Darcy <jdarcy@redhat.com> Reviewed-on: http://review.gluster.org/14989 Smoke: Gluster Build System <jenkins@build.gluster.org> Tested-by: Gluster Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> NetBSD-regression: Gluster Build System <jenkins@build.gluster.org>
Diffstat (limited to 'xlators/performance/io-threads')
-rw-r--r--xlators/performance/io-threads/src/io-threads.c87
-rw-r--r--xlators/performance/io-threads/src/io-threads.h11
2 files changed, 2 insertions, 96 deletions
diff --git a/xlators/performance/io-threads/src/io-threads.c b/xlators/performance/io-threads/src/io-threads.c
index dd2aba3fd0a..c0bcea48e3d 100644
--- a/xlators/performance/io-threads/src/io-threads.c
+++ b/xlators/performance/io-threads/src/io-threads.c
@@ -49,69 +49,17 @@ struct volume_options options[];
} while (0)
call_stub_t *
-__iot_dequeue (iot_conf_t *conf, int *pri, struct timespec *sleep)
+__iot_dequeue (iot_conf_t *conf, int *pri)
{
call_stub_t *stub = NULL;
int i = 0;
- struct timeval curtv = {0,}, difftv = {0,};
*pri = -1;
- sleep->tv_sec = 0;
- sleep->tv_nsec = 0;
for (i = 0; i < IOT_PRI_MAX; i++) {
if (list_empty (&conf->reqs[i]) ||
(conf->ac_iot_count[i] >= conf->ac_iot_limit[i]))
continue;
- if (i == IOT_PRI_LEAST) {
- pthread_mutex_lock(&conf->throttle.lock);
- if (!conf->throttle.sample_time.tv_sec) {
- /* initialize */
- gettimeofday(&conf->throttle.sample_time, NULL);
- } else {
- /*
- * Maintain a running count of least priority
- * operations that are handled over a particular
- * time interval. The count is provided via
- * state dump and is used as a measure against
- * least priority op throttling.
- */
- gettimeofday(&curtv, NULL);
- timersub(&curtv, &conf->throttle.sample_time,
- &difftv);
- if (difftv.tv_sec >= IOT_LEAST_THROTTLE_DELAY) {
- conf->throttle.cached_rate =
- conf->throttle.sample_cnt;
- conf->throttle.sample_cnt = 0;
- conf->throttle.sample_time = curtv;
- }
-
- /*
- * If we're over the configured rate limit,
- * provide an absolute time to the caller that
- * represents the soonest we're allowed to
- * return another least priority request.
- */
- if (conf->throttle.rate_limit &&
- conf->throttle.sample_cnt >=
- conf->throttle.rate_limit) {
- struct timeval delay;
- delay.tv_sec = IOT_LEAST_THROTTLE_DELAY;
- delay.tv_usec = 0;
-
- timeradd(&conf->throttle.sample_time,
- &delay, &curtv);
- TIMEVAL_TO_TIMESPEC(&curtv, sleep);
-
- pthread_mutex_unlock(
- &conf->throttle.lock);
- break;
- }
- }
- conf->throttle.sample_cnt++;
- pthread_mutex_unlock(&conf->throttle.lock);
- }
-
stub = list_entry (conf->reqs[i].next, call_stub_t, list);
conf->ac_iot_count[i]++;
*pri = i;
@@ -155,7 +103,6 @@ iot_worker (void *data)
int pri = -1;
char timeout = 0;
char bye = 0;
- struct timespec sleep = {0,};
conf = data;
this = conf->this;
@@ -196,13 +143,7 @@ iot_worker (void *data)
}
}
- stub = __iot_dequeue (conf, &pri, &sleep);
- if (!stub && (sleep.tv_sec || sleep.tv_nsec)) {
- pthread_cond_timedwait(&conf->cond,
- &conf->mutex, &sleep);
- pthread_mutex_unlock(&conf->mutex);
- continue;
- }
+ stub = __iot_dequeue (conf, &pri);
}
pthread_mutex_unlock (&conf->mutex);
@@ -914,10 +855,6 @@ iot_priv_dump (xlator_t *this)
gf_proc_dump_write("least_priority_threads", "%d",
conf->ac_iot_limit[IOT_PRI_LEAST]);
- gf_proc_dump_write("cached least rate", "%u",
- conf->throttle.cached_rate);
- gf_proc_dump_write("least rate limit", "%u", conf->throttle.rate_limit);
-
return 0;
}
@@ -949,9 +886,6 @@ reconfigure (xlator_t *this, dict_t *options)
GF_OPTION_RECONF ("enable-least-priority", conf->least_priority,
options, bool, out);
- GF_OPTION_RECONF("least-rate-limit", conf->throttle.rate_limit, options,
- int32, out);
-
ret = 0;
out:
return ret;
@@ -1021,15 +955,6 @@ init (xlator_t *this)
GF_OPTION_INIT ("enable-least-priority", conf->least_priority,
bool, out);
- GF_OPTION_INIT("least-rate-limit", conf->throttle.rate_limit, int32,
- out);
- if ((ret = pthread_mutex_init(&conf->throttle.lock, NULL)) != 0) {
- gf_msg (this->name, GF_LOG_ERROR, 0,
- IO_THREADS_MSG_INIT_FAILED,
- "pthread_mutex_init failed (%d)", ret);
- goto out;
- }
-
conf->this = this;
for (i = 0; i < IOT_PRI_MAX; i++) {
@@ -1179,14 +1104,6 @@ struct volume_options options[] = {
.max = 0x7fffffff,
.default_value = "120",
},
- {.key = {"least-rate-limit"},
- .type = GF_OPTION_TYPE_INT,
- .min = 0,
- .max = INT_MAX,
- .default_value = "0",
- .description = "Max number of least priority operations to handle "
- "per-second"
- },
{ .key = {NULL},
},
};
diff --git a/xlators/performance/io-threads/src/io-threads.h b/xlators/performance/io-threads/src/io-threads.h
index d8eea2cf77a..6d9ea255909 100644
--- a/xlators/performance/io-threads/src/io-threads.h
+++ b/xlators/performance/io-threads/src/io-threads.h
@@ -48,15 +48,6 @@ typedef enum {
IOT_PRI_MAX,
} iot_pri_t;
-#define IOT_LEAST_THROTTLE_DELAY 1 /* sample interval in seconds */
-struct iot_least_throttle {
- struct timeval sample_time; /* timestamp of current sample */
- uint32_t sample_cnt; /* sample count for active interval */
- uint32_t cached_rate; /* the most recently measured rate */
- int32_t rate_limit; /* user-specified rate limit */
- pthread_mutex_t lock;
-};
-
struct iot_conf {
pthread_mutex_t mutex;
pthread_cond_t cond;
@@ -78,8 +69,6 @@ struct iot_conf {
xlator_t *this;
size_t stack_size;
-
- struct iot_least_throttle throttle;
};
typedef struct iot_conf iot_conf_t;
>- trans->ctx = ctx;
- trans->prev = top;
- trans->init = fetch_init;
- trans->notify = default_notify;
- trans->options = get_new_dict ();
-
- parent = CALLOC (1, sizeof(*parent));
- parent->xlator = top;
- if (trans->parents == NULL)
- trans->parents = parent;
- else {
- tmp = trans->parents;
- while (tmp->next)
- tmp = tmp->next;
- tmp->next = parent;
- }
-
- /* TODO: log on failure to set dict */
- if (remote_host) {
- ret = dict_set (trans->options, "remote-host",
- str_to_data ((char *)remote_host));
+ gf_getspec_rsp rsp = {0,};
+ call_frame_t *frame = NULL;
+ glusterfs_ctx_t *ctx = NULL;
+ int ret = 0;
+ ssize_t size = 0;
+ FILE *tmpfp = NULL;
+ struct timeval tv = {0, };
+
+ frame = myframe;
+ ctx = frame->this->ctx;
+
+ if (-1 == req->rpc_status) {
+ rsp.op_ret = -1;
+ rsp.op_errno = EINVAL;
+ goto out;
}
- if (remote_port)
- ret = dict_set_uint32 (trans->options, "remote-port",
- remote_port);
-
- /* 'option remote-subvolume <x>' is needed here even though
- * its not used
- */
- ret = dict_set_static_ptr (trans->options, "remote-subvolume",
- "brick");
- ret = dict_set_static_ptr (trans->options, "disable-handshake", "on");
- ret = dict_set_static_ptr (trans->options, "non-blocking-io", "off");
-
- if (transport) {
- char *transport_type = CALLOC (1, strlen (transport) + 10);
- ERR_ABORT (transport_type);
- strcpy(transport_type, transport);
-
- if (strchr (transport_type, ':'))
- *(strchr (transport_type, ':')) = '\0';
-
- ret = dict_set_dynstr (trans->options, "transport-type",
- transport_type);
- }
-
- xlator_set_type (trans, "protocol/client");
-
- trav = top;
- while (trav) {
- /* Get the first volume_option */
- if (!list_empty (&trav->volume_options)) {
- list_for_each_entry (vol_opt,
- &trav->volume_options, list)
- break;
- if ((ret =
- validate_xlator_volume_options (trav,
- vol_opt->given_opt)) < 0) {
- gf_log (trav->name, GF_LOG_ERROR,
- "validating translator failed");
- return NULL;
- }
- }
- trav = trav->next;
- }
+ ret = xdr_to_getspec_rsp (*iov, &rsp);
+ if (ret < 0) {
+ gf_log (frame->this->name, GF_LOG_ERROR, "error");
+ rsp.op_ret = -1;
+ rsp.op_errno = EINVAL;
+ goto out;
+ }
+
+ if (-1 == rsp.op_ret) {
+ gf_log (frame->this->name, GF_LOG_ERROR,
+ "failed to get the 'volume file' from server");
+ goto out;
+ }
+
+ size = rsp.op_ret;
+
+ if (size == oldvollen && (memcmp (oldvolfile, rsp.spec, size) == 0))
+ goto out;
+
+ tmpfp = tmpfile ();
+ if (!tmpfp)
+ goto out;
+
+ fwrite (rsp.spec, size, 1, tmpfp);
+ fflush (tmpfp);
+
+
+ ret = glusterfs_process_volfp (ctx, tmpfp);
+ if (ret)
+ goto out;
+
+ oldvollen = size;
+ memcpy (oldvolfile, rsp.spec, size);
+
+out:
+ tv.tv_sec = 1;
+ timer = gf_timer_call_after (ctx, tv,
+ (gf_timer_cbk_t) glusterfs_volfile_fetch,
+ ctx);
- if (xlator_tree_init (top) != 0)
- return NULL;
+ STACK_DESTROY (frame->root);
- glusterfs_graph_parent_up (top);
-
- return top;
+ if (rsp.spec)
+ free (rsp.spec);
+
+ return 0;
}
-static int
-_fetch (glusterfs_ctx_t *ctx,
- FILE *spec_fp,
- const char *remote_host,
- const char *transport,
- uint32_t remote_port)
+int
+glusterfs_volfile_fetch (glusterfs_ctx_t *ctx)
{
- xlator_t *this = NULL;
-
- this = get_shrub (ctx, remote_host, transport, remote_port);
- if (this == NULL)
- return -1;
-
- this->private = spec_fp;
-
- event_dispatch (ctx->event_pool);
-
- return 0;
+ cmd_args_t *cmd_args = NULL;
+ gf_getspec_req req = {0, };
+ int ret = 0;
+ call_frame_t *frame = NULL;
+
+
+ {
+ if (timer)
+ gf_timer_call_cancel (ctx, timer);
+ timer = NULL;
+ }
+
+ cmd_args = &ctx->cmd_args;
+
+ frame = create_frame (THIS, ctx->pool);
+
+ req.key = cmd_args->volfile_id;
+ req.flags = 0;
+
+ ret = mgmt_submit_request (&req, frame, ctx, &clnt_handshake_prog,
+ GF_HNDSK_GETSPEC, xdr_from_getspec_req,
+ mgmt_getspec_cbk);
+ return ret;
}
-static int
-_fork_and_fetch (glusterfs_ctx_t *ctx,
- FILE *spec_fp,
- const char *remote_host,
- const char *transport,
- uint32_t remote_port)
+static int
+mgmt_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,
+ void *data)
{
- int ret;
-
- ret = fork ();
- switch (ret) {
- case -1:
- perror ("fork()");
- break;
- case 0:
- /* child */
- ret = _fetch (ctx, spec_fp, remote_host,
- transport, remote_port);
- if (ret == -1)
- exit (ret);
- default:
- /* parent */
- wait (&ret);
- ret = WEXITSTATUS (ret);
- }
- return ret;
+ xlator_t *this = NULL;
+ glusterfs_ctx_t *ctx = NULL;
+ int ret = 0;
+
+ this = mydata;
+ ctx = this->ctx;
+
+ switch (event) {
+ case RPC_CLNT_CONNECT:
+ rpc_clnt_set_connected (ctx->mgmt);
+
+ ret = glusterfs_volfile_fetch (ctx);
+
+ break;
+ default:
+ break;
+ }
+
+ return 0;
}
-FILE *
-fetch_spec (glusterfs_ctx_t *ctx)
+
+int
+glusterfs_mgmt_init (glusterfs_ctx_t *ctx)
{
- char *remote_host = NULL;
- char *transport = NULL;
- FILE *spec_fp;
- int32_t ret;
-
- spec_fp = tmpfile ();
-
- if (!spec_fp) {
- perror ("tmpfile ()");
- return NULL;
- }
-
- remote_host = ctx->cmd_args.volfile_server;
- transport = ctx->cmd_args.volfile_server_transport;
- if (!transport)
- transport = "tcp";
-
- ret = _fork_and_fetch (ctx, spec_fp, remote_host, transport,
- ctx->cmd_args.volfile_server_port);
-
- if (!ret) {
- fseek (spec_fp, 0, SEEK_SET);
- }
- else {
- fclose (spec_fp);
- spec_fp = NULL;
- }
-
- return spec_fp;
+ cmd_args_t *cmd_args = NULL;
+ struct rpc_clnt *rpc = NULL;
+ struct rpc_clnt_config rpc_cfg = {0,};
+ dict_t *options = NULL;
+ int ret = -1;
+ int port = 6969;
+ char *host = NULL;
+
+ cmd_args = &ctx->cmd_args;
+
+ if (ctx->mgmt)
+ return 0;
+
+ options = dict_new ();
+ if (!options)
+ goto out;
+
+ if (cmd_args->volfile_server_port)
+ port = cmd_args->volfile_server_port;
+
+ host = "localhost";
+ if (cmd_args->volfile_server)
+ host = cmd_args->volfile_server;
+
+ rpc_cfg.remote_host = host;
+ rpc_cfg.remote_port = port;
+
+ ret = dict_set_int32 (options, "remote-port", port);
+ if (ret)
+ goto out;
+
+ ret = dict_set_str (options, "remote-host", host);
+ if (ret)
+ goto out;
+
+ ret = dict_set_str (options, "transport.address-family", "inet");
+ if (ret)
+ goto out;
+
+ rpc = rpc_clnt_init (&rpc_cfg, options, THIS->ctx, THIS->name);
+ if (!rpc) {
+ ret = -1;
+ goto out;
+ }
+
+ ctx->mgmt = rpc;
+
+ ret = rpc_clnt_register_notify (rpc, mgmt_rpc_notify, THIS);
+ if (ret)
+ goto out;
+
+out:
+ return ret;
}
-#endif
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c
index dc5536bfb62..acd2cb59976 100644
--- a/glusterfsd/src/glusterfsd.c
+++ b/glusterfsd/src/glusterfsd.c
@@ -181,6 +181,7 @@ static struct argp argp = { gf_options, parse_opts, argp_doc, gf_doc };
int glusterfs_pidfile_cleanup (glusterfs_ctx_t *ctx);
int glusterfs_volumes_init (glusterfs_ctx_t *ctx);
+int glusterfs_mgmt_init (glusterfs_ctx_t *ctx);
int
create_fuse_mount (glusterfs_ctx_t *ctx)
@@ -190,60 +191,52 @@ create_fuse_mount (glusterfs_ctx_t *ctx)
xlator_t *master = NULL;
cmd_args = &ctx->cmd_args;
- master = ctx->master;
- if (!master && !cmd_args->mount_point)
- return 0;
-
- if (!master) {
- master = GF_CALLOC (1, sizeof (*master),
- gfd_mt_xlator_t);
- if (!master)
- goto err;
- master->name = gf_strdup ("fuse");
- if (!master->name)
- goto err;
+ if (!cmd_args->mount_point)
+ return 0;
- if (xlator_set_type (master, "mount/fuse") == -1) {
- gf_log ("glusterfsd", GF_LOG_ERROR,
- "MOUNT-POINT %s initialization failed",
- cmd_args->mount_point);
- goto err;
- }
+ master = GF_CALLOC (1, sizeof (*master),
+ gfd_mt_xlator_t);
+ if (!master)
+ goto err;
- master->options = get_new_dict ();
+ master->name = gf_strdup ("fuse");
+ if (!master->name)
+ goto err;
- ctx->master = master;
+ if (xlator_set_type (master, "mount/fuse") == -1) {
+ gf_log ("glusterfsd", GF_LOG_ERROR,
+ "MOUNT-POINT %s initialization failed",
+ cmd_args->mount_point);
+ goto err;
}
- master->ctx = ctx;
- if (cmd_args->mount_point)
- ret = dict_set_static_ptr (master->options, ZR_MOUNTPOINT_OPT,
+ master->ctx = ctx;
+ master->options = get_new_dict ();
+
+ ret = dict_set_static_ptr (master->options, ZR_MOUNTPOINT_OPT,
cmd_args->mount_point);
+ if (ret < 0) {
+ gf_log ("glusterfsd", GF_LOG_ERROR,
+ "failed to set mount-point to options dictionary");
+ goto err;
+ }
- if (ret == 0 && cmd_args->fuse_attribute_timeout >= 0)
+ if (cmd_args->fuse_attribute_timeout >= 0)
ret = dict_set_double (master->options, ZR_ATTR_TIMEOUT_OPT,
cmd_args->fuse_attribute_timeout);
-
- if (ret == 0 && cmd_args->fuse_entry_timeout >= 0)
+ if (cmd_args->fuse_entry_timeout >= 0)
ret = dict_set_double (master->options, ZR_ENTRY_TIMEOUT_OPT,
cmd_args->fuse_entry_timeout);
- if (ret == 0 && cmd_args->volfile_check)
+ if (cmd_args->volfile_check)
ret = dict_set_int32 (master->options, ZR_STRICT_VOLFILE_CHECK,
cmd_args->volfile_check);
- if (ret == 0 && cmd_args->dump_fuse)
+ if (cmd_args->dump_fuse)
ret = dict_set_static_ptr (master->options, ZR_DUMP_FUSE,
cmd_args->dump_fuse);
- if (ret) {
- gf_log ("glusterfsd", GF_LOG_ERROR,
- "failed to set mount-point to options "
- "dictionary");
- goto err;
- }
-
switch (cmd_args->fuse_direct_io_mode) {
case GF_OPTION_DISABLE: /* disable */
ret = dict_set_static_ptr (master->options, ZR_DIRECT_IO_OPT,
@@ -262,6 +255,8 @@ create_fuse_mount (glusterfs_ctx_t *ctx)
if (ret)
goto err;
+ ctx->master = master;
+
return 0;
err:
@@ -283,23 +278,6 @@ get_volfp (glusterfs_ctx_t *ctx)
cmd_args = &ctx->cmd_args;
- if (cmd_args->volfile_server) {
-// specfp = fetch_spec (ctx);
-
- if (specfp == NULL) {
- gf_log ("glusterfsd", GF_LOG_ERROR,
- "error while getting volume file from "
- "server %s", cmd_args->volfile_server);
- }
- else {
- gf_log ("glusterfsd", GF_LOG_DEBUG,
- "loading volume file from server %s",
- cmd_args->volfile_server);
- }
-
- return specfp;
- }
-
ret = sys_lstat (cmd_args->volfile, &statbuf);
if (ret == -1) {
gf_log ("glusterfsd", GF_LOG_ERROR,
@@ -848,7 +826,7 @@ logging_init (glusterfs_ctx_t *ctx)
int
-parse_cmdline (int argc, char *argv[], cmd_args_t *cmd_args)
+parse_cmdline (int argc, char *argv[], glusterfs_ctx_t *ctx)
{
int process_mode = 0;
int ret = 0;
@@ -859,6 +837,9 @@ parse_cmdline (int argc, char *argv[], cmd_args_t *cmd_args)
char tmp_logfile[1024] = { 0 };
char *tmp_logfile_dyn = NULL;
char *tmp_logfilebase = NULL;
+ cmd_args_t *cmd_args = NULL;
+
+ cmd_args = &ctx->cmd_args;
argp_parse (&argp, argc, argv, ARGP_IN_ORDER, NULL, cmd_args);
@@ -880,6 +861,12 @@ parse_cmdline (int argc, char *argv[], cmd_args_t *cmd_args)
cmd_args->volfile = gf_strdup (DEFAULT_CLIENT_VOLFILE);
}
+ if (cmd_args->volfile_server) {
+ ret = glusterfs_mgmt_init (ctx);
+ if (ret)
+ goto out;
+ }
+
if (cmd_args->run_id) {
ret = sys_lstat (cmd_args->log_file, &stbuf);
/* If its /dev/null, or /dev/stdout, /dev/stderr,
@@ -912,7 +899,8 @@ parse_cmdline (int argc, char *argv[], cmd_args_t *cmd_args)
}
}
- return 0;
+out:
+ return ret;
}
@@ -1162,33 +1150,27 @@ postfork:
int
-glusterfs_volumes_init (glusterfs_ctx_t *ctx)
+glusterfs_process_volfp (glusterfs_ctx_t *ctx, FILE *fp)
{
- FILE *fp = NULL;
glusterfs_graph_t *graph = NULL;
int ret = 0;
- fp = get_volfp (ctx);
+ graph = glusterfs_graph_construct (fp);
- if (!fp) {
- gf_log ("glusterfsd", GF_LOG_ERROR,
- "Cannot reach volume specification file");
+ if (!graph) {
ret = -1;
goto out;
}
- graph = glusterfs_graph_construct (fp);
+ ret = glusterfs_graph_prepare (graph, ctx);
- if (!graph) {
+ if (ret) {
+ glusterfs_graph_destroy (graph);
ret = -1;
goto out;
}
- ret = glusterfs_graph_prepare (graph, ctx);
- if (!ret)
- ret = create_fuse_mount (ctx);
- if (!ret)
- ret = glusterfs_graph_activate (graph, ctx);
+ ret = glusterfs_graph_activate (graph, ctx);
if (ret) {
glusterfs_graph_destroy (graph);
@@ -1199,7 +1181,36 @@ glusterfs_volumes_init (glusterfs_ctx_t *ctx)
out:
if (fp)
fclose (fp);
+ return ret;
+}
+
+
+int
+glusterfs_volumes_init (glusterfs_ctx_t *ctx)
+{
+ FILE *fp = NULL;
+ cmd_args_t *cmd_args = NULL;
+ int ret = 0;
+ cmd_args = &ctx->cmd_args;
+
+ if (cmd_args->volfile_server)
+ return 0;
+
+ fp = get_volfp (ctx);
+
+ if (!fp) {
+ gf_log ("glusterfsd", GF_LOG_ERROR,
+ "Cannot reach volume specification file");
+ ret = -1;
+ goto out;
+ }
+
+ ret = glusterfs_process_volfp (ctx, fp);
+ if (ret)
+ goto out;
+
+out:
return ret;
}
@@ -1222,7 +1233,7 @@ main (int argc, char *argv[])
if (ret)
goto out;
- ret = parse_cmdline (argc, argv, &ctx->cmd_args);
+ ret = parse_cmdline (argc, argv, ctx);
if (ret)
goto out;
@@ -1232,6 +1243,10 @@ main (int argc, char *argv[])
gf_proc_dump_init();
+ ret = create_fuse_mount (ctx);
+ if (ret)
+ goto out;
+
ret = daemonize (ctx);
if (ret)
goto out;