]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
journal: simplify object recorder locker aggregation
authorJason Dillaman <dillaman@redhat.com>
Fri, 8 Nov 2019 19:39:58 +0000 (14:39 -0500)
committerJason Dillaman <dillaman@redhat.com>
Tue, 19 Nov 2019 13:45:46 +0000 (08:45 -0500)
Use move semantics and RAII to control the locking of the
per-object recorder lock.

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

index 402c903fe816f25092a082fc614e46fd6e30a353..e85fdb4ef0c1ac1fe6e8fe8b27fbba40ac000a3d 100644 (file)
@@ -259,7 +259,7 @@ void JournalRecorder::open_object_set() {
 
   uint8_t splay_width = m_journal_metadata->get_splay_width();
 
-  lock_object_recorders();
+  auto lockers{lock_object_recorders()};
   for (const auto& p : m_object_ptrs) {
     const auto& object_recorder = p.second;
     uint64_t object_number = object_recorder->get_object_number();
@@ -270,7 +270,6 @@ void JournalRecorder::open_object_set() {
       create_next_object_recorder(object_recorder);
     }
   }
-  unlock_object_recorders();
 }
 
 bool JournalRecorder::close_object_set(uint64_t active_set) {
@@ -280,7 +279,7 @@ bool JournalRecorder::close_object_set(uint64_t active_set) {
   // object recorders will invoke overflow handler as they complete
   // closing the object to ensure correct order of future appends
   uint8_t splay_width = m_journal_metadata->get_splay_width();
-  lock_object_recorders();
+  auto lockers{lock_object_recorders()};
   for (const auto& p : m_object_ptrs) {
     const auto& object_recorder = p.second;
     if (object_recorder->get_object_number() / splay_width != active_set) {
@@ -295,7 +294,6 @@ bool JournalRecorder::close_object_set(uint64_t active_set) {
       }
     }
   }
-  unlock_object_recorders();
   return (m_in_flight_object_closes == 0);
 }
 
@@ -406,4 +404,13 @@ void JournalRecorder::handle_overflow(ObjectRecorder *object_recorder) {
   close_and_advance_object_set(object_number / splay_width);
 }
 
+JournalRecorder::Lockers JournalRecorder::lock_object_recorders() {
+  Lockers lockers;
+  lockers.reserve(m_object_ptrs.size());
+  for (auto& lock : m_object_locks) {
+    lockers.emplace_back(lock);
+  }
+  return lockers;
+}
+
 } // namespace journal
index 3bd036fb5f7790c476dd5617ca95f75dc479cf10..f4edd8668040540c7c8bf20f4699b01efb137cfb 100644 (file)
@@ -39,6 +39,7 @@ public:
 
 private:
   typedef std::map<uint8_t, ceph::ref_t<ObjectRecorder>> ObjectRecorderPtrs;
+  typedef std::vector<std::unique_lock<ceph::mutex>> Lockers;
 
   struct Listener : public JournalMetadataListener {
     JournalRecorder *journal_recorder;
@@ -120,17 +121,7 @@ private:
   void handle_closed(ObjectRecorder *object_recorder);
   void handle_overflow(ObjectRecorder *object_recorder);
 
-  void lock_object_recorders() {
-    for (auto& lock : m_object_locks) {
-      lock.lock();
-    }
-  }
-
-  void unlock_object_recorders() {
-    for (auto& lock : m_object_locks) {
-      lock.unlock();
-    }
-  }
+  Lockers lock_object_recorders();
 };
 
 } // namespace journal