From: Matt Benjamin Date: Wed, 5 Jun 2019 17:25:32 +0000 (-0400) Subject: rgw/OutputDataSocket: actually discard data on full buffer X-Git-Tag: v12.2.13~29^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=42add01ac7ba93413784de93fa9b64c1afa0e2a8;p=ceph.git rgw/OutputDataSocket: actually discard data on full buffer A dout message in OutputDataSocket::append_output() states that data will be dropped when appending would cause data_max_backlog to be exceeded--but the method appends it anyway. Log output discards at level 0, as messages will be lost. Suppress repeated warnings mod 100. Switch to vector. Fixes: http://tracker.ceph.com/issues/40178 Signed-off-by: Matt Benjamin (cherry picked from commit c806b825dae649829de8847d36cb21ffd2bbee8e) Conflicts: src/common/OutputDataSocket.cc src/common/OutputDataSocket.h --- diff --git a/src/common/OutputDataSocket.cc b/src/common/OutputDataSocket.cc index d17ae9022ef..eaced2f2b3d 100644 --- a/src/common/OutputDataSocket.cc +++ b/src/common/OutputDataSocket.cc @@ -92,6 +92,7 @@ OutputDataSocket::OutputDataSocket(CephContext *cct, uint64_t _backlog) m_shutdown_wr_fd(-1), going_down(false), data_size(0), + skipped(0), m_lock("OutputDataSocket::m_lock") { } @@ -290,12 +291,12 @@ void OutputDataSocket::handle_connection(int fd) int OutputDataSocket::dump_data(int fd) { m_lock.Lock(); - list l = std::move(data); + vector l = std::move(data); data.clear(); data_size = 0; m_lock.Unlock(); - for (list::iterator iter = l.begin(); iter != l.end(); ++iter) { + for (auto iter = l.begin(); iter != l.end(); ++iter) { bufferlist& bl = *iter; int ret = safe_write(fd, bl.c_str(), bl.length()); if (ret >= 0) { @@ -385,11 +386,17 @@ void OutputDataSocket::append_output(bufferlist& bl) Mutex::Locker l(m_lock); if (data_size + bl.length() > data_max_backlog) { - ldout(m_cct, 20) << "dropping data output, max backlog reached" << dendl; + if (skipped % 100 == 0) { + ldout(m_cct, 0) << "dropping data output, max backlog reached (skipped==" + << skipped << ")" + << dendl; + skipped = 1; + } else + ++skipped; + return; } - data.push_back(bl); + data.push_back(bl); data_size += bl.length(); - cond.Signal(); } diff --git a/src/common/OutputDataSocket.h b/src/common/OutputDataSocket.h index 0bce1ded790..7e589710287 100644 --- a/src/common/OutputDataSocket.h +++ b/src/common/OutputDataSocket.h @@ -53,13 +53,13 @@ protected: bool going_down; uint64_t data_size; + uint32_t skipped; - std::list data; + std::vector data; Mutex m_lock; Cond cond; - - bufferlist delim; + buffer::list delim; }; #endif