From 04f70879d29ad90f208df447afcd08e3a6f3dc72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Wed, 27 Mar 2019 11:58:31 +0200 Subject: [PATCH] MXS-2410: Uniquely identify DCBs The address alone doesn't guarantee validity of a DCB. --- include/maxscale/dcb.h | 2 ++ server/core/dcb.cc | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/include/maxscale/dcb.h b/include/maxscale/dcb.h index a6e08a1d0..e5d14942f 100644 --- a/include/maxscale/dcb.h +++ b/include/maxscale/dcb.h @@ -184,6 +184,8 @@ typedef struct dcb uint32_t n_close; /** How many times dcb_close has been called. */ char *path; /** If a Unix socket, the path it was bound to. */ skygw_chk_t dcb_chk_tail; + + uint64_t m_uid; /**< Unique identifier for this DCB */ } DCB; /** diff --git a/server/core/dcb.cc b/server/core/dcb.cc index 945bacb9b..1227d0806 100644 --- a/server/core/dcb.cc +++ b/server/core/dcb.cc @@ -168,6 +168,8 @@ dcb_initialize(DCB *dcb) *dcb = this_unit.dcb_initialized; } +static uint64_t uid_generator = 0; + /** * @brief Allocate a new DCB. * @@ -196,6 +198,7 @@ dcb_alloc(dcb_role_t role, SERV_LISTENER *listener) newdcb->dcb_role = role; newdcb->listener = listener; newdcb->last_read = hkheartbeat; + newdcb->m_uid = atomic_add_uint64(&uid_generator, 1); if (role == DCB_ROLE_SERVICE_LISTENER) { @@ -3223,13 +3226,14 @@ public: FakeEventTask(DCB* dcb, GWBUF* buf, uint32_t ev): m_dcb(dcb), m_buffer(buf), - m_ev(ev) + m_ev(ev), + m_uid(dcb->m_uid) { } void execute(Worker& worker) { - if (dcb_is_still_valid(m_dcb, worker.get_current_id())) + if (dcb_is_still_valid(m_dcb, worker.get_current_id()) && m_dcb->m_uid == m_uid) { m_dcb->fakeq = m_buffer; dcb_handler(m_dcb, m_ev); @@ -3244,6 +3248,7 @@ private: DCB* m_dcb; GWBUF* m_buffer; uint32_t m_ev; + uint64_t m_uid; /**< DCB UID guarantees we deliver the event to the correct DCB */ }; static void poll_add_event_to_dcb(DCB* dcb, GWBUF* buf, uint32_t ev)