Skip to content

Commit 641f964

Browse files
committed
WL#9266 Mysqlx IP version 6 conectivity
Support for binding X Plugin listen socket to IPv6 addresses, to allow X Protocol over IPv6 connections. Approved by Horst Hunger <[email protected]>
1 parent a91b3a8 commit 641f964

File tree

252 files changed

+4939
-2811
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

252 files changed

+4939
-2811
lines changed

mysql-test/collections/mysql-5.7-stage.push

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,5 @@ perl mysql-test-run.pl --timer --force --parallel=auto --comment=eits-tests-inn
4040
perl mysql-test-run.pl --timer --force --comment=memcached --vardir=var-memcached --experimental=collections/default.experimental --parallel=1 --retry=0 --suite=memcached --skip-test-list=collections/disabled-daily.list
4141
# test-sql-api-plugins
4242
perl mysql-test-run.pl --debug-server --timer --force --parallel=auto --comment=test_service_sql_api --vardir=var-test_service_sql_api --suite=test_service_sql_api --experimental=collections/default.experimental --skip-ndb
43-
43+
# test x plugin
44+
perl mysql-test-run.pl --debug-server --timer --force --parallel=auto --comment=x --vardir=var-x --suite=x --experimental=collections/default.experimental

mysql-test/collections/mysql-trunk-stage.push

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,5 @@ perl mysql-test-run.pl --timer --force --parallel=auto --comment=eits-tests-m
3838
perl mysql-test-run.pl --timer --force --parallel=auto --comment=eits-tests-innodb-engine --experimental=collections/default.experimental --vardir=var-stmt-eits-tests-innodb-engine --suite=engines/iuds,engines/funcs --max-test-fail=0 --retry-failure=0 --mysqld=--default-storage-engine=innodb --skip-test-list=collections/disabled-daily.list
3939
# Memcached tests
4040
perl mysql-test-run.pl --timer --force --comment=memcached --vardir=var-memcached --experimental=collections/default.experimental --parallel=1 --retry=0 --suite=memcached --skip-test-list=collections/disabled-daily.list
41+
# test x plugin
42+
perl mysql-test-run.pl --debug-server --timer --force --parallel=auto --comment=x --vardir=var-x --suite=x --experimental=collections/default.experimental

mysql-test/include/default_my.cnf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ disable-force-if-open
1818
[ENV]
1919
MASTER_MYPORT= @mysqld.1.port
2020
MASTER_MYSOCK= @mysqld.1.socket
21+
MASTER_X_MYPORT= @mysqld.1.loose-mysqlx-port
2122
MASTER_X_MYSOCK= @mysqld.1.loose-mysqlx-socket

rapid/plugin/x/mysqlxtest_src/mysqlx_connection.cc

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -86,25 +86,17 @@ Error Connection::connect_to_localhost(const std::string &named_pipe_or_unix_soc
8686
strncpy(addr.sun_path, named_pipe_or_unix_socket.c_str(), sizeof(addr.sun_path)-1);
8787
addr.sun_path[sizeof(addr.sun_path)-1] = 0;
8888

89-
return connect(&addr, sizeof(addr));
89+
return connect((sockaddr*)&addr, sizeof(addr));
9090
#else
9191
return Error(CR_SOCKET_CREATE_ERROR, "Named pipes aren't supported on current OS");
9292
#endif // defined(HAVE_SYS_UN_H)
9393
}
9494

95-
Error Connection::connect(sockaddr_un *addr, const std::size_t addr_size)
95+
Error Connection::connect(sockaddr *addr, const std::size_t addr_size)
9696
{
97-
#if defined(HAVE_SYS_UN_H)
98-
my_socket s = socket(AF_UNIX, SOCK_STREAM, 0);
99-
return connect(s, (sockaddr*)addr, addr_size);
100-
#else
101-
return Error(CR_SOCKET_CREATE_ERROR, "Unix socket aren't supported on current OS");
102-
#endif // defined(HAVE_SYS_UN_H)
103-
}
104-
105-
Error Connection::connect(sockaddr_in *addr, const std::size_t addr_size)
106-
{
107-
my_socket s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
97+
my_socket s = ::socket(addr->sa_family,
98+
SOCK_STREAM,
99+
addr->sa_family == AF_UNIX ? 0: IPPROTO_TCP);
108100

109101
return connect(s, (sockaddr*)addr, addr_size);
110102
}

rapid/plugin/x/mysqlxtest_src/mysqlx_connection.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ class Connection
7272
~Connection();
7373

7474
Error connect_to_localhost(const std::string &named_pipe_or_unix_socket);
75-
Error connect(sockaddr_in *sockaddr, const std::size_t addr_size);
76-
Error connect(sockaddr_un *sockaddr, const std::size_t addr_size);
75+
Error connect(sockaddr *sockaddr, const std::size_t addr_size);
7776
Error connect(my_socket s, sockaddr *sockaddr, const std::size_t addr_size);
7877

7978
Error activate_tls();

rapid/plugin/x/mysqlxtest_src/mysqlx_crud.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
* 02110-1301 USA
1818
*/
1919

20+
#include "ngs_common/string_formatter.h"
2021
#include "mysqlx_crud.h"
2122
#include "mysqlx_session.h"
2223
#include "mysqlx_protocol.h"
2324
#include "mysqlx_parser.h"
2425
#include "mysqlx_resultset.h"
2526

26-
#include <boost/algorithm/string.hpp>
2727

2828
#define CONTENT_TYPE_GEOMETRY 0x0001
2929
#define CONTENT_TYPE_JSON 0x0002
@@ -142,7 +142,7 @@ void Statement::insert_bound_values(::google::protobuf::RepeatedPtrField< ::Mysq
142142
// First validates that all the placeholders have a bound value
143143
std::string str_undefined;
144144
if (m_placeholders.size() && !m_bound_values.size())
145-
str_undefined = boost::algorithm::join(m_placeholders, ", ");
145+
str_undefined = ngs::join(m_placeholders, ", ");
146146
else
147147
{
148148
std::vector<std::string> undefined;
@@ -152,7 +152,7 @@ void Statement::insert_bound_values(::google::protobuf::RepeatedPtrField< ::Mysq
152152
undefined.push_back(m_placeholders[index]);
153153
}
154154

155-
str_undefined = boost::algorithm::join(undefined, ", ");
155+
str_undefined = ngs::join(undefined, ", ");
156156
}
157157

158158
// Throws the error if needed
@@ -1035,4 +1035,4 @@ InsertStatement::InsertStatement(ngs::shared_ptr<Table> table)
10351035
m_insert->set_data_model(Mysqlx::Crud::TABLE);
10361036
}
10371037

1038-
//--------------------------------------------------------------
1038+
//--------------------------------------------------------------

rapid/plugin/x/mysqlxtest_src/mysqlx_protocol.cc

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,12 +166,16 @@ static void throw_server_error(const Mysqlx::Error &error)
166166
}
167167

168168

169-
XProtocol::XProtocol(const Ssl_config &ssl_config, const std::size_t timeout, const bool dont_wait_for_disconnect)
169+
XProtocol::XProtocol(const Ssl_config &ssl_config,
170+
const std::size_t timeout,
171+
const bool dont_wait_for_disconnect,
172+
const Internet_protocol ip_mode)
170173
: m_sync_connection(ssl_config.key, ssl_config.ca, ssl_config.ca_path,
171174
ssl_config.cert, ssl_config.cipher, ssl_config.tls_version, timeout),
172175
m_client_id(0),
173176
m_trace_packets(false), m_closed(true),
174-
m_dont_wait_for_disconnect(dont_wait_for_disconnect)
177+
m_dont_wait_for_disconnect(dont_wait_for_disconnect),
178+
m_ip_mode(ip_mode)
175179
{
176180
if (getenv("MYSQLX_TRACE_CONNECTION"))
177181
m_trace_packets = true;
@@ -225,15 +229,20 @@ void XProtocol::connect(const std::string &host, int port)
225229
memset(&hints, 0, sizeof(hints));
226230
hints.ai_socktype= SOCK_STREAM;
227231
hints.ai_protocol= IPPROTO_TCP;
228-
hints.ai_family= AF_INET;
232+
hints.ai_family= AF_UNSPEC;
233+
234+
if (IPv6 == m_ip_mode)
235+
hints.ai_family = AF_INET6;
236+
else if (IPv4 == m_ip_mode)
237+
hints.ai_family = AF_INET;
229238

230239
gai_errno= getaddrinfo(host.c_str(), port_buf, &hints, &res_lst);
231240
if (gai_errno != 0)
232241
throw Error(CR_UNKNOWN_HOST, "No such host is known '" + host + "'");
233242

234243
for (t_res= res_lst; t_res; t_res= t_res->ai_next)
235244
{
236-
error = m_sync_connection.connect((sockaddr_in*)t_res->ai_addr, t_res->ai_addrlen);
245+
error = m_sync_connection.connect((sockaddr*)t_res->ai_addr, t_res->ai_addrlen);
237246

238247
if (!error)
239248
break;

rapid/plugin/x/mysqlxtest_src/mysqlx_protocol.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,17 @@ namespace mysqlx
216216
const char *tls_version;
217217
};
218218

219+
enum Internet_protocol
220+
{
221+
IP_any = 0,
222+
IPv4,
223+
IPv6,
224+
};
225+
219226
class MYSQLXTEST_PUBLIC XProtocol : public ngs::enable_shared_from_this<XProtocol>
220227
{
221228
public:
222-
XProtocol(const Ssl_config &ssl_config, const std::size_t timeout, const bool dont_wait_for_disconnect = true);
229+
XProtocol(const Ssl_config &ssl_config, const std::size_t timeout, const bool dont_wait_for_disconnect = true, const Internet_protocol ip_mode = IPv4);
223230
~XProtocol();
224231

225232
uint64_t client_id() const { return m_client_id; }
@@ -304,6 +311,7 @@ namespace mysqlx
304311
bool m_trace_packets;
305312
bool m_closed;
306313
const bool m_dont_wait_for_disconnect;
314+
const Internet_protocol m_ip_mode;
307315
ngs::shared_ptr<Result> m_last_result;
308316
};
309317

0 commit comments

Comments
 (0)