Skip to content

Commit 1cd011a

Browse files
zmurjdduncan
authored andcommitted
Bug#35703454 NdbSocket refactoring - use moves [NOCLOSE]
Back-ported for 8.0: Some parts of "WL#15524 Patch #16 Use TLS for Event Listener" have been merged into this patch. Use rvalue references (NdbSocket&&) when passing ownership of NdbSocket to function, use const references (const NdbSocket&) otherwise. When function creates a new instance of NdbSocket return it as a return value rather than via an out parameter. Implementation of struct ndb_logevent_handle is rewritten from being a plain C struct to have proper constructors for both taking ownership of socket and only borrow socket, and instead of using malloc and free function new and delete are used. Refactoring made SecureSocketOutputStream, BufferedSecureOutputStream, and SocketInputStream redundant and they are removed. Change-Id: I60caae52f2b0997b78ae179e5e9b47b6c99073b8
1 parent 154186c commit 1cd011a

38 files changed

+291
-343
lines changed

storage/ndb/include/transporter/TransporterRegistry.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ class TransporterService : public SocketServer::Service {
110110
{
111111
m_transporter_registry= t;
112112
}
113-
SocketServer::Session * newSession(ndb_socket_t socket) override;
113+
SocketServer::Session * newSession(NdbSocket&& socket) override;
114114
};
115115

116116
/**
@@ -253,7 +253,7 @@ class TransporterRegistry
253253
254254
@returns false on failure and true on success
255255
*/
256-
bool connect_server(NdbSocket & sockfd,
256+
bool connect_server(NdbSocket&& sockfd,
257257
BaseString& msg,
258258
bool& log_failure);
259259

storage/ndb/include/util/InputStream.hpp

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,27 +57,18 @@ class FileInputStream : public InputStream {
5757

5858
extern FileInputStream Stdin;
5959

60-
class SecureSocketInputStream : public InputStream {
60+
class SocketInputStream : public InputStream {
6161
const NdbSocket & m_socket;
6262
unsigned m_timeout_ms;
6363
unsigned m_timeout_remain;
6464
bool m_startover;
6565
bool m_timedout;
6666
public:
67-
SecureSocketInputStream(const NdbSocket &, unsigned read_timeout_ms = 3000);
68-
~SecureSocketInputStream() override {}
67+
SocketInputStream(const NdbSocket &, unsigned read_timeout_ms = 3000);
68+
~SocketInputStream() override {}
6969
char* gets(char * buf, int bufLen) override;
7070
bool timedout() { return m_timedout; }
7171
void reset_timeout() override { m_timedout= false; m_timeout_remain= m_timeout_ms;}
7272
};
7373

74-
class SocketInputStream : public SecureSocketInputStream {
75-
NdbSocket m_owned_socket;
76-
public:
77-
SocketInputStream(ndb_socket_t s, unsigned timeout_ms = 3000) :
78-
SecureSocketInputStream(m_owned_socket, timeout_ms),
79-
m_owned_socket(s, NdbSocket::From::Existing) {}
80-
~SocketInputStream() override {}
81-
};
82-
8374
#endif

storage/ndb/include/util/NdbSocket.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class NdbSocket {
3939

4040
NdbSocket() = default;
4141
NdbSocket(NdbSocket&& oth);
42-
NdbSocket(ndb_socket_t ndbsocket, From fromType) {
42+
NdbSocket(ndb_socket_t ndbsocket, From fromType = From::New) {
4343
ssl = socket_table_get_ssl(ndbsocket.s, (fromType == From::Existing));
4444
init_from_native(ndbsocket.s);
4545
}
@@ -52,6 +52,7 @@ class NdbSocket {
5252
bool has_tls() const { return ssl; }
5353
ndb_socket_t ndb_socket() const { return s; }
5454
socket_t native_socket() const { return ndb_socket_get_native(s); }
55+
socket_t release_native_socket();
5556
std::string to_string() const;
5657

5758
/* Get an SSL for client-side TLS.
@@ -239,6 +240,15 @@ void NdbSocket::invalidate_socket_handle() {
239240
ndb_socket_invalidate(&s);
240241
}
241242

243+
inline
244+
socket_t NdbSocket::release_native_socket() {
245+
require(ssl == nullptr);
246+
require(mutex == nullptr);
247+
socket_t sock = s.s;
248+
invalidate_socket_handle();
249+
return sock;
250+
}
251+
242252
inline
243253
std::string NdbSocket::to_string() const {
244254
std::string str = ndb_socket_to_string(s);

storage/ndb/include/util/OutputStream.hpp

Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -83,15 +83,15 @@ class FileOutputStream : public OutputStream {
8383
void flush() override { fflush(f); }
8484
};
8585

86-
class SecureSocketOutputStream : public OutputStream {
86+
class SocketOutputStream : public OutputStream {
8787
protected:
8888
const NdbSocket & m_socket;
8989
unsigned m_timeout_ms;
9090
bool m_timedout;
9191
unsigned m_timeout_remain;
9292
public:
93-
SecureSocketOutputStream(const NdbSocket &, unsigned write_timeout_ms = 1000);
94-
~SecureSocketOutputStream() override {}
93+
SocketOutputStream(const NdbSocket &, unsigned write_timeout_ms = 1000);
94+
~SocketOutputStream() override {}
9595
bool timedout() { return m_timedout; }
9696
void reset_timeout() override { m_timedout= false; m_timeout_remain= m_timeout_ms;}
9797

@@ -102,24 +102,13 @@ class SecureSocketOutputStream : public OutputStream {
102102
int write(const void * buf, size_t len) override;
103103
};
104104

105-
class SocketOutputStream : public SecureSocketOutputStream {
106-
public:
107-
SocketOutputStream(ndb_socket_t s, unsigned timeout_ms = 1000) :
108-
SecureSocketOutputStream(m_owned_socket, timeout_ms),
109-
m_owned_socket(s, NdbSocket::From::Existing) {}
110-
~SocketOutputStream() override {}
111-
112-
private:
113-
NdbSocket m_owned_socket;
114-
};
115-
116-
class BufferedSecureOutputStream : public SecureSocketOutputStream {
105+
class BufferSocketOutputStream : public SocketOutputStream {
117106
protected:
118107
class UtilBuffer& m_buffer;
119108
public:
120-
BufferedSecureOutputStream(const NdbSocket & socket,
121-
unsigned write_timeout_ms = 1000);
122-
~BufferedSecureOutputStream() override;
109+
BufferSocketOutputStream(const NdbSocket & socket,
110+
unsigned write_timeout_ms = 1000);
111+
~BufferSocketOutputStream() override;
123112

124113
int print(const char * fmt, ...) override
125114
ATTRIBUTE_FORMAT(printf, 2, 3);
@@ -130,18 +119,6 @@ class BufferedSecureOutputStream : public SecureSocketOutputStream {
130119
void flush() override;
131120
};
132121

133-
class BufferedSockOutputStream : public BufferedSecureOutputStream {
134-
public:
135-
BufferedSockOutputStream(ndb_socket_t s, unsigned timeout_msec = 1000) :
136-
BufferedSecureOutputStream(m_owned_socket, timeout_msec),
137-
m_owned_socket(s, NdbSocket::From::Existing) {}
138-
139-
~BufferedSockOutputStream() override {}
140-
private:
141-
NdbSocket m_owned_socket;
142-
};
143-
144-
145122
class NullOutputStream : public OutputStream {
146123
public:
147124
NullOutputStream() {}

storage/ndb/include/util/SocketAuthenticator.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ class SocketAuthenticator
3737
public:
3838
SocketAuthenticator() {}
3939
virtual ~SocketAuthenticator() {}
40-
virtual int client_authenticate(NdbSocket &) = 0;
41-
virtual int server_authenticate(NdbSocket &) = 0;
40+
virtual int client_authenticate(const NdbSocket &) = 0;
41+
virtual int server_authenticate(const NdbSocket &) = 0;
4242

4343
static constexpr int AuthOk = 0;
4444
static const char * error(int); // returns error message for code
@@ -50,8 +50,8 @@ class SocketAuthSimple : public SocketAuthenticator
5050
public:
5151
SocketAuthSimple() {}
5252
~SocketAuthSimple() override {}
53-
int client_authenticate(NdbSocket &) override;
54-
int server_authenticate(NdbSocket &) override;
53+
int client_authenticate(const NdbSocket &) override;
54+
int server_authenticate(const NdbSocket &) override;
5555
};
5656

5757

storage/ndb/include/util/SocketClient.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,8 @@ class SocketClient
4444
m_connect_timeout_millisec = timeout_millisec;
4545
}
4646
int bind(ndb_sockaddr local);
47-
ndb_socket_t connect(ndb_sockaddr server_addr);
48-
void connect(NdbSocket &, ndb_sockaddr server_addr);
49-
int authenticate(NdbSocket &);
47+
NdbSocket connect(ndb_sockaddr server_addr);
48+
int authenticate(const NdbSocket &);
5049

5150
ndb_socket_t m_sockfd;
5251
};

storage/ndb/include/util/SocketServer.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "portlib/NdbThread.h"
3030
#include "portlib/ndb_socket_poller.h"
3131
#include "portlib/ndb_sockaddr.h"
32+
#include "util/NdbSocket.h"
3233

3334
#include <Vector.hpp>
3435

@@ -51,21 +52,21 @@ class SocketServer {
5152
protected:
5253
friend class SocketServer;
5354
friend void* sessionThread_C(void*);
54-
Session(ndb_socket_t sock) :
55+
Session(const NdbSocket& sock) :
5556
m_stop(false),
5657
m_refCount(0),
5758
m_socket(sock),
5859
m_thread_stopped(false)
5960
{
6061
DBUG_ENTER("SocketServer::Session");
6162
DBUG_PRINT("enter",("NDB_SOCKET: %s",
62-
ndb_socket_to_string(m_socket).c_str()));
63+
m_socket.to_string().c_str()));
6364
DBUG_VOID_RETURN;
6465
}
6566
bool m_stop; // Has the session been ordered to stop?
6667
unsigned m_refCount;
6768
private:
68-
ndb_socket_t m_socket;
69+
const NdbSocket& m_socket;
6970
bool m_thread_stopped; // Has the session thread stopped?
7071
};
7172

@@ -82,7 +83,7 @@ class SocketServer {
8283
*
8384
* To manage threads self, just return NULL
8485
*/
85-
virtual Session * newSession(ndb_socket_t theSock) = 0;
86+
virtual Session * newSession(NdbSocket&& theSock) = 0;
8687
virtual void stopSessions(){}
8788
};
8889

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ Multi_Transporter::resetBuffers()
6868
send_checksum_state.init();
6969
}
7070

71-
bool Multi_Transporter::connect_server_impl(NdbSocket &)
71+
bool Multi_Transporter::connect_server_impl(NdbSocket&&)
7272
{
7373
return true;
7474
}
7575

76-
bool Multi_Transporter::connect_client_impl(NdbSocket &)
76+
bool Multi_Transporter::connect_client_impl(NdbSocket&&)
7777
{
7878
return true;
7979
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,8 @@ class Multi_Transporter : public Transporter {
143143
* A client connects to the remote server
144144
* A server accepts any new connections
145145
*/
146-
bool connect_server_impl(NdbSocket & sockfd) override;
147-
bool connect_client_impl(NdbSocket & sockfd) override;
146+
bool connect_server_impl(NdbSocket&& sockfd) override;
147+
bool connect_client_impl(NdbSocket&& sockfd) override;
148148

149149
/**
150150
* Disconnects a TCP/IP node, possibly blocking.

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -321,13 +321,13 @@ SHM_Transporter::setupBuffers()
321321
}
322322

323323
bool
324-
SHM_Transporter::connect_server_impl(NdbSocket & sockfd)
324+
SHM_Transporter::connect_server_impl(NdbSocket&& sockfd)
325325
{
326326
DBUG_ENTER("SHM_Transporter::connect_server_impl");
327327
DEBUG_FPRINTF((stderr, "(%u)connect_server_impl(%u)\n",
328328
localNodeId, remoteNodeId));
329-
SecureSocketOutputStream s_output(sockfd);
330-
SecureSocketInputStream s_input(sockfd);
329+
SocketOutputStream s_output(sockfd);
330+
SocketInputStream s_input(sockfd);
331331

332332
// Create
333333
if (!_shmSegCreated)
@@ -419,12 +419,12 @@ SHM_Transporter::connect_server_impl(NdbSocket & sockfd)
419419
}
420420
DEBUG_FPRINTF((stderr, "(%u)set_socket()(%u)\n",
421421
localNodeId, remoteNodeId));
422-
set_socket(sockfd);
422+
set_socket(std::move(sockfd));
423423
DBUG_RETURN(r);
424424
}
425425

426426
void
427-
SHM_Transporter::set_socket(NdbSocket & sock)
427+
SHM_Transporter::set_socket(NdbSocket&& sock)
428428
{
429429
set_get(sock.ndb_socket(), IPPROTO_TCP, TCP_NODELAY, "TCP_NODELAY", 1);
430430
set_get(sock.ndb_socket(), SOL_SOCKET, SO_KEEPALIVE, "SO_KEEPALIVE", 1);
@@ -436,13 +436,13 @@ SHM_Transporter::set_socket(NdbSocket & sock)
436436
}
437437

438438
bool
439-
SHM_Transporter::connect_client_impl(NdbSocket & sockfd)
439+
SHM_Transporter::connect_client_impl(NdbSocket&& sockfd)
440440
{
441441
DBUG_ENTER("SHM_Transporter::connect_client_impl");
442442
DEBUG_FPRINTF((stderr, "(%u)connect_client_impl(%u)\n",
443443
localNodeId, remoteNodeId));
444-
SecureSocketInputStream s_input(sockfd);
445-
SecureSocketOutputStream s_output(sockfd);
444+
SocketInputStream s_input(sockfd);
445+
SocketOutputStream s_output(sockfd);
446446
char buf[256];
447447

448448
// Wait for server to create and attach
@@ -550,7 +550,7 @@ SHM_Transporter::connect_client_impl(NdbSocket & sockfd)
550550
localNodeId, __LINE__, remoteNodeId));
551551
detach_shm(false);
552552
}
553-
set_socket(sockfd);
553+
set_socket(std::move(sockfd));
554554
DEBUG_FPRINTF((stderr, "(%u)set_socket(%u)\n",
555555
localNodeId, remoteNodeId));
556556
DBUG_RETURN(r);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class SHM_Transporter : public Transporter {
111111
* i.e., both agrees that the other one has setup the segment.
112112
* Otherwise false.
113113
*/
114-
bool connect_server_impl(NdbSocket &) override;
114+
bool connect_server_impl(NdbSocket&&) override;
115115

116116
/**
117117
* Blocking
@@ -124,15 +124,15 @@ class SHM_Transporter : public Transporter {
124124
* i.e., both agrees that the other one has setup the segment.
125125
* Otherwise false.
126126
*/
127-
bool connect_client_impl(NdbSocket &) override;
127+
bool connect_client_impl(NdbSocket&&) override;
128128

129129
bool connect_common();
130130

131131
bool ndb_shm_create();
132132
bool ndb_shm_get();
133133
bool ndb_shm_attach();
134134
void ndb_shm_destroy();
135-
void set_socket(NdbSocket &);
135+
void set_socket(NdbSocket&&);
136136

137137
/**
138138
* Check if there are two processes attached to the segment (a connection)

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -201,19 +201,19 @@ TCP_Transporter::resetBuffers()
201201
send_checksum_state.init();
202202
}
203203

204-
bool TCP_Transporter::connect_server_impl(NdbSocket & socket)
204+
bool TCP_Transporter::connect_server_impl(NdbSocket&& socket)
205205
{
206206
DBUG_ENTER("TCP_Transpporter::connect_server_impl");
207-
DBUG_RETURN(connect_common(socket));
207+
DBUG_RETURN(connect_common(std::move(socket)));
208208
}
209209

210-
bool TCP_Transporter::connect_client_impl(NdbSocket & socket)
210+
bool TCP_Transporter::connect_client_impl(NdbSocket&& socket)
211211
{
212212
DBUG_ENTER("TCP_Transpporter::connect_client_impl");
213-
DBUG_RETURN(connect_common(socket));
213+
DBUG_RETURN(connect_common(std::move(socket)));
214214
}
215215

216-
bool TCP_Transporter::connect_common(NdbSocket & socket)
216+
bool TCP_Transporter::connect_common(NdbSocket&& socket)
217217
{
218218
setSocketOptions(socket.ndb_socket());
219219
socket.set_nonblocking(true);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@ class TCP_Transporter : public Transporter {
109109
* A client connects to the remote server
110110
* A server accepts any new connections
111111
*/
112-
bool connect_server_impl(NdbSocket & sockfd) override;
113-
bool connect_client_impl(NdbSocket & sockfd) override;
114-
bool connect_common(NdbSocket & sockfd);
112+
bool connect_server_impl(NdbSocket&& sockfd) override;
113+
bool connect_client_impl(NdbSocket&& sockfd) override;
114+
bool connect_common(NdbSocket&& sockfd);
115115

116116
/**
117117
* Disconnects a TCP/IP node, possibly blocking.

0 commit comments

Comments
 (0)