Skip to content

Commit 93fe0a0

Browse files
committed
WL#15524 Patch #2 TLS-safe upgrade of mgm socket to transporter
This changes TransporterRegistry::connect_ndb_mgmd() to return NdbSocket rather than ndb_socket_t. It extends the StartTls test in testMgmd to test upgrading the TLS MGM protocol socket to a transporter. Change-Id: Ic3b9ccf39ec78ed25705a4bbbdc5ac2953a35611
1 parent 4ba9baa commit 93fe0a0

File tree

11 files changed

+58
-51
lines changed

11 files changed

+58
-51
lines changed

storage/ndb/include/transporter/TransporterRegistry.hpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -262,26 +262,20 @@ class TransporterRegistry
262262
bool& close_with_reset,
263263
bool& log_failure);
264264

265-
bool connect_server(ndb_socket_t sockfd, BaseString & msg,
266-
bool & close_with_reset, bool & log_failure) {
267-
NdbSocket sock(sockfd, NdbSocket::From::Existing);
268-
return connect_server(sock, msg, close_with_reset, log_failure);
269-
}
270-
271265
bool connect_client(NdbMgmHandle *h);
272266

273267
/**
274268
* Given a hostname and port, creates a NdbMgmHandle, turns it into
275269
* a transporter, and returns the socket.
276270
*/
277-
ndb_socket_t connect_ndb_mgmd(const char* server_name,
278-
unsigned short server_port);
271+
NdbSocket connect_ndb_mgmd(const char* server_name,
272+
unsigned short server_port);
279273

280274
/**
281275
* Given a connected NdbMgmHandle, turns it into a transporter
282276
* and returns the socket.
283277
*/
284-
ndb_socket_t connect_ndb_mgmd(NdbMgmHandle *h);
278+
NdbSocket connect_ndb_mgmd(NdbMgmHandle *h);
285279

286280
/**
287281
* Manage allTransporters and theNodeIdTransporters when using

storage/ndb/src/common/transporter/Transporter.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -277,11 +277,20 @@ tls_error(int code)
277277
g_eventLogger->error("TLS error %d '%s'", code, TlsKeyError::message(code));
278278
}
279279

280+
bool
281+
Transporter::connect_client_mgm(int port)
282+
{
283+
require(!isPartOfMultiTransporter());
284+
NdbSocket secureSocket =
285+
m_transporter_registry.connect_ndb_mgmd(remoteHostName, port);
286+
return connect_client(secureSocket);
287+
}
288+
289+
280290
bool
281291
Transporter::connect_client()
282292
{
283293
NdbSocket secureSocket;
284-
ndb_socket_t sockfd;
285294
DBUG_ENTER("Transporter::connect_client");
286295

287296
require(!isMultiTransporter());
@@ -302,9 +311,7 @@ Transporter::connect_client()
302311

303312
if(isMgmConnection)
304313
{
305-
require(!isPartOfMultiTransporter());
306-
sockfd= m_transporter_registry.connect_ndb_mgmd(remoteHostName, port);
307-
secureSocket.init_from_new(sockfd);
314+
return connect_client_mgm(port);
308315
}
309316
else
310317
{

storage/ndb/src/common/transporter/Transporter.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ class Transporter {
133133
NdbSocket socket(fd, NdbSocket::From::Existing);
134134
return connect_client(socket);
135135
}
136+
bool connect_client_mgm(int);
136137
bool connect_server(NdbSocket & socket, BaseString& errormsg);
137138

138139
/**

storage/ndb/src/common/transporter/TransporterRegistry.cpp

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3784,7 +3784,8 @@ bool TransporterRegistry::connect_client(NdbMgmHandle *h)
37843784
}
37853785
require(!t->isMultiTransporter());
37863786
require(!t->isPartOfMultiTransporter());
3787-
bool res = t->connect_client(connect_ndb_mgmd(h));
3787+
NdbSocket secureSocket = connect_ndb_mgmd(h);
3788+
bool res = t->connect_client(secureSocket);
37883789
if (res == true)
37893790
{
37903791
DEBUG_FPRINTF((stderr, "(%u)performStates[%u] = DISCONNECTING,"
@@ -3836,55 +3837,53 @@ bool TransporterRegistry::report_dynamic_ports(NdbMgmHandle h) const
38363837
* Given a connected NdbMgmHandle, turns it into a transporter
38373838
* and returns the socket.
38383839
*/
3839-
ndb_socket_t TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle *h)
3840+
NdbSocket TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle *h)
38403841
{
3841-
ndb_socket_t sockfd;
3842-
38433842
DBUG_ENTER("TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle)");
38443843

38453844
if ( h==nullptr || *h == nullptr )
38463845
{
38473846
g_eventLogger->error("Mgm handle is NULL (%s:%d)", __FILE__, __LINE__);
3848-
DBUG_RETURN(sockfd);
3847+
DBUG_RETURN(NdbSocket()); // an invalid socket, newly created on the stack
38493848
}
38503849

38513850
if (!report_dynamic_ports(*h))
38523851
{
38533852
ndb_mgm_destroy_handle(h);
3854-
DBUG_RETURN(sockfd);
3853+
DBUG_RETURN(NdbSocket()); // an invalid socket, newly created on the stack
38553854
}
38563855

38573856
/**
38583857
* convert_to_transporter also disposes of the handle (i.e. we don't leak
3859-
* memory here.
3858+
* memory here).
38603859
*/
38613860
DBUG_PRINT("info", ("Converting handle to transporter"));
3862-
sockfd= ndb_mgm_convert_to_transporter(h);
3863-
if (!ndb_socket_valid(sockfd))
3861+
NdbSocket socket;
3862+
ndb_mgm_convert_to_transporter(h, &socket);
3863+
if (! socket.is_valid())
38643864
{
38653865
g_eventLogger->error("Failed to convert to transporter (%s: %d)",
38663866
__FILE__, __LINE__);
38673867
ndb_mgm_destroy_handle(h);
38683868
}
3869-
DBUG_RETURN(sockfd);
3869+
DBUG_RETURN(NdbSocket::copy(socket));
38703870
}
38713871

38723872
/**
38733873
* Given a SocketClient, creates a NdbMgmHandle, turns it into a transporter
38743874
* and returns the socket.
38753875
*/
3876-
ndb_socket_t
3876+
NdbSocket
38773877
TransporterRegistry::connect_ndb_mgmd(const char* server_name,
38783878
unsigned short server_port)
38793879
{
38803880
NdbMgmHandle h= ndb_mgm_create_handle();
3881-
ndb_socket_t s;
38823881

38833882
DBUG_ENTER("TransporterRegistry::connect_ndb_mgmd(SocketClient)");
38843883

38853884
if ( h == nullptr )
38863885
{
3887-
DBUG_RETURN(s);
3886+
DBUG_RETURN(NdbSocket());
38883887
}
38893888

38903889
/**
@@ -3900,7 +3899,7 @@ TransporterRegistry::connect_ndb_mgmd(const char* server_name,
39003899
{
39013900
DBUG_PRINT("info", ("connection to mgmd failed"));
39023901
ndb_mgm_destroy_handle(&h);
3903-
DBUG_RETURN(s);
3902+
DBUG_RETURN(NdbSocket());
39043903
}
39053904

39063905
DBUG_RETURN(connect_ndb_mgmd(&h));

storage/ndb/src/mgmapi/mgmapi.cpp

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3743,36 +3743,28 @@ ndb_mgm_get_connection_int_parameter(NdbMgmHandle handle,
37433743
DBUG_RETURN(res);
37443744
}
37453745

3746-
ndb_socket_t
3747-
ndb_mgm_convert_to_transporter(NdbMgmHandle *handle)
3746+
void
3747+
ndb_mgm_convert_to_transporter(NdbMgmHandle *handle, NdbSocket *s)
37483748
{
3749-
DBUG_ENTER("ndb_mgm_convert_to_transporter");
3750-
ndb_socket_t s;
3751-
37523749
if(handle == nullptr)
37533750
{
37543751
SET_ERROR(*handle, NDB_MGM_ILLEGAL_SERVER_HANDLE, "");
3755-
ndb_socket_invalidate(&s);
3756-
DBUG_RETURN(s);
3752+
return;
37573753
}
37583754

37593755
if ((*handle)->connected != 1)
37603756
{
37613757
SET_ERROR(*handle, NDB_MGM_SERVER_NOT_CONNECTED , "");
3762-
ndb_socket_invalidate(&s);
3763-
DBUG_RETURN(s);
3758+
return;
37643759
}
37653760

3766-
(*handle)->connected= 0; // we pretend we're disconnected
3767-
s= (*handle)->socket.ndb_socket();
3768-
3769-
SocketOutputStream s_output(s, (*handle)->timeout);
3761+
NdbSocket::transfer(*s, (*handle)->socket);
3762+
SecureSocketOutputStream s_output(*s, (*handle)->timeout);
37703763
s_output.println("transporter connect");
37713764
s_output.println("%s", "");
37723765

3766+
(*handle)->connected= 0; // The handle no longer owns the connection
37733767
ndb_mgm_destroy_handle(handle); // set connected=0, so won't disconnect
3774-
3775-
DBUG_RETURN(s);
37763768
}
37773769

37783770
extern "C"

storage/ndb/src/mgmapi/mgmapi_internal.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,12 @@ int ndb_mgm_get_connection_int_parameter(NdbMgmHandle handle,
8585
/**
8686
* Convert connection to transporter
8787
* @param handle NDB management handle.
88-
*
89-
* @return socket
88+
* @param s Transporter socket.
9089
*
9190
* @note the socket is now able to be used as a transporter connection
91+
* @note the management handle is no longer valid after this call
9292
*/
93-
ndb_socket_t ndb_mgm_convert_to_transporter(NdbMgmHandle *handle);
93+
void ndb_mgm_convert_to_transporter(NdbMgmHandle *handle, class NdbSocket * s);
9494

9595
int ndb_mgm_disconnect_quiet(NdbMgmHandle handle);
9696

storage/ndb/src/mgmsrv/MgmtSrvr.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5121,14 +5121,14 @@ MgmtSrvr::getConnectionDbParameter(int node1, int node2,
51215121

51225122

51235123
bool
5124-
MgmtSrvr::transporter_connect(ndb_socket_t sockfd,
5124+
MgmtSrvr::transporter_connect(NdbSocket & socket,
51255125
BaseString& msg,
51265126
bool& close_with_reset,
51275127
bool& log_failure)
51285128
{
51295129
DBUG_ENTER("MgmtSrvr::transporter_connect");
51305130
TransporterRegistry* tr= theFacade->get_registry();
5131-
if (!tr->connect_server(sockfd, msg, close_with_reset, log_failure))
5131+
if (!tr->connect_server(socket, msg, close_with_reset, log_failure))
51325132
DBUG_RETURN(false);
51335133

51345134
/**

storage/ndb/src/mgmsrv/MgmtSrvr.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ class MgmtSrvr : private ConfigSubscriber, public trp_client {
359359
int getConnectionDbParameter(int node1, int node2, int param,
360360
int *value, BaseString& msg);
361361

362-
bool transporter_connect(ndb_socket_t sockfd,
362+
bool transporter_connect(NdbSocket & socket,
363363
BaseString& errormsg,
364364
bool& close_with_reset,
365365
bool& log_failure);

storage/ndb/src/mgmsrv/Services.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1930,8 +1930,8 @@ MgmApiSession::transporter_connect(Parser_t::Context &ctx,
19301930
bool close_with_reset = true;
19311931
bool log_failure = false;
19321932
BaseString errormsg;
1933-
if (!m_mgmsrv.transporter_connect(m_secure_socket.ndb_socket(), errormsg,
1934-
close_with_reset, log_failure))
1933+
if (!m_mgmsrv.transporter_connect(m_secure_socket,
1934+
errormsg, close_with_reset, log_failure))
19351935
{
19361936
// Connection not allowed or failed
19371937
if (log_failure)
@@ -1953,7 +1953,7 @@ MgmApiSession::transporter_connect(Parser_t::Context &ctx,
19531953
but don't close the socket, it's been taken over
19541954
by the transporter
19551955
*/
1956-
m_secure_socket.invalidate(); // so nobody closes it
1956+
NdbSocket s = NdbSocket::transfer(m_secure_socket);
19571957
}
19581958

19591959
m_stop= true; // Stop the session

storage/ndb/test/include/NdbMgmd.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ class NdbMgmd {
104104
return m_handle;
105105
}
106106

107+
void convert_to_transporter(NdbSocket * s) {
108+
ndb_mgm_convert_to_transporter(& m_handle, s);
109+
}
110+
107111
ndb_socket_t socket(void) const {
108112
return _ndb_mgm_get_socket(m_handle);
109113
}

storage/ndb/test/ndbapi/testMgmd.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,10 @@ class Mgmd
342342

343343
NdbMgmHandle handle() { return m_mgmd_client.handle(); }
344344

345+
void convert_to_transporter(NdbSocket * sock) {
346+
m_mgmd_client.convert_to_transporter(sock);
347+
}
348+
345349
private:
346350

347351
bool get_section_string(const Properties& config,
@@ -2024,6 +2028,7 @@ runTestNdbdWithCert(NDBT_Context* ctx, NDBT_Step* step)
20242028
CHECK(ndbd.wait_started(handle));
20252029

20262030
CHECK(mgmd.stop());
2031+
CHECK(ndbd.stop());
20272032
return NDBT_OK;
20282033
}
20292034

@@ -2082,6 +2087,11 @@ int runTestStartTls(NDBT_Context* ctx, NDBT_Step* step)
20822087
struct ndb_mgm_cluster_state *state = ndb_mgm_get_status(mgmd.handle());
20832088
CHECK(state != nullptr);
20842089

2090+
/* Now convert the socket to a transporter */
2091+
NdbSocket s;
2092+
mgmd.convert_to_transporter(&s);
2093+
CHECK(s.is_valid());
2094+
20852095
return NDBT_OK;
20862096
}
20872097

0 commit comments

Comments
 (0)