]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd/journal: handle writesame event
authorGui Hecheng <guihecheng@cmss.chinamobile.com>
Tue, 21 Feb 2017 12:48:12 +0000 (20:48 +0800)
committerGui Hecheng <guihecheng@cmss.chinamobile.com>
Thu, 23 Feb 2017 09:25:10 +0000 (17:25 +0800)
Based on pr: https://github.com/ceph/ceph/pull/10019.

Signed-off-by: Gui Hecheng <guihecheng@cmss.chinamobile.com>
Signed-off-by: Mingxin Liu <mingxin@xsky.com>
src/librbd/journal/Replay.cc
src/librbd/journal/Replay.h
src/librbd/journal/Types.cc
src/librbd/journal/Types.h

index 456ec9c030183d7072180d64735254ec6fe0fe6b..ff4dfb0ff093cd662cc84e280e2d1112b79d8dcb 100644 (file)
@@ -364,6 +364,28 @@ void Replay<I>::handle_event(const journal::AioFlushEvent &event,
   on_ready->complete(0);
 }
 
+template <typename I>
+void Replay<I>::handle_event(const journal::AioWriteSameEvent &event,
+                             Context *on_ready, Context *on_safe) {
+  CephContext *cct = m_image_ctx.cct;
+  ldout(cct, 20) << ": AIO writesame event" << dendl;
+
+  bufferlist data = event.data;
+  bool flush_required;
+  auto aio_comp = create_aio_modify_completion(on_ready, on_safe,
+                                               io::AIO_TYPE_WRITESAME,
+                                               &flush_required);
+  io::ImageRequest<I>::aio_writesame(&m_image_ctx, aio_comp, event.offset,
+                                     event.length, std::move(data), 0);
+  if (flush_required) {
+    m_lock.Lock();
+    auto flush_comp = create_aio_flush_completion(nullptr);
+    m_lock.Unlock();
+
+    io::ImageRequest<I>::aio_flush(&m_image_ctx, flush_comp);
+  }
+}
+
 template <typename I>
 void Replay<I>::handle_event(const journal::OpFinishEvent &event,
                              Context *on_ready, Context *on_safe) {
index 7587029640bc2726ab3a3c4ca09affd3d5074082..afe71b994f7ba2c11c69043d9b2375dd2bbf8caa 100644 (file)
@@ -133,6 +133,8 @@ private:
                     Context *on_safe);
   void handle_event(const AioWriteEvent &event, Context *on_ready,
                     Context *on_safe);
+  void handle_event(const AioWriteSameEvent &event, Context *on_ready,
+                    Context *on_safe);
   void handle_event(const AioFlushEvent &event, Context *on_ready,
                     Context *on_safe);
   void handle_event(const OpFinishEvent &event, Context *on_ready,
@@ -158,7 +160,7 @@ private:
   void handle_event(const DemoteEvent &event, Context *on_ready,
                     Context *on_safe);
   void handle_event(const SnapLimitEvent &event, Context *on_ready,
-                   Context *on_safe);
+                    Context *on_safe);
   void handle_event(const UpdateFeaturesEvent &event, Context *on_ready,
                     Context *on_safe);
   void handle_event(const MetadataSetEvent &event, Context *on_ready,
index 36010ca1a30b9ca64346bd2eaa07ad2dd83ee161..2373e54859c36a1fd1a98a890afda0aee3f0b3ec 100644 (file)
@@ -104,6 +104,23 @@ void AioWriteEvent::dump(Formatter *f) const {
   f->dump_unsigned("length", length);
 }
 
+void AioWriteSameEvent::encode(bufferlist& bl) const {
+  ::encode(offset, bl);
+  ::encode(length, bl);
+  ::encode(data, bl);
+}
+
+void AioWriteSameEvent::decode(__u8 version, bufferlist::iterator& it) {
+  ::decode(offset, it);
+  ::decode(length, it);
+  ::decode(data, it);
+}
+
+void AioWriteSameEvent::dump(Formatter *f) const {
+  f->dump_unsigned("offset", offset);
+  f->dump_unsigned("length", length);
+}
+
 void AioFlushEvent::encode(bufferlist& bl) const {
 }
 
@@ -383,6 +400,9 @@ void EventEntry::decode(bufferlist::iterator& it) {
   case EVENT_TYPE_METADATA_REMOVE:
     event = MetadataRemoveEvent();
     break;
+  case EVENT_TYPE_AIO_WRITESAME:
+    event = AioWriteSameEvent();
+    break;
   default:
     event = UnknownEvent();
     break;
@@ -724,6 +744,9 @@ std::ostream &operator<<(std::ostream &out, const EventType &type) {
   case EVENT_TYPE_METADATA_REMOVE:
     out << "MetadataRemove";
     break;
+  case EVENT_TYPE_AIO_WRITESAME:
+    out << "AioWriteSame";
+    break;
   default:
     out << "Unknown (" << static_cast<uint32_t>(type) << ")";
     break;
index 53c1310e89afefff80a6d06f0e9b7ef9bcb86b9e..71505b814f99d0fb6493c2ae55ceb2b33d3b5336 100644 (file)
@@ -42,6 +42,7 @@ enum EventType {
   EVENT_TYPE_UPDATE_FEATURES = 15,
   EVENT_TYPE_METADATA_SET    = 16,
   EVENT_TYPE_METADATA_REMOVE = 17,
+  EVENT_TYPE_AIO_WRITESAME   = 18,
 };
 
 struct AioDiscardEvent {
@@ -81,6 +82,25 @@ struct AioWriteEvent {
   void dump(Formatter *f) const;
 };
 
+struct AioWriteSameEvent {
+  static const EventType TYPE = EVENT_TYPE_AIO_WRITESAME;
+
+  uint64_t offset;
+  uint64_t length;
+  bufferlist data;
+
+  AioWriteSameEvent() : offset(0), length(0) {
+  }
+  AioWriteSameEvent(uint64_t _offset, uint64_t _length,
+                    const bufferlist &_data)
+    : offset(_offset), length(_length), data(_data) {
+  }
+
+  void encode(bufferlist& bl) const;
+  void decode(__u8 version, bufferlist::iterator& it);
+  void dump(Formatter *f) const;
+};
+
 struct AioFlushEvent {
   static const EventType TYPE = EVENT_TYPE_AIO_FLUSH;
 
@@ -368,6 +388,7 @@ typedef boost::variant<AioDiscardEvent,
                        UpdateFeaturesEvent,
                        MetadataSetEvent,
                        MetadataRemoveEvent,
+                       AioWriteSameEvent,
                        UnknownEvent> Event;
 
 struct EventEntry {