]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
journal: properly handle immediate overflow upon advancing object set 31392/head
authorJason Dillaman <dillaman@redhat.com>
Thu, 14 Nov 2019 01:01:16 +0000 (20:01 -0500)
committerJason Dillaman <dillaman@redhat.com>
Tue, 19 Nov 2019 13:45:46 +0000 (08:45 -0500)
While the old set is being closed, additional IO can be queued up within
the old, closed objects while the in-flight IO settles. It's therefore
possible that the queued IO that is transferred from the old set to the
new set causes an immediate overflow of the new set.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/journal/JournalRecorder.cc
src/journal/JournalRecorder.h

index e85fdb4ef0c1ac1fe6e8fe8b27fbba40ac000a3d..0304ae777a96c31ca38f991e2732c5a7f0c26312 100644 (file)
@@ -258,6 +258,7 @@ void JournalRecorder::open_object_set() {
   ldout(m_cct, 10) << "opening object set " << m_current_set << dendl;
 
   uint8_t splay_width = m_journal_metadata->get_splay_width();
+  bool overflowed = false;
 
   auto lockers{lock_object_recorders()};
   for (const auto& p : m_object_ptrs) {
@@ -267,9 +268,18 @@ void JournalRecorder::open_object_set() {
       ceph_assert(object_recorder->is_closed());
 
       // ready to close object and open object in active set
-      create_next_object_recorder(object_recorder);
+      if (create_next_object_recorder(object_recorder)) {
+        overflowed = true;
+      }
     }
   }
+  lockers.clear();
+
+  if (overflowed) {
+    ldout(m_cct, 10) << "object set " << m_current_set << " now full" << dendl;
+    ldout(m_cct, 10) << "" << dendl;
+    close_and_advance_object_set(m_current_set);
+  }
 }
 
 bool JournalRecorder::close_object_set(uint64_t active_set) {
@@ -288,6 +298,8 @@ bool JournalRecorder::close_object_set(uint64_t active_set) {
       // flush out all queued appends and hold future appends
       if (!object_recorder->close()) {
         ++m_in_flight_object_closes;
+        ldout(m_cct, 10) << "object " << object_recorder->get_oid() << " "
+                         << "close in-progress" << dendl;
       } else {
         ldout(m_cct, 10) << "object " << object_recorder->get_oid() << " closed"
                          << dendl;
@@ -310,7 +322,7 @@ ceph::ref_t<ObjectRecorder> JournalRecorder::create_object_recorder(
   return object_recorder;
 }
 
-void JournalRecorder::create_next_object_recorder(
+bool JournalRecorder::create_next_object_recorder(
     ceph::ref_t<ObjectRecorder> object_recorder) {
   ceph_assert(ceph_mutex_is_locked(m_lock));
 
@@ -336,8 +348,14 @@ void JournalRecorder::create_next_object_recorder(
       new_object_recorder->get_object_number());
   }
 
-  new_object_recorder->append(std::move(append_buffers));
+  bool object_full = new_object_recorder->append(std::move(append_buffers));
+  if (object_full) {
+    ldout(m_cct, 10) << "object " << new_object_recorder->get_oid() << " "
+                     << "now full" << dendl;
+  }
+
   m_object_ptrs[splay_offset] = std::move(new_object_recorder);
+  return object_full;
 }
 
 void JournalRecorder::handle_update() {
index f4edd8668040540c7c8bf20f4699b01efb137cfb..680dbcdfead58a2fb4017ad01325bbe80eed2878 100644 (file)
@@ -114,7 +114,7 @@ private:
 
   ceph::ref_t<ObjectRecorder> create_object_recorder(uint64_t object_number,
                                            ceph::mutex* lock);
-  void create_next_object_recorder(ceph::ref_t<ObjectRecorder> object_recorder);
+  bool create_next_object_recorder(ceph::ref_t<ObjectRecorder> object_recorder);
 
   void handle_update();