]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-replay: handle EOF gracefully 7416/head
authorMykola Golub <mgolub@mirantis.com>
Thu, 21 Jan 2016 11:45:42 +0000 (13:45 +0200)
committerLoic Dachary <ldachary@redhat.com>
Fri, 29 Jan 2016 05:19:58 +0000 (12:19 +0700)
Fixes: #14452
Signed-off-by: Mykola Golub <mgolub@mirantis.com>
(cherry picked from commit c59b84c3e2c9bbda68219e4d2288a889dd9ca6cb)

Conflicts:
src/rbd_replay/BufferReader.cc: trivial resolution
        caused by s/CEPH_PAGE_SIZE/CEPH_BUFFER_APPEND_SIZE/
        in the context of one hunk.

src/rbd_replay/BufferReader.cc
src/rbd_replay/BufferReader.h
src/rbd_replay/Replayer.cc

index 4d1b604c856ffe279b1e9585852a06c6edce85b6..5bf2cc23154d5dc9adf21316b33c4876b76fa9f7 100644 (file)
@@ -10,7 +10,7 @@ namespace rbd_replay {
 
 BufferReader::BufferReader(int fd, size_t min_bytes, size_t max_bytes)
   : m_fd(fd), m_min_bytes(min_bytes), m_max_bytes(max_bytes),
-    m_bl_it(m_bl.begin()) {
+    m_bl_it(m_bl.begin()), m_eof_reached(false) {
   assert(m_min_bytes <= m_max_bytes);
 }
 
@@ -18,11 +18,14 @@ int BufferReader::fetch(bufferlist::iterator **it) {
   if (m_bl_it.get_remaining() < m_min_bytes) {
     ssize_t bytes_to_read = ROUND_UP_TO(m_max_bytes - m_bl_it.get_remaining(),
                                         CEPH_PAGE_SIZE);
-    while (bytes_to_read > 0) {
+    while (!m_eof_reached && bytes_to_read > 0) {
       int r = m_bl.read_fd(m_fd, CEPH_PAGE_SIZE);
       if (r < 0) {
         return r;
       }
+      if (r == 0) {
+       m_eof_reached = true;
+      }
       assert(r <= bytes_to_read);
       bytes_to_read -= r;
     }
index 95b1533ba59e319117b95e3977b60aa0fd3af1f3..07f7b09ccaaa2bcddc9bec8c0197663bb86e0881 100644 (file)
@@ -25,6 +25,7 @@ private:
   size_t m_max_bytes;
   bufferlist m_bl;
   bufferlist::iterator m_bl_it;
+  bool m_eof_reached;
 
 };
 
index d62aedb6b7769fa0f7428d59667cf7bc1fb199ff..a40e886eec6eaa02547adaf2479013a4624f110a 100644 (file)
@@ -222,6 +222,9 @@ void Replayer::run(const std::string& replay_file) {
                       << std::endl;
             exit(-r);
           }
+         if (it->get_remaining() == 0) {
+           break;
+         }
 
           if (versioned) {
             action_entry.decode(*it);
@@ -229,7 +232,7 @@ void Replayer::run(const std::string& replay_file) {
             action_entry.decode_unversioned(*it);
           }
         } catch (const buffer::error &err) {
-          std::cerr << "Failed to decode trace action" << std::endl;
+          std::cerr << "Failed to decode trace action: " << err.what() << std::endl;
           exit(1);
         }