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();
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);
}
}
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;
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)
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();