Skip to content

Commit 154186c

Browse files
zmurjdduncan
authored andcommitted
Bug#35703454 NdbSocket refactoring - move close calls [NOCLOSE]
In preparation for next patch that pass NdbSocket either by const reference (const NdbSocket&) for temporary use or rvalue reference (NdbSocket&&) for transfer ownership, calls to close must move since only owner may call close (or any other non const method). Calls to NdbSocket::close are moved from caller to callee for functions that takes ownership using NdbSocket&& since the caller must not use the moved socket after call. And since callee will to the close there is no need to pass back close with reset flag to caller and that is removed from transporter_connect and connect_server methods. Calls to NdbSocket::close are moved from callee to caller for functions that are changed to "borrow" socket using const NdbSocket& since callee can not call non const methods. To keep the semantics of the function making the socket unusable on failure a new method NdbSocket::shutdown is introduced that only stop further communication on socket but still leave socket open (until caller calls close). Change-Id: I9666ba76e03e268406677c1e32d76d7d219e9a56
1 parent 1292677 commit 154186c

File tree

12 files changed

+60
-41
lines changed

12 files changed

+60
-41
lines changed

storage/ndb/include/portlib/ndb_socket_posix.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,12 @@ int ndb_socket_configure_reuseaddr(ndb_socket_t s, int enable)
7878
return ndb_socket_reuseaddr(s, enable);
7979
}
8080

81+
static inline
82+
int ndb_socket_shutdown_both(ndb_socket_t s)
83+
{
84+
return shutdown(s.s, SHUT_RDWR);
85+
}
86+
8187
static inline
8288
int ndb_socket_close(ndb_socket_t s)
8389
{

storage/ndb/include/portlib/ndb_socket_win32.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ int ndb_socket_configure_reuseaddr(ndb_socket_t s, int enable)
8383
return ndb_setsockopt(s, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, &on);
8484
}
8585

86+
static inline
87+
int ndb_socket_shutdown_both(ndb_socket_t s)
88+
{
89+
return shutdown(s.s, SD_BOTH);
90+
}
91+
8692
static inline
8793
int ndb_socket_close(ndb_socket_t s)
8894
{

storage/ndb/include/transporter/TransporterRegistry.hpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -249,16 +249,12 @@ class TransporterRegistry
249249
@param sockfd the socket to handshake
250250
@param msg error message describing why handshake failed,
251251
to be filled in when function return
252-
@param close_with_reset allows the function to indicate to the caller
253-
how the socket should be closed when function
254-
returns false
255252
@param log_failure whether a failure to connect is log-worthy
256253
257254
@returns false on failure and true on success
258255
*/
259256
bool connect_server(NdbSocket & sockfd,
260257
BaseString& msg,
261-
bool& close_with_reset,
262258
bool& log_failure);
263259

264260
bool connect_client(NdbMgmHandle *h);

storage/ndb/include/util/NdbSocket.h

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ class NdbSocket {
134134
and SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER.
135135
See SSL_set_mode(3) for reference on flags.
136136
*/
137-
int set_nonblocking(int on);
137+
int set_nonblocking(int on) const;
138138

139139
/* ndb_socket.h */
140140
ssize_t recv(char * buf, size_t len, int peek = 0) const;
@@ -156,9 +156,10 @@ class NdbSocket {
156156
int readln(int timeout, int *time, char *buf, int len, NdbMutex *) const;
157157
int write(int timeout, int *, const char * buf, int len) const;
158158

159+
int shutdown() const;
159160
/* For SSL sockets, close() removes the SSL from the SSL Socket Table */
160161
int close();
161-
void close_with_reset(bool with_reset);
162+
void close_with_reset();
162163

163164
/* ndb_socket_poller.h */
164165
uint add_readable(ndb_socket_poller *) const;
@@ -179,6 +180,7 @@ class NdbSocket {
179180
int ssl_readln(int timeout, int *, char * buf, int len, NdbMutex *) const;
180181
int ssl_write(int timeout, int *, const char * buf, int len) const;
181182

183+
int ssl_shutdown() const;
182184
bool ssl_handshake();
183185
void ssl_close();
184186

@@ -266,6 +268,13 @@ ssize_t NdbSocket::writev(const struct iovec *vec, int nvec) const {
266268
return ndb_socket_writev(s, vec, nvec);
267269
}
268270

271+
inline
272+
int NdbSocket::shutdown() const {
273+
if (ssl) ssl_shutdown();
274+
int r = ndb_socket_shutdown_both(s);
275+
return r;
276+
}
277+
269278
inline
270279
int NdbSocket::close() {
271280
if(ssl) ssl_close();
@@ -276,9 +285,10 @@ int NdbSocket::close() {
276285
}
277286

278287
inline
279-
void NdbSocket::close_with_reset(bool with_reset) {
288+
void NdbSocket::close_with_reset() {
280289
if(ssl) ssl_close();
281290
disable_locking();
291+
constexpr bool with_reset = true;
282292
ndb_socket_close_with_reset(s, with_reset);
283293
invalidate_socket_handle();
284294
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ Transporter::connect_client()
343343
/** Socket Authentication */
344344
if(m_socket_client->authenticate(secureSocket) < SocketAuthSimple::AuthOk)
345345
{
346-
DEBUG_FPRINTF((stderr, "Socket Authenticator failed\n"));
346+
secureSocket.close();
347347
DBUG_RETURN(false);
348348
}
349349

@@ -361,6 +361,7 @@ Transporter::connect_client(NdbSocket & socket)
361361
{
362362
DBUG_PRINT("error", ("Already connected"));
363363
DEBUG_FPRINTF((stderr, "Already connected\n"));
364+
socket.close();
364365
DBUG_RETURN(true);
365366
}
366367

@@ -369,6 +370,7 @@ Transporter::connect_client(NdbSocket & socket)
369370
DBUG_PRINT("error", ("Socket %s is not valid",
370371
socket.to_string().c_str()));
371372
DEBUG_FPRINTF((stderr, "Socket not valid\n"));
373+
socket.close();
372374
DBUG_RETURN(false);
373375
}
374376

@@ -404,6 +406,7 @@ Transporter::connect_client(NdbSocket & socket)
404406
if (helloLen < 0)
405407
{
406408
DBUG_PRINT("error", ("Failed to buffer hello %d", helloLen));
409+
socket.close();
407410
DBUG_RETURN(false);
408411
}
409412
/**

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

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -130,21 +130,18 @@ SocketServer::Session * TransporterService::newSession(ndb_socket_t sockfd)
130130
if(r < SocketAuthenticator::AuthOk)
131131
{
132132
DEBUG_FPRINTF((stderr, "Failed to authenticate new session\n"));
133-
secureSocket.close_with_reset(true); // Close with reset
134-
DBUG_RETURN(0);
133+
secureSocket.close_with_reset();
134+
DBUG_RETURN(nullptr);
135135
}
136136
}
137137

138138
BaseString msg;
139-
bool close_with_reset = true;
140139
bool log_failure = false;
141140
if (!m_transporter_registry->connect_server(secureSocket,
142141
msg,
143-
close_with_reset,
144142
log_failure))
145143
{
146144
DEBUG_FPRINTF((stderr, "New session failed in connect_server\n"));
147-
secureSocket.close_with_reset(close_with_reset);
148145
if (log_failure)
149146
{
150147
g_eventLogger->warning("TR : %s", msg.c_str());
@@ -508,7 +505,6 @@ TransporterRegistry::init(TransporterReceiveHandle& recvhandle)
508505
bool
509506
TransporterRegistry::connect_server(NdbSocket & socket,
510507
BaseString & msg,
511-
bool& close_with_reset,
512508
bool& log_failure)
513509
{
514510
DBUG_ENTER("TransporterRegistry::connect_server(sockfd)");
@@ -526,6 +522,7 @@ TransporterRegistry::connect_server(NdbSocket & socket,
526522
"read 'hello' from client");
527523
DBUG_PRINT("error", ("%s", msg.c_str()));
528524
DEBUG_FPRINTF((stderr, "%s", msg.c_str()));
525+
socket.close_with_reset();
529526
DBUG_RETURN(false);
530527
}
531528

@@ -555,6 +552,7 @@ TransporterRegistry::connect_server(NdbSocket & socket,
555552
"parse 'hello' from client. >%s<", buf);
556553
DBUG_PRINT("error", ("%s", msg.c_str()));
557554
DEBUG_FPRINTF((stderr, "%s", msg.c_str()));
555+
socket.close_with_reset();
558556
DBUG_RETURN(false);
559557
}
560558

@@ -581,6 +579,7 @@ TransporterRegistry::connect_server(NdbSocket & socket,
581579
msg.assfmt("Ignored connection attempt as client "
582580
"nodeid %u out of range", nodeId);
583581
DBUG_PRINT("error", ("%s", msg.c_str()));
582+
socket.close_with_reset();
584583
DBUG_RETURN(false);
585584
}
586585

@@ -595,6 +594,7 @@ TransporterRegistry::connect_server(NdbSocket & socket,
595594
"nodeid %u is undefined.",
596595
nodeId);
597596
DBUG_PRINT("error", ("%s", msg.c_str()));
597+
socket.close_with_reset();
598598
DBUG_RETURN(false);
599599
}
600600

@@ -609,6 +609,7 @@ TransporterRegistry::connect_server(NdbSocket & socket,
609609
nodeId,
610610
remote_transporter_type,
611611
t->m_type);
612+
socket.close_with_reset();
612613
DBUG_RETURN(false);
613614
}
614615

@@ -627,6 +628,7 @@ TransporterRegistry::connect_server(NdbSocket & socket,
627628
serverNodeId,
628629
t->getLocalNodeId());
629630
DBUG_PRINT("error", ("%s", msg.c_str()));
631+
socket.close_with_reset();
630632
DBUG_RETURN(false);
631633
}
632634
}
@@ -728,6 +730,7 @@ TransporterRegistry::connect_server(NdbSocket & socket,
728730
msg.assfmt("Ignored connection attempt from node %u as multi "
729731
"transporter instance %d specified for non multi-transporter",
730732
nodeId, multi_transporter_instance);
733+
socket.close_with_reset();
731734
DBUG_RETURN(false);
732735
}
733736
}
@@ -783,6 +786,7 @@ TransporterRegistry::connect_server(NdbSocket & socket,
783786
{
784787
// Failed to request client close
785788
DBUG_PRINT("error", ("Failed to send client BYE"));
789+
socket.close_with_reset();
786790
DBUG_RETURN(false);
787791
}
788792

@@ -791,11 +795,12 @@ TransporterRegistry::connect_server(NdbSocket & socket,
791795
if (socket.read(read_eof_timeout, buf, sizeof(buf)) == 0)
792796
{
793797
// Client gracefully closed connection, turn off close_with_reset
794-
close_with_reset = false;
798+
socket.close();
795799
DBUG_RETURN(false);
796800
}
797801

798802
// Failed to request client close
803+
socket.close_with_reset();
799804
DBUG_RETURN(false);
800805
}
801806

@@ -808,6 +813,7 @@ TransporterRegistry::connect_server(NdbSocket & socket,
808813
"reply to client node %u",
809814
nodeId);
810815
DBUG_PRINT("error", ("%s", msg.c_str()));
816+
socket.close_with_reset();
811817
DBUG_RETURN(false);
812818
}
813819

storage/ndb/src/common/util/NdbSocket.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ X509 * NdbSocket::peer_certificate() const {
110110
return SSL_get_peer_certificate(ssl);
111111
}
112112

113-
int NdbSocket::set_nonblocking(int on) {
113+
int NdbSocket::set_nonblocking(int on) const {
114114
if(ssl) {
115115
if(on) {
116116
SSL_clear_mode(ssl, SSL_MODE_AUTO_RETRY);
@@ -230,6 +230,19 @@ bool NdbSocket::key_update_pending() const {
230230
return (bool) SSL_renegotiate_pending(ssl);
231231
}
232232

233+
int NdbSocket::ssl_shutdown() const {
234+
int err;
235+
{
236+
Guard2 guard(mutex);
237+
set_nonblocking(false);
238+
int r = SSL_shutdown(ssl);
239+
if (r) return 0;
240+
err = SSL_get_error(ssl, r);
241+
}
242+
Debug_Log("SSL_shutdown(): ERR %d", err);
243+
return handle_ssl_error(err, "SSL_shutdown");
244+
}
245+
233246
ssize_t NdbSocket::ssl_recv(char *buf, size_t len) const
234247
{
235248
bool r;

storage/ndb/src/common/util/SocketClient.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,11 @@ SocketClient::authenticate(NdbSocket & secureSocket)
221221
{
222222
assert(m_auth);
223223
int r = m_auth->client_authenticate(secureSocket);
224-
if (r < SocketAuthenticator::AuthOk)
224+
if (r != SocketAuthenticator::AuthOk)
225225
{
226226
g_eventLogger->error("Socket authentication failed: %s\n",
227227
m_auth->error(r));
228-
secureSocket.close();
228+
secureSocket.shutdown(); // Make it unusable, caller should close
229229
}
230230
return r;
231231
}

storage/ndb/src/common/util/SocketServer.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -414,11 +414,6 @@ sessionThread_C(void* _sc){
414414

415415
if(!si->m_stop)
416416
si->runSession();
417-
else
418-
{
419-
ndb_socket_close(si->m_socket);
420-
ndb_socket_invalidate(&si->m_socket);
421-
}
422417

423418
// Mark the thread as stopped to allow the
424419
// session resources to be released

storage/ndb/src/mgmsrv/MgmtSrvr.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5125,12 +5125,11 @@ MgmtSrvr::getConnectionDbParameter(int node1, int node2,
51255125
bool
51265126
MgmtSrvr::transporter_connect(NdbSocket & socket,
51275127
BaseString& msg,
5128-
bool& close_with_reset,
51295128
bool& log_failure)
51305129
{
51315130
DBUG_ENTER("MgmtSrvr::transporter_connect");
51325131
TransporterRegistry* tr= theFacade->get_registry();
5133-
if (!tr->connect_server(socket, msg, close_with_reset, log_failure))
5132+
if (!tr->connect_server(socket, msg, log_failure))
51345133
DBUG_RETURN(false);
51355134

51365135
/**

storage/ndb/src/mgmsrv/MgmtSrvr.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,6 @@ class MgmtSrvr : private ConfigSubscriber, public trp_client {
358358

359359
bool transporter_connect(NdbSocket & socket,
360360
BaseString& errormsg,
361-
bool& close_with_reset,
362361
bool& log_failure);
363362

364363
SocketServer *get_socket_server() { return &m_socket_server; }

storage/ndb/src/mgmsrv/Services.cpp

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1889,11 +1889,9 @@ void
18891889
MgmApiSession::transporter_connect(Parser_t::Context &ctx,
18901890
Properties const &args)
18911891
{
1892-
bool close_with_reset = true;
18931892
bool log_failure = false;
18941893
BaseString errormsg;
1895-
if (!m_mgmsrv.transporter_connect(m_secure_socket,
1896-
errormsg, close_with_reset, log_failure))
1894+
if (!m_mgmsrv.transporter_connect(m_secure_socket, errormsg, log_failure))
18971895
{
18981896
// Connection not allowed or failed
18991897
if (log_failure)
@@ -1903,18 +1901,6 @@ MgmApiSession::transporter_connect(Parser_t::Context &ctx,
19031901
name(),
19041902
errormsg.c_str());
19051903
}
1906-
// Close the socket to indicate failure to client
1907-
m_secure_socket.close_with_reset(close_with_reset);
1908-
}
1909-
else
1910-
{
1911-
/*
1912-
Conversion to transporter succeeded
1913-
Stop this session thread and release resources
1914-
but don't close the socket, it's been taken over
1915-
by the transporter
1916-
*/
1917-
NdbSocket s = std::move(m_secure_socket);
19181904
}
19191905

19201906
m_stop= true; // Stop the session

0 commit comments

Comments
 (0)