]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librbd: add DiscardLogOperation
authorYuan Lu <yuan.y.lu@intel.com>
Sun, 26 Apr 2020 07:37:18 +0000 (15:37 +0800)
committerYuan Lu <yuan.y.lu@intel.com>
Wed, 29 Apr 2020 06:44:08 +0000 (14:44 +0800)
Signed-off-by: Peterson, Scott <scott.d.peterson@intel.com>
Signed-off-by: Li, Xiaoyan <xiaoyan.li@intel.com>
Signed-off-by: Lu, Yuan <yuan.y.lu@intel.com>
Signed-off-by: Chamarthy, Mahati <mahati.chamarthy@intel.com>
src/librbd/cache/rwl/LogOperation.cc
src/librbd/cache/rwl/LogOperation.h

index ea770a5033fd6352009bce864045c8ce78abc6ec..52f458ec6756ca4bfe4301733d8934322a5cfbaf 100644 (file)
@@ -266,6 +266,49 @@ std::ostream &operator<<(std::ostream &os,
   return os;
 };
 
+DiscardLogOperation::DiscardLogOperation(std::shared_ptr<SyncPoint> 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<DiscardLogEntry>(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
index 1197e7be798a37ec589d3cd418221f79d751aacf..c3d42566cdc42db659ac8d18040d6d439b9105c8 100644 (file)
@@ -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<DiscardLogEntry> log_entry;
+  DiscardLogOperation(std::shared_ptr<SyncPoint> 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<GenericLogEntry> 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