From 2e2eb4cbfe0824ed242f128769db131a988b6977 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Thu, 28 Jan 2016 12:19:23 +0800 Subject: [PATCH] AsyncConnection: let ack reply use MSG_MORE flag Signed-off-by: Haomai Wang --- src/msg/async/AsyncConnection.cc | 8 ++++---- src/msg/async/AsyncConnection.h | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/msg/async/AsyncConnection.cc b/src/msg/async/AsyncConnection.cc index 01a7335293ab..8c0cccb295cb 100644 --- a/src/msg/async/AsyncConnection.cc +++ b/src/msg/async/AsyncConnection.cc @@ -347,7 +347,7 @@ ssize_t AsyncConnection::do_sendmsg(struct msghdr &msg, unsigned len, bool more) // return the remaining bytes, it may larger than the length of ptr // else return < 0 means error -ssize_t AsyncConnection::_try_send(bufferlist &send_bl, bool send) +ssize_t AsyncConnection::_try_send(bufferlist &send_bl, bool send, bool more) { ldout(async_msgr->cct, 20) << __func__ << " send bl length is " << send_bl.length() << dendl; if (send_bl.length()) { @@ -384,7 +384,7 @@ ssize_t AsyncConnection::_try_send(bufferlist &send_bl, bool send) size--; } - ssize_t r = do_sendmsg(msg, msglen, left_pbrs); + ssize_t r = do_sendmsg(msg, msglen, left_pbrs || more); if (r < 0) return r; @@ -2459,7 +2459,7 @@ void AsyncConnection::_send_keepalive_or_ack(bool ack, utime_t *tp) } ldout(async_msgr->cct, 10) << __func__ << " try send keepalive or ack" << dendl; - _try_send(bl, false); + _try_send(bl, false, true); } void AsyncConnection::handle_write() @@ -2503,7 +2503,7 @@ void AsyncConnection::handle_write() bl.append((char*)&s, sizeof(s)); ldout(async_msgr->cct, 10) << __func__ << " try send msg ack, acked " << left << " messages" << dendl; ack_left.sub(left); - r = _try_send(bl); + r = _try_send(bl, true, true); } else if (is_queued()) { r = _try_send(bl); } diff --git a/src/msg/async/AsyncConnection.h b/src/msg/async/AsyncConnection.h index 44dc1f436ad7..049c2afee15a 100644 --- a/src/msg/async/AsyncConnection.h +++ b/src/msg/async/AsyncConnection.h @@ -49,13 +49,13 @@ class AsyncConnection : public Connection { void suppress_sigpipe(); void restore_sigpipe(); ssize_t do_sendmsg(struct msghdr &msg, unsigned len, bool more); - ssize_t try_send(bufferlist &bl, bool send=true) { + ssize_t try_send(bufferlist &bl, bool send=true, bool more=false) { Mutex::Locker l(write_lock); - return _try_send(bl, send); + return _try_send(bl, send, more); } // if "send" is false, it will only append bl to send buffer // the main usage is avoid error happen outside messenger threads - ssize_t _try_send(bufferlist &bl, bool send=true); + ssize_t _try_send(bufferlist &bl, bool send=true, bool more=false); ssize_t _send(Message *m); void prepare_send_message(uint64_t features, Message *m, bufferlist &bl); ssize_t read_until(unsigned needed, char *p); -- 2.47.3