From f8053d08ee072f12084e56ce4ce9a78a1e30b96c Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Thu, 8 Aug 2019 16:25:43 +0800 Subject: [PATCH] crimson/net: STANDBY state for lossless server or peer Signed-off-by: Yingxin Cheng --- src/crimson/net/Protocol.cc | 1 + src/crimson/net/Protocol.h | 2 ++ src/crimson/net/ProtocolV2.cc | 14 +++++++++++--- src/crimson/net/ProtocolV2.h | 2 ++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/crimson/net/Protocol.cc b/src/crimson/net/Protocol.cc index 2a70b9f4b3e..ba21d726c8a 100644 --- a/src/crimson/net/Protocol.cc +++ b/src/crimson/net/Protocol.cc @@ -265,6 +265,7 @@ seastar::future Protocol::do_write_dispatch_sweep() void Protocol::write_event() { + notify_write(); if (write_dispatching) { // already dispatching return; diff --git a/src/crimson/net/Protocol.h b/src/crimson/net/Protocol.h index c3d127083d8..f3a7443a12f 100644 --- a/src/crimson/net/Protocol.h +++ b/src/crimson/net/Protocol.h @@ -47,6 +47,8 @@ class Protocol { std::optional keepalive_ack, bool require_ack) = 0; + virtual void notify_write() {}; + public: const proto_t proto_type; diff --git a/src/crimson/net/ProtocolV2.cc b/src/crimson/net/ProtocolV2.cc index 79023d32838..901158b8751 100644 --- a/src/crimson/net/ProtocolV2.cc +++ b/src/crimson/net/ProtocolV2.cc @@ -1759,9 +1759,17 @@ void ProtocolV2::execute_ready() void ProtocolV2::execute_standby() { - // TODO not implemented - // trigger_state(state_t::STANDBY, write_state_t::delay, false); - ceph_assert(false); + trigger_state(state_t::STANDBY, write_state_t::delay, true); + if (socket) { + socket->shutdown(); + } +} + +void ProtocolV2::notify_write() +{ + if (unlikely(state == state_t::STANDBY && !conn.policy.server)) { + execute_connecting(); + } } // WAIT state diff --git a/src/crimson/net/ProtocolV2.h b/src/crimson/net/ProtocolV2.h index bce428c6297..ed880a57f32 100644 --- a/src/crimson/net/ProtocolV2.h +++ b/src/crimson/net/ProtocolV2.h @@ -32,6 +32,8 @@ class ProtocolV2 final : public Protocol { std::optional keepalive_ack, bool require_ack) override; + void notify_write() override; + private: SocketMessenger &messenger;