]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/librbd/cache/pwl/ssd/WriteLog.cc
import ceph quincy 17.2.4
[ceph.git] / ceph / src / librbd / cache / pwl / ssd / WriteLog.cc
index 2c0dc258b86fb5dc03adf368b42e34dac934a41e..753b15b69f7f953e351f45bc5e0967966aa96a3c 100644 (file)
@@ -531,7 +531,7 @@ void WriteLog<I>::release_ram(std::shared_ptr<GenericLogEntry> log_entry) {
 
 template <typename I>
 void WriteLog<I>::alloc_op_log_entries(GenericLogOperations &ops) {
-  std::lock_guard locker(m_lock);
+  std::unique_lock locker(m_lock);
 
   for (auto &operation : ops) {
     auto &log_entry = operation->get_log_entry();
@@ -542,6 +542,7 @@ void WriteLog<I>::alloc_op_log_entries(GenericLogOperations &ops) {
   if (m_cache_state->empty && !m_log_entries.empty()) {
     m_cache_state->empty = false;
     this->update_image_cache_state();
+    this->write_image_cache_state(locker);
   }
 }
 
@@ -807,6 +808,7 @@ bool WriteLog<I>::retire_entries(const unsigned long int frees_per_tx) {
             allocated_bytes += entry->get_aligned_data_size();
           }
         }
+        bool need_update_state = false;
         {
           std::lock_guard locker(m_lock);
           m_first_valid_entry = first_valid_entry;
@@ -818,6 +820,7 @@ bool WriteLog<I>::retire_entries(const unsigned long int frees_per_tx) {
           if (!m_cache_state->empty && m_log_entries.empty()) {
             m_cache_state->empty = true;
             this->update_image_cache_state();
+            need_update_state = true;
           }
 
           ldout(m_image_ctx.cct, 20)
@@ -832,6 +835,10 @@ bool WriteLog<I>::retire_entries(const unsigned long int frees_per_tx) {
           this->m_alloc_failed_since_retire = false;
           this->wake_up();
         }
+        if (need_update_state) {
+          std::unique_lock locker(m_lock);
+          this->write_image_cache_state(locker);
+        }
 
         this->dispatch_deferred_writes();
         this->process_writeback_dirty_entries();