Skip to content

Commit 93e7ca4

Browse files
committed
BUG#23575086 - X PLUGIN STARTUP ERROR MESSAGES
Description: X Plugin startup messages could be confusing without knowing source code Solution: Cleanup of startup messages was already done under wl 9306, one missing thing is the reference to documentation. Added following trace in case of error while setting up I/O interface: 'Please see the MySQL documentation for '%s' system variable to fix the error' RB: 13565 Reviewed-by: Grzegorz Szwarc <[email protected]>
1 parent 04b5c31 commit 93e7ca4

16 files changed

+331
-177
lines changed

rapid/plugin/x/mysqlx_variables.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ STRING(SUBSTRING ${MYSQLX_PLUGIN_NAME} 1 -1 MYSQLX_PLUGIN_NAME_REST)
2424
STRING(TOUPPER ${MYSQLX_PLUGIN_NAME_FIRST_LETTER} MYSQLX_PLUGIN_NAME_FIRST_LETTER)
2525

2626
SET(MYSQLX_STATUS_VARIABLE_NAME "${MYSQLX_PLUGIN_NAME_FIRST_LETTER}${MYSQLX_PLUGIN_NAME_REST}")
27+
SET(MYSQLX_SYSTEM_VARIABLE_NAME "${MYSQLX_PLUGIN_NAME}")
2728

2829
SET(MYSQLX_TCP_PORT 33060)
2930

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved.
3+
*
4+
* This program is free software; you can redistribute it and/or
5+
* modify it under the terms of the GNU General Public License as
6+
* published by the Free Software Foundation; version 2 of the
7+
* License.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with this program; if not, write to the Free Software
16+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17+
* 02110-1301 USA
18+
*/
19+
20+
#ifndef _NGS_LISTENER_FACTORY_INTERFACE_H_
21+
#define _NGS_LISTENER_FACTORY_INTERFACE_H_
22+
23+
#include "ngs/interface/listener_interface.h"
24+
#include "ngs/memory.h"
25+
26+
27+
namespace ngs
28+
{
29+
30+
class Time_and_socket_events;
31+
typedef Memory_new<Listener_interface>::Unique_ptr Listener_interface_ptr;
32+
33+
class Listener_factory_interface
34+
{
35+
public:
36+
37+
virtual ~Listener_factory_interface() {}
38+
39+
virtual Listener_interface_ptr create_unix_socket_listener(const std::string &unix_socket_path, Time_and_socket_events &event) = 0;
40+
virtual Listener_interface_ptr create_tcp_socket_listener(const unsigned short port, Time_and_socket_events &event) = 0;
41+
};
42+
43+
} // namespace ngs
44+
45+
#endif // _NGS_LISTENER_FACTORY_INTERFACE_H_

rapid/plugin/x/ngs/include/ngs/interface/listener_interface.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ class Listener_interface
4848

4949
virtual Sync_variable_state &get_state() = 0;
5050
virtual std::string get_last_error() = 0;
51-
virtual std::string get_description() = 0;
51+
virtual std::string get_name_and_configuration() const = 0;
52+
virtual std::string get_configuration_variable() const = 0;
5253
virtual bool is_handled_by_socket_event() = 0;
5354

5455
virtual bool setup_listener(On_connection) = 0;

rapid/plugin/x/ngs/include/ngs/server.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ class Server_task_interface;
5454
class Connection_acceptor_interface;
5555
class Incoming_queue;
5656
class Scheduler_dynamic;
57-
class Named_pipe_listener;
5857
class Server_acceptors;
5958

6059
class Server: public Server_interface

rapid/plugin/x/ngs/include/ngs/server_acceptors.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#define _NGS_SERVER_ACCEPTORS_
2222

2323
#include "ngs/interface/listener_interface.h"
24+
#include "ngs/interface/listener_factory_interface.h"
2425
#include "ngs/interface/server_task_interface.h"
2526
#include "ngs/time_socket_events.h"
2627
#include <string>
@@ -38,7 +39,8 @@ class Server_acceptors
3839
public:
3940
typedef Listener_interface::On_connection On_connection;
4041

41-
Server_acceptors(const unsigned short tcp_port,
42+
Server_acceptors(Listener_factory_interface &listener_factory,
43+
const unsigned short tcp_port,
4244
const std::string &unix_socket_file_or_named_pipe);
4345

4446
bool prepare(On_connection on_connection, const bool skip_networking, const bool use_unix_sockets_or_named_pipes);
@@ -62,8 +64,8 @@ class Server_acceptors
6264
static void close_listener(Listener_interface *listener);
6365
static void report_listener_status(Listener_interface *listener);
6466

65-
boost::scoped_ptr<Listener_interface> m_tcp_socket;
66-
boost::scoped_ptr<Listener_interface> m_unix_socket;
67+
Listener_interface_ptr m_tcp_socket;
68+
Listener_interface_ptr m_unix_socket;
6769

6870
Listener_interface::Sync_variable_state m_time_and_event_state;
6971
boost::shared_ptr<Server_task_time_and_event> m_time_and_event_task;

rapid/plugin/x/ngs/src/server_acceptors.cc

Lines changed: 15 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -35,163 +35,6 @@ using namespace ngs;
3535
namespace details
3636
{
3737

38-
class Tcp_listener: public Listener_interface
39-
{
40-
public:
41-
Tcp_listener(const unsigned short port, Time_and_socket_events &event)
42-
: m_state(State_listener_initializing),
43-
m_port(port),
44-
m_event(event)
45-
{
46-
m_tcp_socket = ngs::Connection_vio::create_and_bind_socket(port, m_last_error);
47-
}
48-
49-
~Tcp_listener()
50-
{
51-
Connection_vio::close_socket(m_tcp_socket);
52-
}
53-
54-
Sync_variable_state &get_state()
55-
{
56-
return m_state;
57-
}
58-
59-
bool is_handled_by_socket_event()
60-
{
61-
return true;
62-
}
63-
64-
std::string get_last_error()
65-
{
66-
return m_last_error;
67-
}
68-
69-
std::string get_description()
70-
{
71-
char to_string_buffer[32];
72-
73-
sprintf(to_string_buffer, "%i", m_port);
74-
75-
std::string result = "TCP (port:";
76-
77-
result += to_string_buffer;
78-
result += ")";
79-
80-
return result;
81-
}
82-
83-
bool setup_listener(On_connection on_connection)
84-
{
85-
if (INVALID_SOCKET == m_tcp_socket)
86-
return false;
87-
88-
if (m_event.listen(m_tcp_socket, on_connection))
89-
{
90-
m_state.set(State_listener_prepared);
91-
return true;
92-
}
93-
94-
return false;
95-
}
96-
97-
void close_listener()
98-
{
99-
Connection_vio::close_socket(m_tcp_socket);
100-
}
101-
102-
void loop()
103-
{
104-
}
105-
106-
private:
107-
Sync_variable_state m_state;
108-
const unsigned short m_port;
109-
my_socket m_tcp_socket;
110-
Time_and_socket_events &m_event;
111-
std::string m_last_error;
112-
};
113-
114-
115-
class Unix_socket_listener: public Listener_interface
116-
{
117-
public:
118-
Unix_socket_listener(const std::string &unix_socket_path, Time_and_socket_events &event)
119-
: m_state(State_listener_initializing),
120-
m_unix_socket_path(unix_socket_path),
121-
m_event(event)
122-
{
123-
#if !defined(HAVE_SYS_UN_H)
124-
m_state.set(State_listener_stopped);
125-
#else
126-
m_unix_socket = ngs::Connection_vio::create_and_bind_socket(unix_socket_path, m_last_error);
127-
#endif // !defined(HAVE_SYS_UN_H)
128-
}
129-
130-
~Unix_socket_listener()
131-
{
132-
Connection_vio::close_socket(m_unix_socket);
133-
}
134-
135-
Sync_variable_state &get_state()
136-
{
137-
return m_state;
138-
}
139-
140-
bool is_handled_by_socket_event()
141-
{
142-
return true;
143-
}
144-
145-
std::string get_description()
146-
{
147-
std::string result = "UNIX socket (";
148-
149-
result += m_unix_socket_path;
150-
result += ")";
151-
152-
return result;
153-
}
154-
155-
std::string get_last_error()
156-
{
157-
return m_last_error;
158-
}
159-
160-
bool setup_listener(On_connection on_connection)
161-
{
162-
if (!m_state.is(State_listener_initializing))
163-
return false;
164-
165-
if (INVALID_SOCKET == m_unix_socket)
166-
return false;
167-
168-
if (m_event.listen(m_unix_socket, on_connection))
169-
{
170-
m_state.set(State_listener_prepared);
171-
return true;
172-
}
173-
174-
return false;
175-
}
176-
177-
void close_listener()
178-
{
179-
Connection_vio::close_socket(m_unix_socket);
180-
}
181-
182-
void loop()
183-
{
184-
}
185-
186-
private:
187-
Sync_variable_state m_state;
188-
const std::string m_unix_socket_path;
189-
my_socket m_unix_socket;
190-
Time_and_socket_events &m_event;
191-
std::string m_last_error;
192-
};
193-
194-
19538
class Server_task_listener: public Server_task_interface
19639
{
19740
public:
@@ -275,11 +118,12 @@ class Server_acceptors::Server_task_time_and_event: public Server_task_interface
275118

276119

277120
Server_acceptors::Server_acceptors(
121+
Listener_factory_interface &listener_factory,
278122
const unsigned short tcp_port,
279123
const std::string &unix_socket_file_or_named_pipe)
280-
: m_tcp_socket(new details::Tcp_listener(tcp_port, m_event)),
124+
: m_tcp_socket(listener_factory.create_tcp_socket_listener(tcp_port, m_event)),
281125
#if defined(HAVE_SYS_UN_H)
282-
m_unix_socket(new details::Unix_socket_listener(unix_socket_file_or_named_pipe, m_event)),
126+
m_unix_socket(listener_factory.create_unix_socket_listener(unix_socket_file_or_named_pipe, m_event)),
283127
#endif
284128
m_time_and_event_state(State_listener_initializing),
285129
m_time_and_event_task(new Server_task_time_and_event(m_event, m_time_and_event_state))
@@ -298,7 +142,7 @@ bool Server_acceptors::prepare_impl(On_connection on_connection, const bool skip
298142

299143
if (listeners.empty())
300144
{
301-
log_warning("All IO interfaces are disabled, X Protocol won't be accessible");
145+
log_warning("All I/O interfaces are disabled, X Protocol won't be accessible");
302146

303147
return false;
304148
}
@@ -312,7 +156,7 @@ bool Server_acceptors::prepare_impl(On_connection on_connection, const bool skip
312156
{
313157
abort();
314158

315-
log_error("Preparation of IO interfaces failed, X Protocol won't be accessible");
159+
log_error("Preparation of I/O interfaces failed, X Protocol won't be accessible");
316160

317161
return false;
318162
}
@@ -452,10 +296,18 @@ void Server_acceptors::report_listener_status(Listener_interface *listener)
452296
{
453297
if (!listener->get_state().is(State_listener_prepared))
454298
{
455-
log_error("X Plugin failed to setup %s, with:", listener->get_description().c_str());
299+
log_error("X Plugin failed to setup %s, with:", listener->get_name_and_configuration().c_str());
456300
log_error("%s", listener->get_last_error().c_str());
301+
302+
const std::string listener_configuration_variable = listener->get_configuration_variable();
303+
304+
if (!listener_configuration_variable.empty())
305+
{
306+
log_info("Please see the MySQL documentation for '%s' system variable to fix the error", listener_configuration_variable.c_str());
307+
}
308+
457309
return;
458310
}
459311

460-
log_info("X Plugin listens at %s", listener->get_description().c_str());
312+
log_info("X Plugin listens on %s", listener->get_name_and_configuration().c_str());
461313
}

rapid/plugin/x/source_files.cmake

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ SET(xplugin_HDRS
5252
"${MYSQLX_PROJECT_DIR}/src/xpl_global_status_variables.h"
5353
"${MYSQLX_PROJECT_DIR}/src/xpl_session_status_variables.h"
5454
"${MYSQLX_PROJECT_DIR}/src/xpl_replication_observer.h"
55+
"${MYSQLX_PROJECT_DIR}/src/xpl_log.h"
56+
"${MYSQLX_PROJECT_DIR}/src/xpl_regex.h"
5557
"${MYSQLX_PROJECT_DIR}/src/auth_plain.h"
5658
"${MYSQLX_PROJECT_DIR}/src/auth_mysql41.h"
5759
"${MYSQLX_PROJECT_DIR}/src/admin_cmd_handler.h"
@@ -67,15 +69,13 @@ SET(xplugin_HDRS
6769
"${MYSQLX_PROJECT_DIR}/src/sql_user_require.h"
6870
"${MYSQLX_PROJECT_DIR}/src/json_utils.h"
6971
"${MYSQLX_PROJECT_DIR}/src/expect.h"
70-
"${MYSQLX_PROJECT_DIR}/src/xpl_log.h"
7172
"${MYSQLX_PROJECT_DIR}/src/statement_builder.h"
7273
"${MYSQLX_PROJECT_DIR}/src/update_statement_builder.h"
7374
"${MYSQLX_PROJECT_DIR}/src/find_statement_builder.h"
7475
"${MYSQLX_PROJECT_DIR}/src/insert_statement_builder.h"
7576
"${MYSQLX_PROJECT_DIR}/src/delete_statement_builder.h"
7677
"${MYSQLX_PROJECT_DIR}/src/notices.h"
7778
"${MYSQLX_PROJECT_DIR}/src/cap_handles_expired_passwords.h"
78-
"${MYSQLX_PROJECT_DIR}/src/xpl_regex.h"
7979
${ngs_HDRS}
8080
)
8181

@@ -87,6 +87,8 @@ SET(xplugin_SRC
8787
"${MYSQLX_PROJECT_DIR}/src/xpl_dispatcher.cc"
8888
"${MYSQLX_PROJECT_DIR}/src/xpl_system_variables.cc"
8989
"${MYSQLX_PROJECT_DIR}/src/xpl_replication_observer.cc"
90+
"${MYSQLX_PROJECT_DIR}/src/xpl_regex.cc"
91+
"${MYSQLX_PROJECT_DIR}/src/xpl_listener_factory.cc"
9092
"${MYSQLX_PROJECT_DIR}/src/mysql_variables.cc"
9193
"${MYSQLX_PROJECT_DIR}/src/mysql_function_names.cc"
9294
"${MYSQLX_PROJECT_DIR}/src/mysql_show_variable_wrapper.cc"
@@ -110,7 +112,6 @@ SET(xplugin_SRC
110112
"${MYSQLX_PROJECT_DIR}/src/delete_statement_builder.cc"
111113
"${MYSQLX_PROJECT_DIR}/src/insert_statement_builder.cc"
112114
"${MYSQLX_PROJECT_DIR}/src/notices.cc"
113-
"${MYSQLX_PROJECT_DIR}/src/xpl_regex.cc"
114115
${ngs_SRC}
115116
)
116117

rapid/plugin/x/src/mysqlx_version.h.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
#define MYSQLX_PLUGIN_NAME "@MYSQLX_PLUGIN_NAME@"
3030
#define MYSQLX_STATUS_VARIABLE_PREFIX(NAME) "@MYSQLX_STATUS_VARIABLE_NAME@_" NAME
31+
#define MYSQLX_SYSTEM_VARIABLE_PREFIX(NAME) "@MYSQLX_SYSTEM_VARIABLE_NAME@_" NAME
3132

3233
#define MYSQLX_TCP_PORT @MYSQLX_TCP_PORT@U
3334
#define MYSQLX_UNIX_ADDR "@MYSQLX_UNIX_ADDR@"

0 commit comments

Comments
 (0)