Merge branch '2.3' into develop

This commit is contained in:
Markus Mäkelä
2018-12-18 00:00:00 +02:00
12 changed files with 88 additions and 19 deletions

View File

@ -402,12 +402,12 @@ static int signal_set(int sig, void (* handler)(int));
static void sigfatal_handler(int i)
{
if (fatal_handling)
{
fprintf(stderr, "Fatal signal %d while backtracing\n", i);
_exit(1);
}
fatal_handling = 1;
// The same signal being handled *now* can occur in another thread (and is often likely).
// By setting the default handler here we will always get a core, but not necessarily
// the backtrace into the log file. This should be overhauled to proper signal handling
// (MXS-599).
signal_set(i, SIG_DFL);
MXS_CONFIG* cnf = config_get_global_options();
fprintf(stderr,
"Fatal: MaxScale " MAXSCALE_VERSION " received fatal signal %d. "
@ -435,7 +435,6 @@ static void sigfatal_handler(int i)
/* re-raise signal to enforce core dump */
fprintf(stderr, "\n\nWriting core dump\n");
signal_set(i, SIG_DFL);
raise(i);
}

View File

@ -1367,6 +1367,7 @@ namespace maxscale
std::string get_canonical(GWBUF* querybuf)
{
std::string rval;
rval.reserve(gwbuf_length(querybuf) - MYSQL_HEADER_LEN + 1);
mxs::Buffer buf(querybuf);
enum state

View File

@ -61,6 +61,20 @@ bool qc_mysql_is_ps_command(uint8_t cmd)
|| cmd == MXS_COM_STMT_RESET;
}
// Copied from mysql_common.cc
uint32_t qc_mysql_extract_ps_id(GWBUF* buffer)
{
uint32_t rval = 0;
uint8_t id[MYSQL_PS_ID_SIZE];
if (gwbuf_copy_data(buffer, MYSQL_PS_ID_OFFSET, sizeof(id), id) == sizeof(id))
{
rval = gw_mysql_get_byte4(id);
}
return rval;
}
bool have_semicolon(const char* ptr, int len)
{
for (int i = 0; i < len; i++)
@ -376,7 +390,8 @@ uint32_t QueryClassifier::ps_get_type(std::string id) const
void QueryClassifier::ps_erase(GWBUF* buffer)
{
return m_sPs_manager->erase(buffer);
m_ps_handles.erase(qc_mysql_extract_ps_id(buffer));
m_sPs_manager->erase(buffer);
}
bool QueryClassifier::query_type_is_read_only(uint32_t qtype) const

View File

@ -675,24 +675,25 @@ static inline bool complete_ps_response(GWBUF* buffer)
if (mxs_mysql_extract_ps_response(buffer, &resp))
{
int expected_eof = 0;
int expected_packets = 1;
if (resp.columns > 0)
{
expected_eof++;
// Column definition packets plus one for the EOF
expected_packets += resp.columns + 1;
}
if (resp.parameters > 0)
{
expected_eof++;
// Parameter definition packets plus one for the EOF
expected_packets += resp.parameters + 1;
}
bool more;
int n_eof = modutil_count_signal_packets(buffer, 0, &more, NULL);
int n_packets = modutil_count_packets(buffer);
MXS_DEBUG("Expecting %u EOF, have %u", n_eof, expected_eof);
MXS_DEBUG("Expecting %u packets, have %u", n_packets, expected_packets);
rval = n_eof == expected_eof;
rval = n_packets == expected_packets;
}
return rval;

View File

@ -103,6 +103,10 @@ bool RWBackend::write(GWBUF* buffer, response_type type)
// Any non-zero flag value means that we have an open cursor
m_opening_cursor = flags != 0;
}
else if (cmd == MXS_COM_STMT_CLOSE)
{
m_ps_handles.erase(it);
}
else if (cmd == MXS_COM_STMT_FETCH)
{
// Number of rows to fetch is a 4 byte integer after the ID

View File

@ -412,6 +412,13 @@ bool RWSplitSession::route_session_write(GWBUF* querybuf, uint8_t command, uint3
{
if (mxs_mysql_is_ps_command(m_qc.current_route_info().command()))
{
if (command == MXS_COM_STMT_CLOSE)
{
// Remove the command from the PS mapping
m_qc.ps_erase(querybuf);
m_exec_map.erase(m_qc.current_route_info().stmt_id());
}
/**
* Replace the ID with our internal one, the backends will replace it with their own ID
* when the packet is being written. We use the internal ID when we store the command
@ -519,6 +526,11 @@ bool RWSplitSession::route_session_write(GWBUF* querybuf, uint8_t command, uint3
{
m_sescmd_responses.erase(m_sescmd_responses.begin(), it);
}
else
{
// All responses processed
m_sescmd_responses.clear();
}
}
else
{

View File

@ -287,7 +287,6 @@ private:
uint64_t m_sent_sescmd; /**< ID of the last sent session command*/
uint64_t m_recv_sescmd; /**< ID of the most recently completed session
* command */
ClientHandleMap m_ps_handles; /**< Client PS handle to internal ID mapping */
ExecMap m_exec_map; /**< Map of COM_STMT_EXECUTE statement IDs to
* Backends */
std::string m_gtid_pos; /**< Gtid position for causal read */