diff options
author | Prashanth Pai <ppai@redhat.com> | 2018-02-09 09:27:03 +0530 |
---|---|---|
committer | Amar Tumballi <amarts@redhat.com> | 2018-02-16 16:16:25 +0000 |
commit | 664b946496368f625b5a15646b5aa791078055ef (patch) | |
tree | 0a574ce8ed3fee1b6d4fa6811def116ac8d170f6 /libglusterfs | |
parent | b313d97faa766443a7f8128b6e19f3d2f1b267dd (diff) |
Fetch backup volfile servers from glusterd2
Clients will request for a list of volfile servers from glusterd2 by
setting a (optional) flag in GETSPEC RPC call. glusterd2 will check for
the presence of this flag and accordingly return a list of glusterd2
servers in GETSPEC RPC reply. Currently, this list of servers returned
only contains servers which have bricks belonging to the volume.
See:
https://github.com/gluster/glusterd2/issues/382
https://github.com/gluster/glusterfs/issues/351
Updates #351
Change-Id: I0eee3d0bf25a87627e562380ef73063926a16b81
Signed-off-by: Prashanth Pai <ppai@redhat.com>
Diffstat (limited to 'libglusterfs')
-rw-r--r-- | libglusterfs/src/common-utils.c | 130 | ||||
-rw-r--r-- | libglusterfs/src/common-utils.h | 5 | ||||
-rw-r--r-- | libglusterfs/src/libglusterfs.sym | 2 | ||||
-rw-r--r-- | libglusterfs/src/mem-types.h | 1 |
4 files changed, 138 insertions, 0 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index 5345924a41d..66461e3d440 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -3577,6 +3577,136 @@ out: } +/* + * Processes list of volfile servers. + * Format: <host1>:<port1> <host2>:<port2>... + */ +int +gf_process_getspec_servers_list(cmd_args_t *cmd_args, + const char *servers_list) { + char *tmp = NULL; + char *address = NULL; + char *host = NULL; + char *last_colon = NULL; + char *save_ptr = NULL; + int port = 0; + int ret = -1; + + tmp = gf_strdup (servers_list); + if (!tmp) { + errno = ENOMEM; + goto out; + } + + address = strtok_r (tmp, " ", &save_ptr); + if (!address) { + errno = EINVAL; + goto out; + } + + while (1) { + last_colon = strrchr (address, ':'); + if (!last_colon) { + errno = EINVAL; + ret = -1; + break; + } + *last_colon = '\0'; + host = address; + port = atoi (last_colon + 1); + if (port <= 0) { + errno = EINVAL; + ret = -1; + break; + } + ret = gf_set_volfile_server_common ( + cmd_args, host, GF_DEFAULT_VOLFILE_TRANSPORT, port); + if (ret && errno != EEXIST) { + break; + } + address = strtok_r (NULL, " ", &save_ptr); + if (!address) { + errno = 0; + ret = 0; + break; + } + } + +out: + if (tmp) { + GF_FREE (tmp); + } + + return ret; +} + +int +gf_set_volfile_server_common (cmd_args_t *cmd_args, const char *host, + const char *transport, int port) +{ + server_cmdline_t *server = NULL; + server_cmdline_t *tmp = NULL; + int ret = -1; + + GF_VALIDATE_OR_GOTO (THIS->name, cmd_args, out); + GF_VALIDATE_OR_GOTO (THIS->name, host, out); + GF_VALIDATE_OR_GOTO (THIS->name, transport, out); + + server = GF_CALLOC (1, sizeof (server_cmdline_t), + gf_common_mt_server_cmdline_t); + if (!server) { + errno = ENOMEM; + goto out; + } + + INIT_LIST_HEAD (&server->list); + + server->volfile_server = gf_strdup (host); + if (!server->volfile_server) { + errno = ENOMEM; + goto out; + } + + server->transport = gf_strdup (transport); + if (!server->transport) { + errno = ENOMEM; + goto out; + } + + server->port = port; + + if (!cmd_args->volfile_server) { + cmd_args->volfile_server = server->volfile_server; + cmd_args->volfile_server_transport = server->transport; + cmd_args->volfile_server_port = server->port; + cmd_args->curr_server = server; + } + + list_for_each_entry(tmp, &cmd_args->volfile_servers, list) { + if ((!strcmp(tmp->volfile_server, server->volfile_server) && + !strcmp(tmp->transport, server->transport) && + (tmp->port == server->port))) { + errno = EEXIST; + ret = -1; + goto out; + } + } + + list_add_tail (&server->list, &cmd_args->volfile_servers); + + ret = 0; +out: + if (-1 == ret) { + if (server) { + GF_FREE (server->volfile_server); + GF_FREE (server->transport); + GF_FREE (server); + } + } + + return ret; +} + /* Sets log file path from user provided arguments */ int gf_set_log_file_path (cmd_args_t *cmd_args, glusterfs_ctx_t *ctx) diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h index c7f9fd58cc8..1cf517738c4 100644 --- a/libglusterfs/src/common-utils.h +++ b/libglusterfs/src/common-utils.h @@ -246,6 +246,11 @@ void gf_print_trace (int32_t signal, glusterfs_ctx_t *ctx); int gf_set_log_file_path (cmd_args_t *cmd_args, glusterfs_ctx_t *ctx); int gf_set_log_ident (cmd_args_t *cmd_args); +int gf_process_getspec_servers_list(cmd_args_t *cmd_args, + const char *servers_list); +int gf_set_volfile_server_common (cmd_args_t *cmd_args, const char *host, + const char *transport, int port); + static inline void BIT_SET (unsigned char *array, unsigned int index) { diff --git a/libglusterfs/src/libglusterfs.sym b/libglusterfs/src/libglusterfs.sym index 39f03cbfa44..fa1e54d3663 100644 --- a/libglusterfs/src/libglusterfs.sym +++ b/libglusterfs/src/libglusterfs.sym @@ -632,6 +632,7 @@ gf_proc_dump_xlator_history gf_proc_dump_xlator_meminfo gf_proc_dump_xlator_private gf_proc_dump_xlator_profile +gf_process_getspec_servers_list gf_process_reserved_ports __gf_realloc _gf_ref_get @@ -646,6 +647,7 @@ gf_rsync_weak_checksum gf_set_log_file_path gf_set_log_ident gf_set_timestamp +gf_set_volfile_server_common _gf_smsg gf_sock_union_equal_addr gf_store_handle_create_on_absence diff --git a/libglusterfs/src/mem-types.h b/libglusterfs/src/mem-types.h index 64d0e90e1bd..85c06e9cbe5 100644 --- a/libglusterfs/src/mem-types.h +++ b/libglusterfs/src/mem-types.h @@ -176,6 +176,7 @@ enum gf_common_mem_types_ { gf_common_ping_local_t, gf_common_volfile_t, gf_common_mt_mgmt_v3_lock_timer_t, + gf_common_mt_server_cmdline_t, gf_common_mt_end }; #endif |