MXS-2609: Store history size in Backend

When a connection is created, the size of the history that is about to be
replayed is known. Storing this and decrementing it each time a session
command is completed tells us when the Backend has finished replaying the
session command history. This can then be used to distinguish whether a
session command executed on a master should be retried or whether to
simply discard the connection.
This commit is contained in:
Markus Mäkelä 2019-08-07 13:23:11 +03:00
parent 8bc4e42f2d
commit 547236b7a4
No known key found for this signature in database
GPG Key ID: 72D48FCE664F7B19
2 changed files with 22 additions and 2 deletions

View File

@ -303,6 +303,16 @@ public:
return m_state & FATAL_FAILURE;
}
/**
* Is the backend replaying session command history
*
* @return If a list of session commands was provided at connect time, the function returns true as long
* as the backend has not completed those session commands.
*/
inline bool is_replaying_history() const
{
return m_history_size > 0;
}
/**
* @brief Get the object name of this server
@ -389,7 +399,8 @@ private:
maxbase::StopWatch m_session_timer;
maxbase::IntervalTimer m_select_timer;
int64_t m_num_selects = 0;
int64_t m_num_selects {0};
int64_t m_history_size {0};
};
typedef std::shared_ptr<Backend> SBackend;

View File

@ -54,6 +54,7 @@ void Backend::close(close_type type)
m_closed = true;
m_closed_at = time(NULL);
m_session_commands.clear();
m_history_size = 0;
if (in_use())
{
@ -139,6 +140,12 @@ uint64_t Backend::complete_session_command()
{
uint64_t rval = m_session_commands.front()->get_position();
m_session_commands.pop_front();
if (m_history_size > 0)
{
--m_history_size;
}
return rval;
}
@ -192,10 +199,12 @@ bool Backend::connect(MXS_SESSION* session, SessionCommandList* sescmd)
m_state = IN_USE;
mxb::atomic::add(&m_backend->connections, 1, mxb::atomic::RELAXED);
rval = true;
m_history_size = 0;
if (sescmd && sescmd->size())
if (sescmd && !sescmd->empty())
{
append_session_command(*sescmd);
m_history_size = sescmd->size();
if (!execute_session_command())
{