MXS-2295: Keep the COM_CHANGE_USER command
If the whole session command history is cleared, the COM_CHANGE_USER is lost and the connections can end up using different users.
This commit is contained in:
		@ -165,14 +165,28 @@ void RWSplitSession::process_sescmd_response(SRWBackend& backend, GWBUF** ppPack
 | 
				
			|||||||
        if (m_expected_responses == 0
 | 
					        if (m_expected_responses == 0
 | 
				
			||||||
            && (command == MXS_COM_CHANGE_USER || command == MXS_COM_RESET_CONNECTION))
 | 
					            && (command == MXS_COM_CHANGE_USER || command == MXS_COM_RESET_CONNECTION))
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					            mxb_assert_message(m_slave_responses.empty(), "All responses should've been processed");
 | 
				
			||||||
            // This is the last session command to finish that resets the session state, reset the history
 | 
					            // This is the last session command to finish that resets the session state, reset the history
 | 
				
			||||||
            MXS_INFO("Resetting session command history (length: %lu)", m_sescmd_list.size());
 | 
					            MXS_INFO("Resetting session command history (length: %lu)", m_sescmd_list.size());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /**
 | 
				
			||||||
 | 
					             * Since new connections need to perform the COM_CHANGE_USER, pop it off the list along
 | 
				
			||||||
 | 
					             * with the expected response to it.
 | 
				
			||||||
 | 
					             */
 | 
				
			||||||
 | 
					            SSessionCommand latest = m_sescmd_list.back();
 | 
				
			||||||
 | 
					            cmd = m_sescmd_responses[latest->get_position()];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            m_sescmd_list.clear();
 | 
					            m_sescmd_list.clear();
 | 
				
			||||||
            m_sescmd_responses.clear();
 | 
					            m_sescmd_responses.clear();
 | 
				
			||||||
            m_slave_responses.clear();
 | 
					
 | 
				
			||||||
            m_recv_sescmd = 0;
 | 
					            // Push the response back as the first executed session command
 | 
				
			||||||
            m_sent_sescmd = 0;
 | 
					            m_sescmd_list.push_back(latest);
 | 
				
			||||||
            m_sescmd_count = 1;
 | 
					            m_sescmd_responses[latest->get_position()] = cmd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Adjust counters to match the number of stored session commands
 | 
				
			||||||
 | 
					            m_recv_sescmd = 1;
 | 
				
			||||||
 | 
					            m_sent_sescmd = 1;
 | 
				
			||||||
 | 
					            m_sescmd_count = 2;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -139,7 +139,7 @@ public:
 | 
				
			|||||||
    int                 m_last_keepalive_check; /**< When the last ping was done */
 | 
					    int                 m_last_keepalive_check; /**< When the last ping was done */
 | 
				
			||||||
    int                 m_nbackends;            /**< Number of backend servers (obsolete) */
 | 
					    int                 m_nbackends;            /**< Number of backend servers (obsolete) */
 | 
				
			||||||
    DCB*                m_client;               /**< The client DCB */
 | 
					    DCB*                m_client;               /**< The client DCB */
 | 
				
			||||||
    uint64_t            m_sescmd_count;         /**< Number of executed session commands */
 | 
					    uint64_t            m_sescmd_count;         /**< Number of executed session commands (starts from 1) */
 | 
				
			||||||
    int                 m_expected_responses;   /**< Number of expected responses to the current
 | 
					    int                 m_expected_responses;   /**< Number of expected responses to the current
 | 
				
			||||||
                                                 * query */
 | 
					                                                 * query */
 | 
				
			||||||
    GWBUF*                  m_query_queue;      /**< Queued commands waiting to be executed */
 | 
					    GWBUF*                  m_query_queue;      /**< Queued commands waiting to be executed */
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user