From: Mykola Golub Date: Thu, 21 Jan 2016 11:45:42 +0000 (+0200) Subject: rbd-replay: handle EOF gracefully X-Git-Tag: v10.0.4~188^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F7310%2Fhead;p=ceph.git rbd-replay: handle EOF gracefully Fixes: #14452 Signed-off-by: Mykola Golub --- diff --git a/src/rbd_replay/BufferReader.cc b/src/rbd_replay/BufferReader.cc index f1327b7f3f88..a93302a67b8d 100644 --- a/src/rbd_replay/BufferReader.cc +++ b/src/rbd_replay/BufferReader.cc @@ -9,7 +9,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); } @@ -17,11 +17,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_BUFFER_APPEND_SIZE); - while (bytes_to_read > 0) { + while (!m_eof_reached && bytes_to_read > 0) { int r = m_bl.read_fd(m_fd, CEPH_BUFFER_APPEND_SIZE); if (r < 0) { return r; } + if (r == 0) { + m_eof_reached = true; + } assert(r <= bytes_to_read); bytes_to_read -= r; } diff --git a/src/rbd_replay/BufferReader.h b/src/rbd_replay/BufferReader.h index 95b1533ba59e..07f7b09ccaaa 100644 --- a/src/rbd_replay/BufferReader.h +++ b/src/rbd_replay/BufferReader.h @@ -25,6 +25,7 @@ private: size_t m_max_bytes; bufferlist m_bl; bufferlist::iterator m_bl_it; + bool m_eof_reached; }; diff --git a/src/rbd_replay/Replayer.cc b/src/rbd_replay/Replayer.cc index b37f226dbe47..ea0f9a08f7e9 100644 --- a/src/rbd_replay/Replayer.cc +++ b/src/rbd_replay/Replayer.cc @@ -224,6 +224,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); @@ -231,7 +234,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); }