From 33c6cf2ab276672d8a2b74a25631355c73f69bfa Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Sat, 2 Mar 2019 14:13:48 +0100 Subject: [PATCH] msg, msg/async, v2: introduce late message abort facility. Signed-off-by: Radoslaw Zarzynski --- src/include/msgr.h | 1 + src/msg/async/ProtocolV2.cc | 15 +++++++++++++++ src/msg/async/ProtocolV2.h | 1 + 3 files changed, 17 insertions(+) diff --git a/src/include/msgr.h b/src/include/msgr.h index 4029443d0a4e5..c61bebda0f61e 100644 --- a/src/include/msgr.h +++ b/src/include/msgr.h @@ -235,6 +235,7 @@ struct ceph_msg_footer { #define CEPH_MSG_FOOTER_COMPLETE (1<<0) /* msg wasn't aborted */ #define CEPH_MSG_FOOTER_NOCRC (1<<1) /* no data crc */ #define CEPH_MSG_FOOTER_SIGNED (1<<2) /* msg was signed */ +#define CEPH_MSG_FOOTER_LATEABRT (1<<3) /* msg was aborted after txing data */ #endif diff --git a/src/msg/async/ProtocolV2.cc b/src/msg/async/ProtocolV2.cc index 5230436f7e86a..3030f173747ec 100644 --- a/src/msg/async/ProtocolV2.cc +++ b/src/msg/async/ProtocolV2.cc @@ -248,6 +248,10 @@ void ProtocolV2::reset_recv_state() { sent_tag = static_cast(0); next_tag = static_cast(0); + reset_throttle(); +} + +void ProtocolV2::reset_throttle() { if (state > THROTTLE_MESSAGE && state <= THROTTLE_DONE && connection->policy.throttler_messages) { ldout(cct, 10) << __func__ << " releasing " << 1 @@ -1371,6 +1375,17 @@ CtPtr ProtocolV2::handle_message() { 0}; ceph_msg_footer footer{0, 0, 0, 0, current_header.flags}; + // we do have a mechanism that allows transmitter to start sending message + // and abort after putting entire data field on wire. This will be used by + // the kernel client to avoid unnecessary buffering. + if (current_header.flags & CEPH_MSG_FOOTER_LATEABRT) { + ceph_assert(state == THROTTLE_DONE); + + reset_throttle(); + state = READY; + return CONTINUE(read_frame); + } + Message *message = decode_message(cct, 0, header, footer, rx_segments_data[SegmentIndex::Msg::FRONT], rx_segments_data[SegmentIndex::Msg::MIDDLE], diff --git a/src/msg/async/ProtocolV2.h b/src/msg/async/ProtocolV2.h index ab58a9a5da9d5..d49b3c9a2af34 100644 --- a/src/msg/async/ProtocolV2.h +++ b/src/msg/async/ProtocolV2.h @@ -118,6 +118,7 @@ private: void requeue_sent(); uint64_t discard_requeued_up_to(uint64_t out_seq, uint64_t seq); void reset_recv_state(); + void reset_throttle(); Ct *_fault(); void discard_out_queue(); void reset_session(); -- 2.39.5