diff options
Diffstat (limited to 'glusterfsd/src')
-rw-r--r-- | glusterfsd/src/glusterfsd-mgmt.c | 48 | ||||
-rw-r--r-- | glusterfsd/src/glusterfsd.c | 37 |
2 files changed, 54 insertions, 31 deletions
diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c index 4c4d98dad3e..5d0c83fd1a6 100644 --- a/glusterfsd/src/glusterfsd-mgmt.c +++ b/glusterfsd/src/glusterfsd-mgmt.c @@ -1917,6 +1917,8 @@ mgmt_getspec_cbk (struct rpc_req *req, struct iovec *iov, int count, gf_volfile_t *volfile_obj = NULL; gf_volfile_t *volfile_tmp = NULL; char sha256_hash[SHA256_DIGEST_LENGTH] = {0, }; + dict_t *dict = NULL; + char *servers_list = NULL; frame = myframe; ctx = frame->this->ctx; @@ -1940,6 +1942,44 @@ mgmt_getspec_cbk (struct rpc_req *req, struct iovec *iov, int count, goto out; } + if (!rsp.xdata.xdata_len) { + goto volfile; + } + + dict = dict_new (); + if (!dict) { + ret = -1; + errno = ENOMEM; + goto out; + } + + ret = dict_unserialize (rsp.xdata.xdata_val, rsp.xdata.xdata_len, + &dict); + if (ret) { + gf_log (frame->this->name, GF_LOG_ERROR, + "failed to unserialize xdata to dictionary"); + goto out; + } + dict->extra_stdfree = rsp.xdata.xdata_val; + + /* glusterd2 only */ + ret = dict_get_str (dict, "servers-list", &servers_list); + if (ret) { + goto volfile; + } + + gf_log (frame->this->name, GF_LOG_INFO, + "Received list of available volfile servers: %s", + servers_list); + + ret = gf_process_getspec_servers_list(&ctx->cmd_args, servers_list); + if (ret) { + gf_log (frame->this->name, GF_LOG_ERROR, + "Failed (%s) to process servers list: %s", + strerror (errno), servers_list); + } + +volfile: ret = 0; size = rsp.op_ret; @@ -2058,6 +2098,9 @@ out: free (rsp.spec); + if (dict) + dict_unref (dict); + // Stop if server is running at an unsupported op-version if (ENOTSUP == ret) { gf_log ("mgmt", GF_LOG_ERROR, "Server is operating at an " @@ -2133,6 +2176,11 @@ glusterfs_volfile_fetch_one (glusterfs_ctx_t *ctx, char *volfile_id) goto out; } + /* Ask for a list of volfile (glusterd2 only) servers */ + if (GF_CLIENT_PROCESS == ctx->process_mode) { + req.flags = req.flags | GF_GETSPEC_FLAG_SERVERS_LIST; + } + if (cmd_args->brick_name) { ret = dict_set_dynstr_with_alloc (dict, "brick_name", cmd_args->brick_name); diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index 3bfd0f12384..dfaf9c09c6d 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -718,7 +718,6 @@ gf_remember_backup_volfile_server (char *arg) glusterfs_ctx_t *ctx = NULL; cmd_args_t *cmd_args = NULL; int ret = -1; - server_cmdline_t *server = NULL; ctx = glusterfsd_ctx; if (!ctx) @@ -728,39 +727,15 @@ gf_remember_backup_volfile_server (char *arg) if(!cmd_args) goto out; - server = GF_CALLOC (1, sizeof (server_cmdline_t), - gfd_mt_server_cmdline_t); - if (!server) - goto out; - - INIT_LIST_HEAD(&server->list); - - server->volfile_server = gf_strdup(arg); - - if (!cmd_args->volfile_server) { - cmd_args->volfile_server = server->volfile_server; - cmd_args->curr_server = server; - } - - if (!server->volfile_server) { - gf_msg ("glusterfsd", GF_LOG_WARNING, 0, glusterfsd_msg_10, - "xlator option %s is invalid", arg); - goto out; + ret = gf_set_volfile_server_common(cmd_args, arg, + GF_DEFAULT_VOLFILE_TRANSPORT, + GF_DEFAULT_BASE_PORT); + if (ret) { + gf_log ("glusterfs", GF_LOG_ERROR, + "failed to set volfile server: %s", strerror (errno)); } - - list_add_tail (&server->list, &cmd_args->volfile_servers); - - ret = 0; out: - if (ret == -1) { - if (server) { - GF_FREE (server->volfile_server); - GF_FREE (server); - } - } - return ret; - } static int |