diff options
Diffstat (limited to 'api/src/glfs-mgmt.c')
| -rw-r--r-- | api/src/glfs-mgmt.c | 49 | 
1 files changed, 47 insertions, 2 deletions
diff --git a/api/src/glfs-mgmt.c b/api/src/glfs-mgmt.c index ac306e40027..f709b54d49e 100644 --- a/api/src/glfs-mgmt.c +++ b/api/src/glfs-mgmt.c @@ -580,6 +580,8 @@ glfs_mgmt_getspec_cbk (struct rpc_req *req, struct iovec *iov, int count,  	FILE			*tmpfp = NULL;  	int			 need_retry = 0;  	struct glfs		*fs = NULL; +        dict_t                  *dict = NULL; +        char                    *servers_list = NULL;  	frame = myframe;  	ctx = frame->this->ctx; @@ -617,6 +619,44 @@ glfs_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; @@ -676,8 +716,8 @@ out:  	if (rsp.spec)  		free (rsp.spec); -        if (rsp.xdata.xdata_val) -                free (rsp.xdata.xdata_val); +        if (dict) +                dict_unref (dict);  	// Stop if server is running at an unsupported op-version  	if (ENOTSUP == ret) { @@ -752,6 +792,11 @@ glfs_volfile_fetch (struct glfs *fs)                  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; +        } +          ret = dict_allocate_and_serialize (dict, &req.xdata.xdata_val,                                             &req.xdata.xdata_len);          if (ret < 0) {  | 
