diff --git a/extras/glusterd.vol.in b/extras/glusterd.vol.in index 690dbe7..be5c829 100644 --- a/extras/glusterd.vol.in +++ b/extras/glusterd.vol.in @@ -5,6 +5,7 @@ volume management option transport.socket.keepalive-time 10 option transport.socket.keepalive-interval 2 option transport.socket.read-fail-log off + option transport.address-family inet6 option ping-timeout 30 # option base-port 49152 end-volume diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index fc4ae12..fac2c72 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -294,9 +294,6 @@ gf_resolve_ip6 (const char *hostname, memset(&hints, 0, sizeof(hints)); hints.ai_family = family; hints.ai_socktype = SOCK_STREAM; -#ifndef __NetBSD__ - hints.ai_flags = AI_ADDRCONFIG; -#endif ret = gf_asprintf (&port_str, "%d", port); if (-1 == ret) { @@ -2180,6 +2177,7 @@ valid_ipv6_address (char *address, int length, gf_boolean_t wildcard_acc) tmp = gf_strdup (address); + goto out; /* Check for compressed form */ if (length <= 0 || tmp[length - 1] == ':') { ret = 0; @@ -3101,9 +3099,18 @@ gf_is_local_addr (char *hostname) gf_boolean_t found = _gf_false; char *ip = NULL; xlator_t *this = NULL; + struct addrinfo hints; this = THIS; - ret = getaddrinfo (hostname, NULL, NULL, &result); + + memset (&hints, 0, sizeof (hints)); + /* + * Removing AI_ADDRCONFIG from default_hints + * for being able to use link local ipv6 addresses + */ + hints.ai_family = AF_UNSPEC; + hints.ai_flags = 0; + ret = getaddrinfo (hostname, NULL, &hints, &result); if (ret != 0) { gf_log (this->name, GF_LOG_ERROR, "error in getaddrinfo: %s\n", diff --git a/rpc/rpc-lib/src/rpc-transport.c b/rpc/rpc-lib/src/rpc-transport.c index 23fbf37..cb0dad3 100644 --- a/rpc/rpc-lib/src/rpc-transport.c +++ b/rpc/rpc-lib/src/rpc-transport.c @@ -689,12 +689,14 @@ rpc_transport_inet_options_build (dict_t **options, const char *hostname, "failed to set remote-port with %d", port); goto out; } +#if 0 ret = dict_set_str (dict, "transport.address-family", "inet"); if (ret) { gf_log (THIS->name, GF_LOG_WARNING, "failed to set addr-family with inet"); goto out; } +#endif ret = dict_set_str (dict, "transport-type", "socket"); if (ret) { diff --git a/rpc/rpc-transport/socket/src/name.c b/rpc/rpc-transport/socket/src/name.c index f731bab..ca82083 100644 --- a/rpc/rpc-transport/socket/src/name.c +++ b/rpc/rpc-transport/socket/src/name.c @@ -144,9 +144,9 @@ client_fill_address_family (rpc_transport_t *this, sa_family_t *sa_family) if (remote_host_data) { gf_log (this->name, GF_LOG_DEBUG, - "address-family not specified, guessing it " - "to be inet from (remote-host: %s)", data_to_str (remote_host_data)); - *sa_family = AF_INET; + "address-family not specified, marking it as unspec " + "for getaddrinfo to resolve from (remote-host: %s)", data_to_str (remote_host_data)); + *sa_family = AF_UNSPEC; } else { gf_log (this->name, GF_LOG_DEBUG, "address-family not specified, guessing it " @@ -390,7 +390,7 @@ af_inet_server_get_local_sockaddr (rpc_transport_t *this, memset (&hints, 0, sizeof (hints)); hints.ai_family = addr->sa_family; hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG; + hints.ai_flags = AI_PASSIVE; ret = getaddrinfo(listen_host, service, &hints, &res); if (ret != 0) { diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index 568ce61..9b2ee1a 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -2014,6 +2014,7 @@ brick_graph_add_server (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, char key[1024] = {0}; char *ssl_user = NULL; char *value = NULL; + char *address_family_data = NULL; if (!graph || !volinfo || !set_dict || !brickinfo) goto out; @@ -2041,6 +2042,16 @@ brick_graph_add_server (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, return -1; } + if (dict_get_str (volinfo->dict, "transport.address-family", + &address_family_data) == 0) { + ret = xlator_set_option (xl, "transport.address-family", address_family_data); + if (ret) { + gf_log ("glusterd", GF_LOG_WARNING, + "failed to set transport.address-family"); + return -1; + } + } + if (dict_get_str (set_dict, SSL_CERT_DEPTH_OPT, &value) == 0) { ret = xlator_set_option (xl, "ssl-cert-depth", value); if (ret) { @@ -2106,6 +2117,7 @@ brick_graph_add_pump (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, char *password = NULL; char *ptranst = NULL; char *value = NULL; + char *address_family_data = NULL; if (!graph || !volinfo || !set_dict) @@ -2168,6 +2180,16 @@ brick_graph_add_pump (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, GF_FREE (ptranst); if (ret) return -1; + + if (dict_get_str (volinfo->dict, "transport.address-family", + &address_family_data) == 0) { + ret = xlator_set_option (rbxl, "transport.address-family", address_family_data); + if (ret) { + gf_log ("glusterd", GF_LOG_WARNING, + "failed to set transport.address-family"); + return -1; + } + } xl = volgen_graph_add_nolink (graph, "cluster/pump", "%s-pump", volinfo->volname); @@ -2631,6 +2653,7 @@ volgen_graph_build_client (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, char *ssl_str = NULL; gf_boolean_t ssl_bool = _gf_false; char *value = NULL; + char *address_family_data = NULL; GF_ASSERT (graph); GF_ASSERT (subvol); @@ -2659,6 +2682,16 @@ volgen_graph_build_client (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, ret = xlator_set_option (xl, "transport-type", transt); if (ret) goto err; + + if (dict_get_str (volinfo->dict, "transport.address-family", + &address_family_data) == 0) { + ret = xlator_set_option (xl, "transport.address-family", address_family_data); + if (ret) { + gf_log ("glusterd", GF_LOG_WARNING, + "failed to set transport.address-family"); + goto err; + } + } ret = dict_get_uint32 (set_dict, "trusted-client", &client_type); diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c index 1d29d50..9030e27 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c @@ -264,6 +264,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; @@ -337,6 +338,17 @@ __glusterd_handle_create_volume (rpcsvc_request_t *req) gf_log (this->name, GF_LOG_ERROR, "%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; + } + } ret = dict_get_str (dict, "transport", &trans_type); if (ret) { @@ -1920,6 +1932,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); @@ -2171,6 +2184,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; diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c index 02d59ed..70b9cc5 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c @@ -1006,6 +1006,12 @@ struct volopt_map_entry glusterd_volopt_map[] = { .option = "!ssl-cipher-list", .op_version = GD_OP_VERSION_3_6_0, }, + { .key = "transport.address-family", + .voltype = "protocol", + .option = "!address-family", + .op_version = GD_OP_VERSION_3_6_0, + .type = NO_DOC, + }, /* Performance xlators enable/disbable options */ { .key = "performance.write-behind",