]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
msg, msg/async, v2: introduce late message abort facility.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Sat, 2 Mar 2019 13:13:48 +0000 (14:13 +0100)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Sat, 2 Mar 2019 13:19:39 +0000 (14:19 +0100)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/include/msgr.h
src/msg/async/ProtocolV2.cc
src/msg/async/ProtocolV2.h

index 4029443d0a4e588b5288c92ba50b511220134a70..c61bebda0f61e9cf83331ed9ae3b2f2bd2fca4a5 100644 (file)
@@ -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
index 5230436f7e86a9ee688963b94ee4d17eb3afc873..3030f173747eca413e58710bc305e01b79244eae 100644 (file)
@@ -248,6 +248,10 @@ void ProtocolV2::reset_recv_state() {
   sent_tag = static_cast<Tag>(0);
   next_tag = static_cast<Tag>(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],
index ab58a9a5da9d58822eb8280de8fd22282573fcb9..d49b3c9a2af346b6ee5cb5951f5a3011268a161d 100644 (file)
@@ -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<ProtocolV2> *_fault();
   void discard_out_queue();
   void reset_session();