]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/OutputDataSocket: actually discard data on full buffer 29310/head
authorMatt Benjamin <mbenjamin@redhat.com>
Wed, 5 Jun 2019 17:25:32 +0000 (13:25 -0400)
committerNathan Cutler <ncutler@suse.com>
Thu, 25 Jul 2019 10:20:26 +0000 (12:20 +0200)
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 <mbenjamin@redhat.com>
(cherry picked from commit c806b825dae649829de8847d36cb21ffd2bbee8e)

src/common/OutputDataSocket.cc
src/common/OutputDataSocket.h

index daba820cf05a3b2a4f26e348dcc307238d35e79a..fd01504487ff995d7d137067ed620e250a4db5a8 100644 (file)
@@ -93,7 +93,8 @@ OutputDataSocket::OutputDataSocket(CephContext *cct, uint64_t _backlog)
     m_shutdown_rd_fd(-1),
     m_shutdown_wr_fd(-1),
     going_down(false),
-    data_size(0)
+    data_size(0),
+    skipped(0)
 {
 }
 
@@ -291,12 +292,12 @@ void OutputDataSocket::handle_connection(int fd)
 int OutputDataSocket::dump_data(int fd)
 {
   m_lock.lock();
-  list<bufferlist> l = std::move(data);
+  vector<buffer::list> l = std::move(data);
   data.clear();
   data_size = 0;
   m_lock.unlock();
 
-  for (list<bufferlist>::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)
   std::lock_guard 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.notify_all();
 }
index e974d1b58c5da33a3a14e7e0ce62dc7c9b9df299..682dfcc6cb6503e98378ffb086f6ac996f170113 100644 (file)
@@ -55,13 +55,13 @@ protected:
   bool going_down;
 
   uint64_t data_size;
+  uint32_t skipped;
 
-  std::list<bufferlist> data;
+  std::vector<buffer::list> data;
 
   ceph::mutex m_lock = ceph::make_mutex("OutputDataSocket::m_lock");
   ceph::condition_variable cond;
-
-  bufferlist delim;
+  buffer::list delim;
 };
 
 #endif