diff options
author | Nithin D <nithind1988@yahoo.in> | 2016-02-28 21:45:48 +0530 |
---|---|---|
committer | Atin Mukherjee <amukherj@redhat.com> | 2016-03-21 10:52:50 -0700 |
commit | b33f3c95ec9c8112e6677e09cea05c4c462040d0 (patch) | |
tree | 969d994858a49fc3d2fa32ff68b5e71909045918 /xlators/mgmt/glusterd/src/glusterd-volume-ops.c | |
parent | 3e5445ae7d1dbbcc138374b6d2e5f95ffc556f4b (diff) |
glusterd: Bug fixes for IPv6 support
Backport of http://review.gluster.org/#/c/11988/
Problem:
Glusterd not working using ipv6 transport. The idea is with proper glusterd.vol configuration,
1. glusterd needs to listen on default port (240007) as IPv6 TCP listner.
2. Volume creation/deletion/mounting/add-bricks/delete-bricks/peer-probe
needs to work using ipv6 addresses.
3. Bricks needs to listen on ipv6 addresses.
All the above functionality is needed to say that glusterd supports ipv6 transport and this is broken.
Fix:
When "option transport.address-family inet6" option is present in glusterd.vol
file, it is made sure that glusterd creates listeners using ipv6 sockets only and also the same information is saved
inside brick volume files used by glusterfsd brick process when they are starting.
Tests Run:
Regression tests using ./run-tests.sh
IPv4: Regression tests using ./run-tests.sh for release-3.7 branch verified by comparing with clean repo.
IPv6: (Need to add the above mentioned config and also add an entry for "hostname ::1" in /etc/hosts)
Started failing at ./tests/basic/glusterd/arbiter-volume-probe.t and ran successfully till here
Change-Id: Idd7513aa2347ce0de2b1f68daeecce1b7a39a7af
BUG: 1310445
Signed-off-by: Nithin D <nithind1988@yahoo.in>
Reviewed-on: http://review.gluster.org/13787
Smoke: Gluster Build System <jenkins@build.gluster.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-volume-ops.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-ops.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c index 8fd24f943ba..1c354493244 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c @@ -285,6 +285,7 @@ __glusterd_handle_create_volume (rpcsvc_request_t *req) xlator_t *this = NULL; char *free_ptr = NULL; char *trans_type = NULL; + char *address_family_str = NULL; uuid_t volume_id = {0,}; uuid_t tmp_uuid = {0}; int32_t type = 0; @@ -365,6 +366,8 @@ __glusterd_handle_create_volume (rpcsvc_request_t *req) goto out; } + + ret = dict_get_str (dict, "transport", &trans_type); if (ret) { snprintf (err_str, sizeof (err_str), "Unable to get " @@ -373,6 +376,30 @@ __glusterd_handle_create_volume (rpcsvc_request_t *req) GD_MSG_DICT_GET_FAILED, "%s", err_str); goto out; } + + ret = dict_get_str (this->options, "transport.address-family", + &address_family_str); + + if (!ret) { + ret = dict_set_dynstr_with_alloc (dict, + "transport.address-family", + address_family_str); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "failed to set transport.address-family"); + goto out; + } + } else if (!strcmp(trans_type, "tcp")) { + /* Setting default as inet for trans_type tcp */ + ret = dict_set_dynstr_with_alloc (dict, + "transport.address-family", + "inet"); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "failed to set transport.address-family"); + goto out; + } + } ret = dict_get_str (dict, "bricks", &bricks); if (ret) { snprintf (err_str, sizeof (err_str), "Unable to get bricks for " @@ -2089,6 +2116,7 @@ glusterd_op_create_volume (dict_t *dict, char **op_errstr) char msg[1024] __attribute__((unused)) = {0, }; char *brick_mount_dir = NULL; char key[PATH_MAX] = ""; + char *address_family_str = NULL; this = THIS; GF_ASSERT (this); @@ -2361,6 +2389,20 @@ glusterd_op_create_volume (dict_t *dict, char **op_errstr) goto out; } + ret = dict_get_str (dict, "transport.address-family", + &address_family_str); + + if (!ret) { + ret = dict_set_dynstr_with_alloc(volinfo->dict, + "transport.address-family", address_family_str); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "Failed to set transport.address-family for %s", + volinfo->volname); + goto out; + } + } + gd_update_volume_op_versions (volinfo); volinfo->caps = caps; |