MXS-1825: Fix PS output parameter tracking for MySQL variants

The resultset processing for MySQL requires some extra work as it lacks
the proper SERVER_MORE_RESULTS_EXIST flag in the last EOF packet. Instead,
the first EOF packet has the SERVER_PS_OUT_PARAMS flag which needs to be
interpreted as a SERVER_MORE_RESULTS_EXIST flag for the second EOF packet.

Also corrected the EOF packet handling to do the flag checks in the code
that deals with the EOF packets.

As the modutil_state parameter is now used for more than large packet
tracking, the correct solution is to store this state object in the
readwritesplit session instead of interpreting it to a boolean value.
This commit is contained in:
Markus Mäkelä
2018-04-26 09:22:17 +03:00
parent 260fcf85ec
commit c97d2c94eb
4 changed files with 43 additions and 24 deletions

View File

@ -523,9 +523,9 @@ bool reply_is_complete(SRWBackend& backend, GWBUF *buffer)
if (backend->current_command() == MXS_COM_STMT_FETCH)
{
bool more = false;
modutil_state state = {backend->is_large_packet()};
modutil_state state = backend->get_modutil_state();
int n_eof = modutil_count_signal_packets(buffer, 0, &more, &state);
backend->set_large_packet(state.state);
backend->set_modutil_state(state);
// If the server responded with an error, n_eof > 0
if (n_eof > 0 || backend->consume_fetched_rows(buffer))
@ -569,10 +569,10 @@ bool reply_is_complete(SRWBackend& backend, GWBUF *buffer)
else
{
bool more = false;
modutil_state state = {backend->is_large_packet()};
modutil_state state = backend->get_modutil_state();
int n_old_eof = backend->get_reply_state() == REPLY_STATE_RSET_ROWS ? 1 : 0;
int n_eof = modutil_count_signal_packets(buffer, n_old_eof, &more, &state);
backend->set_large_packet(state.state);
backend->set_modutil_state(state);
if (n_eof > 2)
{

View File

@ -17,7 +17,7 @@
RWBackend::RWBackend(SERVER_REF* ref):
mxs::Backend(ref),
m_reply_state(REPLY_STATE_DONE),
m_large_packet(false),
m_modutil_state({}),
m_command(0),
m_opening_cursor(false),
m_expected_rows(0)

View File

@ -62,14 +62,14 @@ public:
// For COM_STMT_FETCH processing
bool consume_fetched_rows(GWBUF* buffer);
inline void set_large_packet(bool value)
inline void set_modutil_state(modutil_state value)
{
m_large_packet = value;
m_modutil_state = value;
}
inline bool is_large_packet() const
inline modutil_state get_modutil_state() const
{
return m_large_packet;
return m_modutil_state;
}
inline uint8_t current_command() const
@ -90,9 +90,7 @@ public:
private:
reply_state_t m_reply_state;
BackendHandleMap m_ps_handles; /**< Internal ID to backend PS handle mapping */
bool m_large_packet; /**< Used to store the state of the EOF packet
*calculation for result sets when the result
* contains very large rows */
modutil_state m_modutil_state; /**< @see modutil_count_signal_packets */
uint8_t m_command;
bool m_opening_cursor; /**< Whether we are opening a cursor */
uint32_t m_expected_rows; /**< Number of rows a COM_STMT_FETCH is retrieving */