Move transaction management into a subfunction
The readwritesplit transaction management was a large part of the clientReply function. Moving it into a separate function clarifies the clientReply function by hiding the comments and details of the transaction management.
This commit is contained in:
		@ -467,36 +467,8 @@ void RWSplitSession::trx_replay_next_stmt()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RWSplitSession::clientReply(GWBUF* writebuf, DCB* backend_dcb)
 | 
			
		||||
void RWSplitSession::manage_transactions(SRWBackend& backend, GWBUF* writebuf)
 | 
			
		||||
{
 | 
			
		||||
    DCB* client_dcb = backend_dcb->session->client_dcb;
 | 
			
		||||
 | 
			
		||||
    SRWBackend& backend = get_backend_from_dcb(backend_dcb);
 | 
			
		||||
 | 
			
		||||
    if (backend->get_reply_state() == REPLY_STATE_DONE)
 | 
			
		||||
    {
 | 
			
		||||
        if (connection_was_killed(writebuf))
 | 
			
		||||
        {
 | 
			
		||||
            // The connection was killed, we can safely ignore it. When the TCP connection is
 | 
			
		||||
            // closed, the router's error handling will sort it out.
 | 
			
		||||
            gwbuf_free(writebuf);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            /** If we receive an unexpected response from the server, the internal
 | 
			
		||||
             * logic cannot handle this situation. Routing the reply straight to
 | 
			
		||||
             * the client should be the safest thing to do at this point. */
 | 
			
		||||
            log_unexpected_response(backend, writebuf, m_current_query.get());
 | 
			
		||||
            MXS_SESSION_ROUTE_REPLY(backend_dcb->session, writebuf);
 | 
			
		||||
        }
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((writebuf = handle_causal_read_reply(writebuf, backend)) == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return;     // Nothing to route, return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (m_otrx_state == OTRX_ROLLBACK)
 | 
			
		||||
    {
 | 
			
		||||
        /** This is the response to the ROLLBACK. If it fails, we must close
 | 
			
		||||
@ -506,7 +478,7 @@ void RWSplitSession::clientReply(GWBUF* writebuf, DCB* backend_dcb)
 | 
			
		||||
 | 
			
		||||
        if (!mxs_mysql_is_ok_packet(writebuf))
 | 
			
		||||
        {
 | 
			
		||||
            poll_fake_hangup_event(backend_dcb);
 | 
			
		||||
            poll_fake_hangup_event(backend->dcb());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else if (m_config.transaction_replay && m_can_replay_trx
 | 
			
		||||
@ -559,6 +531,39 @@ void RWSplitSession::clientReply(GWBUF* writebuf, DCB* backend_dcb)
 | 
			
		||||
         * in case the connection breaks in the middle of a resultset. */
 | 
			
		||||
        m_current_query.reset();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RWSplitSession::clientReply(GWBUF* writebuf, DCB* backend_dcb)
 | 
			
		||||
{
 | 
			
		||||
    DCB* client_dcb = backend_dcb->session->client_dcb;
 | 
			
		||||
    SRWBackend& backend = get_backend_from_dcb(backend_dcb);
 | 
			
		||||
 | 
			
		||||
    if (backend->get_reply_state() == REPLY_STATE_DONE)
 | 
			
		||||
    {
 | 
			
		||||
        if (connection_was_killed(writebuf))
 | 
			
		||||
        {
 | 
			
		||||
            // The connection was killed, we can safely ignore it. When the TCP connection is
 | 
			
		||||
            // closed, the router's error handling will sort it out.
 | 
			
		||||
            gwbuf_free(writebuf);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            /** If we receive an unexpected response from the server, the internal
 | 
			
		||||
             * logic cannot handle this situation. Routing the reply straight to
 | 
			
		||||
             * the client should be the safest thing to do at this point. */
 | 
			
		||||
            log_unexpected_response(backend, writebuf, m_current_query.get());
 | 
			
		||||
            MXS_SESSION_ROUTE_REPLY(backend_dcb->session, writebuf);
 | 
			
		||||
        }
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((writebuf = handle_causal_read_reply(writebuf, backend)) == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return;     // Nothing to route, return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Track transaction contents and handle ROLLBACK with aggressive transaction load balancing
 | 
			
		||||
    manage_transactions(backend, writebuf);
 | 
			
		||||
 | 
			
		||||
    backend->process_reply(writebuf);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -215,6 +215,7 @@ private:
 | 
			
		||||
 | 
			
		||||
    void handle_error_reply_client(DCB* backend_dcb, GWBUF* errmsg);
 | 
			
		||||
    bool handle_error_new_connection(DCB* backend_dcb, GWBUF* errmsg);
 | 
			
		||||
    void manage_transactions(mxs::SRWBackend& backend, GWBUF* writebuf);
 | 
			
		||||
 | 
			
		||||
    void trx_replay_next_stmt();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user