Acknowledge one-way commands immediately

The Backend class response state tracking was not updated when a one-way
command was executed. This caused the logic in handleError to break if a
master was executing a command that wouldn't create a response.
This commit is contained in:
Markus Mäkelä
2018-06-12 23:49:47 +03:00
parent 1ea94501e4
commit d2e7be2ca0

View File

@ -403,6 +403,10 @@ bool RWSplitSession::route_session_write(GWBUF *querybuf, uint8_t command, uint3
{ {
m_expected_responses++; m_expected_responses++;
} }
else
{
backend->ack_write();
}
MXS_INFO("Route query to %s: %s \t%s", MXS_INFO("Route query to %s: %s \t%s",
backend->is_master() ? "master" : "slave", backend->is_master() ? "master" : "slave",
@ -1006,10 +1010,13 @@ bool RWSplitSession::handle_got_target(GWBUF* querybuf, SRWBackend& target, bool
atomic_add_uint64(&m_router->stats().n_queries, 1); atomic_add_uint64(&m_router->stats().n_queries, 1);
atomic_add_uint64(&target->server()->stats.packets, 1); atomic_add_uint64(&target->server()->stats.packets, 1);
if (!m_qc.large_query() && response == mxs::Backend::EXPECT_RESPONSE) if (!m_qc.large_query())
{
ss_dassert(target->get_reply_state() == REPLY_STATE_DONE);
if (response == mxs::Backend::EXPECT_RESPONSE)
{ {
/** The server will reply to this command */ /** The server will reply to this command */
ss_dassert(target->get_reply_state() == REPLY_STATE_DONE);
target->set_reply_state(REPLY_STATE_START); target->set_reply_state(REPLY_STATE_START);
m_expected_responses++; m_expected_responses++;
@ -1021,6 +1028,12 @@ bool RWSplitSession::handle_got_target(GWBUF* querybuf, SRWBackend& target, bool
m_qc.set_load_data_state(QueryClassifier::LOAD_DATA_INACTIVE); m_qc.set_load_data_state(QueryClassifier::LOAD_DATA_INACTIVE);
} }
} }
else
{
// The server won't respond, mark it as done
target->ack_write();
}
}
m_qc.set_large_query(large_query); m_qc.set_large_query(large_query);