diff --git a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc index d9d1f5105..0ac458292 100644 --- a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc +++ b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc @@ -202,6 +202,15 @@ bool route_single_stmt(RWSplit *inst, RWSplitSession *rses, GWBUF *querybuf, con if (not_locked_to_master && is_ps_command(command)) { + if (command == MXS_COM_STMT_CLOSE) + { + // Remove the command from the PS mapping + ss_dassert(TARGET_IS_ALL(route_target)); + rses->ps_manager.erase(stmt_id); + rses->ps_handles.erase(mxs_mysql_extract_ps_id(querybuf)); + rses->exec_map.erase(stmt_id); + } + /** Replace the client statement ID with our internal one only if the * target node is not the current master */ replace_binary_ps_id(querybuf, stmt_id); @@ -422,6 +431,11 @@ bool route_session_write(RWSplitSession *rses, GWBUF *querybuf, { rses->sescmd_responses.erase(rses->sescmd_responses.begin(), it); } + else + { + // All responses processed + rses->sescmd_responses.clear(); + } } else { diff --git a/server/modules/routing/readwritesplit/rwsplitsession.cc b/server/modules/routing/readwritesplit/rwsplitsession.cc index beeba1bbc..858614f3b 100644 --- a/server/modules/routing/readwritesplit/rwsplitsession.cc +++ b/server/modules/routing/readwritesplit/rwsplitsession.cc @@ -86,6 +86,10 @@ bool RWBackend::write(GWBUF* buffer, response_type type) // Any non-zero flag value means that we have an open cursor m_opening_cursor = flags != 0; } + else if (cmd == MXS_COM_STMT_CLOSE) + { + m_ps_handles.erase(it); + } else if (cmd == MXS_COM_STMT_FETCH) { // Number of rows to fetch is a 4 byte integer after the ID