From: Yuan Lu Date: Sun, 26 Apr 2020 07:37:18 +0000 (+0800) Subject: librbd: add DiscardLogOperation X-Git-Tag: v16.1.0~2447^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=72263d587770824bbfb50f1fcfc6a8b4d0135152;p=ceph.git librbd: add DiscardLogOperation Signed-off-by: Peterson, Scott Signed-off-by: Li, Xiaoyan Signed-off-by: Lu, Yuan Signed-off-by: Chamarthy, Mahati --- diff --git a/src/librbd/cache/rwl/LogOperation.cc b/src/librbd/cache/rwl/LogOperation.cc index ea770a5033f..52f458ec675 100644 --- a/src/librbd/cache/rwl/LogOperation.cc +++ b/src/librbd/cache/rwl/LogOperation.cc @@ -266,6 +266,49 @@ std::ostream &operator<<(std::ostream &os, return os; }; +DiscardLogOperation::DiscardLogOperation(std::shared_ptr sync_point, + const uint64_t image_offset_bytes, + const uint64_t write_bytes, + uint32_t discard_granularity_bytes, + const utime_t dispatch_time, + PerfCounters *perfcounter, + CephContext *cct) + : GenericWriteLogOperation(sync_point, dispatch_time, perfcounter, cct), + log_entry(std::make_shared(sync_point->log_entry, + image_offset_bytes, + write_bytes, + discard_granularity_bytes)) { + on_write_append = sync_point->prior_persisted_gather_new_sub(); + on_write_persist = nullptr; + log_entry->sync_point_entry->writes++; + log_entry->sync_point_entry->bytes += write_bytes; +} + +DiscardLogOperation::~DiscardLogOperation() { } + +void DiscardLogOperation::init(uint64_t current_sync_gen, bool persist_on_flush, + uint64_t last_op_sequence_num, Context *write_persist) { + log_entry->init(current_sync_gen, persist_on_flush, last_op_sequence_num); + this->on_write_persist = write_persist; +} + +std::ostream &DiscardLogOperation::format(std::ostream &os) const { + os << "(Discard) "; + GenericWriteLogOperation::format(os); + os << ", "; + if (log_entry) { + os << "log_entry=[" << *log_entry << "], "; + } else { + os << "log_entry=nullptr, "; + } + return os; +}; + +std::ostream &operator<<(std::ostream &os, + const DiscardLogOperation &op) { + return op.format(os); +} + } // namespace rwl } // namespace cache } // namespace librbd diff --git a/src/librbd/cache/rwl/LogOperation.h b/src/librbd/cache/rwl/LogOperation.h index 1197e7be798..c3d42566cdc 100644 --- a/src/librbd/cache/rwl/LogOperation.h +++ b/src/librbd/cache/rwl/LogOperation.h @@ -47,7 +47,10 @@ public: virtual void appending() = 0; virtual void complete(int r) = 0; virtual void mark_log_entry_completed() {}; - virtual bool reserved_allocated() { + virtual bool reserved_allocated() const { + return false; + } + virtual bool is_writing_op() const { return false; } virtual void copy_bl_to_pmem_buffer() {}; @@ -105,7 +108,10 @@ public: void mark_log_entry_completed() override{ sync_point->log_entry->writes_completed++; } - bool reserved_allocated() override { + bool reserved_allocated() const override { + return true; + } + bool is_writing_op() const override { return true; } void appending() override; @@ -166,6 +172,36 @@ public: const WriteLogOperationSet &s); }; +class DiscardLogOperation : public GenericWriteLogOperation { +public: + using GenericWriteLogOperation::m_lock; + using GenericWriteLogOperation::sync_point; + using GenericWriteLogOperation::on_write_append; + using GenericWriteLogOperation::on_write_persist; + std::shared_ptr log_entry; + DiscardLogOperation(std::shared_ptr sync_point, + const uint64_t image_offset_bytes, + const uint64_t write_bytes, + uint32_t discard_granularity_bytes, + const utime_t dispatch_time, + PerfCounters *perfcounter, + CephContext *cct); + ~DiscardLogOperation() override; + DiscardLogOperation(const DiscardLogOperation&) = delete; + DiscardLogOperation &operator=(const DiscardLogOperation&) = delete; + const std::shared_ptr get_log_entry() override { + return log_entry; + } + bool reserved_allocated() const override { + return false; + } + void init(uint64_t current_sync_gen, bool persist_on_flush, + uint64_t last_op_sequence_num, Context *write_persist); + std::ostream &format(std::ostream &os) const; + friend std::ostream &operator<<(std::ostream &os, + const DiscardLogOperation &op); +}; + } // namespace rwl } // namespace cache } // namespace librbd