diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index 2adc893c131..a02810fbbee 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -1209,10 +1209,11 @@ static ssize_t sst_prepare_mysqldump (const char* addr_in, std::string wsrep_sst_prepare() { - const ssize_t ip_max= 256; + const ssize_t ip_max = 256; char ip_buf[ip_max]; - const char* addr_in= NULL; - const char* addr_out= NULL; + wsp::Address* addr_in_parser = NULL; + const char* addr_in = NULL; + const char* addr_out = NULL; const char* method; if (!strcmp(wsrep_sst_method, WSREP_SST_SKIP)) @@ -1227,31 +1228,37 @@ std::string wsrep_sst_prepare() if (wsrep_sst_receive_address && strcmp (wsrep_sst_receive_address, WSREP_SST_ADDRESS_AUTO)) { - addr_in= wsrep_sst_receive_address; + addr_in_parser = new wsp::Address(wsrep_sst_receive_address); + + if (!addr_in_parser->is_valid()) + { + WSREP_ERROR("Could not parse wsrep_sst_receive_address : %s", + wsrep_sst_receive_address); + throw wsrep::runtime_error("Failed to prepare for SST. Unrecoverable"); + } } //Attempt 2: wsrep_node_address else if (wsrep_node_address && strlen(wsrep_node_address)) { - wsp::Address addr(wsrep_node_address); + addr_in_parser = new wsp::Address(wsrep_node_address); - if (!addr.is_valid()) + if (!addr_in_parser->is_valid()) { WSREP_ERROR("Could not parse wsrep_node_address : %s", wsrep_node_address); throw wsrep::runtime_error("Failed to prepare for SST. Unrecoverable"); } - memcpy(ip_buf, addr.get_address(), addr.get_address_len()); - addr_in= ip_buf; } + // Attempt 3: Try to get the IP from the list of available interfaces. else { - ssize_t ret= wsrep_guess_ip (ip_buf, ip_max); + ssize_t ret=wsrep_guess_ip(ip_buf, ip_max); if (ret && ret < ip_max) { - addr_in= ip_buf; + addr_in_parser = new wsp::Address(ip_buf); } else { @@ -1261,6 +1268,25 @@ std::string wsrep_sst_prepare() } } + if(addr_in_parser && addr_in_parser->is_valid()){ + memset(ip_buf, 0, sizeof(ip_buf)); + size_t len = addr_in_parser->get_address_len(); + addr_in = ip_buf; + + if(addr_in_parser->is_ipv6()) + { + /* wsrep_sst_*.sh scripts requite ipv6 addreses to be in square breackets */ + memcpy(&ip_buf[1], addr_in_parser->get_address(), len); + ip_buf[0] = '['; + ip_buf[len + 1] = ']'; + } + else + { + memcpy(ip_buf, addr_in_parser->get_address(), len); + } + free(addr_in_parser); + } + ssize_t addr_len= -ENOSYS; method = wsrep_sst_method; if (!strcmp(method, WSREP_SST_MYSQLDUMP))