From b71335b94a37c6d41e7611815920999d816438a5 Mon Sep 17 00:00:00 2001 From: Gui Hecheng Date: Tue, 21 Feb 2017 20:48:12 +0800 Subject: [PATCH] librbd/journal: handle writesame event Based on pr: https://github.com/ceph/ceph/pull/10019. Signed-off-by: Gui Hecheng Signed-off-by: Mingxin Liu --- src/librbd/journal/Replay.cc | 22 ++++++++++++++++++++++ src/librbd/journal/Replay.h | 4 +++- src/librbd/journal/Types.cc | 23 +++++++++++++++++++++++ src/librbd/journal/Types.h | 21 +++++++++++++++++++++ 4 files changed, 69 insertions(+), 1 deletion(-) diff --git a/src/librbd/journal/Replay.cc b/src/librbd/journal/Replay.cc index 456ec9c030183..ff4dfb0ff093c 100644 --- a/src/librbd/journal/Replay.cc +++ b/src/librbd/journal/Replay.cc @@ -364,6 +364,28 @@ void Replay::handle_event(const journal::AioFlushEvent &event, on_ready->complete(0); } +template +void Replay::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::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::aio_flush(&m_image_ctx, flush_comp); + } +} + template void Replay::handle_event(const journal::OpFinishEvent &event, Context *on_ready, Context *on_safe) { diff --git a/src/librbd/journal/Replay.h b/src/librbd/journal/Replay.h index 7587029640bc2..afe71b994f7ba 100644 --- a/src/librbd/journal/Replay.h +++ b/src/librbd/journal/Replay.h @@ -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, diff --git a/src/librbd/journal/Types.cc b/src/librbd/journal/Types.cc index 36010ca1a30b9..2373e54859c36 100644 --- a/src/librbd/journal/Types.cc +++ b/src/librbd/journal/Types.cc @@ -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(type) << ")"; break; diff --git a/src/librbd/journal/Types.h b/src/librbd/journal/Types.h index 53c1310e89afe..71505b814f99d 100644 --- a/src/librbd/journal/Types.h +++ b/src/librbd/journal/Types.h @@ -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 Event; struct EventEntry { -- 2.39.5