Skip to content

Commit c2b4cb4

Browse files
committed
WL#15524 Patch #16 Use TLS for Event Listener
Adapt the MGM client and server so that the event listener thread in ndb_mgm can use TLS. Change-Id: I727e17e063b3d457d39b54d94a1aac9d3c2cb9b2
1 parent 39de6fe commit c2b4cb4

File tree

4 files changed

+42
-23
lines changed

4 files changed

+42
-23
lines changed

storage/ndb/src/mgmclient/CommandInterpreter.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -972,6 +972,7 @@ printLogEvent(struct ndb_logevent* event)
972972
struct event_thread_param {
973973
NdbMgmHandle *m;
974974
NdbMutex **p;
975+
int tls_req;
975976
};
976977

977978
static int do_event_thread = 0;
@@ -984,6 +985,7 @@ event_thread_run(void* p)
984985
struct event_thread_param param= *(struct event_thread_param*)p;
985986
NdbMgmHandle handle= *(param.m);
986987
NdbMutex* printmutex= *(param.p);
988+
int tls_req = param.tls_req;
987989

988990
int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP,
989991
1, NDB_MGM_EVENT_CATEGORY_STARTUP,
@@ -993,6 +995,16 @@ event_thread_run(void* p)
993995
NdbLogEventHandle log_handle= NULL;
994996
struct ndb_logevent log_event;
995997

998+
if(tls_req != CLIENT_TLS_DEFERRED)
999+
{
1000+
int r = ndb_mgm_start_tls(handle);
1001+
if(r != 0 && tls_req == CLIENT_TLS_STRICT)
1002+
{
1003+
do_event_thread = -1;
1004+
DBUG_RETURN(NULL);
1005+
}
1006+
}
1007+
9961008
log_handle= ndb_mgm_create_logevent_handle(handle, filter);
9971009
if (log_handle)
9981010
{
@@ -1037,6 +1049,7 @@ CommandInterpreter::connect(bool interactive)
10371049
ndbout_c("Can't create handle to management server.");
10381050
exit(-1);
10391051
}
1052+
ndb_mgm_set_ssl_ctx(m_mgmsrv, m_tlsKeyManager.ctx());
10401053

10411054
if((m_tls_start_type == CLIENT_TLS_STRICT) &&
10421055
(m_tlsKeyManager.ctx() == nullptr))
@@ -1057,6 +1070,7 @@ CommandInterpreter::connect(bool interactive)
10571070
ndb_mgm_destroy_handle(&m_mgmsrv);
10581071
exit(-1);
10591072
}
1073+
ndb_mgm_set_ssl_ctx(m_mgmsrv2, m_tlsKeyManager.ctx());
10601074
} else {
10611075
m_mgmsrv2 = nullptr;
10621076
}
@@ -1126,6 +1140,7 @@ CommandInterpreter::connect(bool interactive)
11261140
struct event_thread_param p;
11271141
p.m= &m_mgmsrv2;
11281142
p.p= &m_print_mutex;
1143+
p.tls_req= m_tls_start_type;
11291144
m_event_thread = NdbThread_Create(event_thread_run,
11301145
(void**)&p,
11311146
0, // default stack size

storage/ndb/src/mgmsrv/MgmtSrvr.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,6 @@ MgmtSrvr::MgmtSrvr(const MgmtOpts& opts) :
285285
/* Setup clusterlog as client[0] in m_event_listner */
286286
{
287287
Ndb_mgmd_event_service::Event_listener se;
288-
ndb_socket_initialize(&(se.m_socket));
289288
for(size_t t = 0; t<LogLevel::LOGLEVEL_CATEGORIES; t++){
290289
se.m_logLevel.setLogLevel((LogLevel::EventCategory)t, 7);
291290
}

storage/ndb/src/mgmsrv/MgmtSrvr.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class Ndb_mgmd_event_service : public EventLoggerBase
4949
public:
5050
struct Event_listener : public EventLoggerBase {
5151
Event_listener() {}
52-
ndb_socket_t m_socket;
52+
NdbSocket * m_socket_ptr {nullptr};
5353
Uint32 m_parsable;
5454
};
5555

@@ -66,7 +66,7 @@ class Ndb_mgmd_event_service : public EventLoggerBase
6666
stop_sessions();
6767
}
6868

69-
void add_listener(const Event_listener&);
69+
void add_listener(Event_listener&, NdbSocket &);
7070
void check_listeners();
7171
void update_max_log_level(const LogLevel&);
7272
void update_log_level(const LogLevel&);

storage/ndb/src/mgmsrv/Services.cpp

+25-20
Original file line numberDiff line numberDiff line change
@@ -1698,16 +1698,19 @@ Ndb_mgmd_event_service::log(int eventType, const Uint32* theData,
16981698
logevent2str(str, eventType, theData, len, nodeId, 0,
16991699
pretty_text, sizeof(pretty_text));
17001700

1701-
Vector<ndb_socket_t> copy;
1701+
Vector<NdbSocket *> copy;
17021702
m_clients.lock();
17031703
for(i = m_clients.size() - 1; i >= 0; i--)
17041704
{
17051705
if(threshold <= m_clients[i].m_logLevel.getLogLevel(cat))
17061706
{
1707-
if(!ndb_socket_valid(m_clients[i].m_socket))
1707+
if(m_clients[i].m_socket_ptr == nullptr)
17081708
continue;
17091709

1710-
SocketOutputStream out(m_clients[i].m_socket);
1710+
if(!m_clients[i].m_socket_ptr->is_valid())
1711+
continue;
1712+
1713+
SecureSocketOutputStream out(* m_clients[i].m_socket_ptr);
17111714

17121715
int r;
17131716
if (m_clients[i].m_parsable)
@@ -1728,7 +1731,7 @@ Ndb_mgmd_event_service::log(int eventType, const Uint32* theData,
17281731

17291732
if (r<0)
17301733
{
1731-
copy.push_back(m_clients[i].m_socket);
1734+
copy.push_back(m_clients[i].m_socket_ptr);
17321735
m_clients.erase(i, false);
17331736
}
17341737
}
@@ -1737,8 +1740,10 @@ Ndb_mgmd_event_service::log(int eventType, const Uint32* theData,
17371740

17381741
if ((n= (int)copy.size()))
17391742
{
1740-
for(i= 0; i < n; i++)
1741-
ndb_socket_close(copy[i]);
1743+
for(i= 0; i < n; i++) {
1744+
copy[i]->close();
1745+
delete copy[i];
1746+
}
17421747

17431748
LogLevel tmp; tmp.clear();
17441749
m_clients.lock();
@@ -1780,18 +1785,18 @@ Ndb_mgmd_event_service::check_listeners()
17801785
m_clients.lock();
17811786
for(i= m_clients.size() - 1; i >= 0; i--)
17821787
{
1783-
if(!ndb_socket_valid(m_clients[i].m_socket))
1788+
if(m_clients[i].m_socket_ptr == nullptr)
17841789
continue;
17851790

1786-
SocketOutputStream out(m_clients[i].m_socket);
1791+
if(!(m_clients[i].m_socket_ptr->is_valid()))
1792+
continue;
17871793

1788-
DBUG_PRINT("info",("%d %s",
1789-
i,
1790-
ndb_socket_to_string(m_clients[i].m_socket).c_str()));
1794+
SecureSocketOutputStream out(* m_clients[i].m_socket_ptr);
17911795

17921796
if(out.println("<PING>") < 0)
17931797
{
1794-
ndb_socket_close(m_clients[i].m_socket);
1798+
m_clients[i].m_socket_ptr->close();
1799+
delete m_clients[i].m_socket_ptr;
17951800
m_clients.erase(i, false);
17961801
n=1;
17971802
}
@@ -1808,14 +1813,15 @@ Ndb_mgmd_event_service::check_listeners()
18081813
}
18091814

18101815
void
1811-
Ndb_mgmd_event_service::add_listener(const Event_listener& client)
1816+
Ndb_mgmd_event_service::add_listener(Event_listener& client, NdbSocket& socket)
18121817
{
18131818
DBUG_ENTER("Ndb_mgmd_event_service::add_listener");
1814-
DBUG_PRINT("enter",("client.m_socket: %s",
1815-
ndb_socket_to_string(client.m_socket).c_str()));
18161819

18171820
check_listeners();
18181821

1822+
client.m_socket_ptr = new NdbSocket();
1823+
NdbSocket::transfer(* client.m_socket_ptr, socket);
1824+
18191825
m_clients.push_back(client);
18201826
update_max_log_level(client.m_logLevel);
18211827

@@ -1826,9 +1832,9 @@ void
18261832
Ndb_mgmd_event_service::stop_sessions(){
18271833
m_clients.lock();
18281834
for(int i = m_clients.size() - 1; i >= 0; i--){
1829-
if(ndb_socket_valid(m_clients[i].m_socket))
1835+
if(m_clients[i].m_socket_ptr && m_clients[i].m_socket_ptr->is_valid())
18301836
{
1831-
ndb_socket_close(m_clients[i].m_socket);
1837+
m_clients[i].m_socket_ptr->close();
18321838
m_clients.erase(i, false);
18331839
}
18341840
}
@@ -1918,7 +1924,6 @@ MgmApiSession::listen_event(Parser<MgmApiSession>::Context & ctx,
19181924

19191925
Ndb_mgmd_event_service::Event_listener le;
19201926
le.m_parsable = parsable;
1921-
le.m_socket = m_secure_socket.ndb_socket();
19221927

19231928
Vector<BaseString> list;
19241929
param.trim();
@@ -1982,9 +1987,9 @@ MgmApiSession::listen_event(Parser<MgmApiSession>::Context & ctx,
19821987

19831988
if(result==0)
19841989
{
1985-
m_mgmsrv.m_event_listner.add_listener(le);
1990+
m_mgmsrv.m_event_listner.add_listener(le, m_secure_socket);
19861991
m_stop = true;
1987-
m_secure_socket.invalidate();
1992+
assert(! m_secure_socket.is_valid()); // it has been transfered to listener
19881993
}
19891994
}
19901995

0 commit comments

Comments
 (0)