From 1ad8ae97d3831a271ead76b4eb96bb696f92bdc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Tue, 30 Jun 2020 15:14:14 +0300 Subject: [PATCH] MXS-3054: Prevent pooling of DCBs with inbound data If a DCB is expecting a response from the server, it must not be placed into the connection pool. This prevents the case where unexpected responses would be delivered to DCBs taken out of the connection pool. --- include/maxscale/dcb.hh | 1 + server/core/backend.cc | 1 + server/core/dcb.cc | 1 + 3 files changed, 3 insertions(+) diff --git a/include/maxscale/dcb.hh b/include/maxscale/dcb.hh index b731d0bbc..988b6b781 100644 --- a/include/maxscale/dcb.hh +++ b/include/maxscale/dcb.hh @@ -189,6 +189,7 @@ struct DCB : public MXB_POLL_DATA * -1: Evicted from the persistent pool and being closed. * non-0: Time when placed in the persistent pool. */ + bool valid_for_pool = true; // TODO: Make this private in 2.5 SERVICE* service = nullptr; /**< The related service */ void* data = nullptr; /**< Client protocol data, owned by client DCB */ void* authenticator_data = nullptr;/**< The authenticator data for this DCB */ diff --git a/server/core/backend.cc b/server/core/backend.cc index d95b25299..5467327b5 100644 --- a/server/core/backend.cc +++ b/server/core/backend.cc @@ -61,6 +61,7 @@ void Backend::close(close_type type) /** Clean operation counter in bref and in SERVER */ if (is_waiting_result()) { + m_dcb->valid_for_pool = false; clear_state(WAITING_RESULT); } clear_state(IN_USE); diff --git a/server/core/dcb.cc b/server/core/dcb.cc index 31c4c0c26..0a927981f 100644 --- a/server/core/dcb.cc +++ b/server/core/dcb.cc @@ -1260,6 +1260,7 @@ static bool dcb_maybe_add_persistent(DCB* dcb) && strlen(dcb->user) && server && dcb->session + && dcb->valid_for_pool && session_valid_for_pool(dcb->session) && server->persistpoolmax() && (server->status & SERVER_RUNNING)