From 6a12b95d3be4010c839ae1f03f552a71573c76f8 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 26 Aug 2015 15:07:33 -0400 Subject: [PATCH] librbd: new intermediate request class for handling journal ops All operations that should be recorded to the journal will inherit from the new librbd::operation::Request class. Signed-off-by: Jason Dillaman --- src/librbd/AsyncRequest.h | 9 +++++++-- src/librbd/Makefile.am | 2 ++ src/librbd/ObjectMap.h | 2 +- src/librbd/operation/FlattenRequest.cc | 2 +- src/librbd/operation/FlattenRequest.h | 9 ++++----- src/librbd/operation/Request.cc | 23 ++++++++++++++++++++++ src/librbd/operation/Request.h | 27 ++++++++++++++++++++++++++ src/librbd/operation/ResizeRequest.cc | 4 ++-- src/librbd/operation/ResizeRequest.h | 12 ++++++------ src/librbd/operation/TrimRequest.cc | 6 +++--- src/librbd/operation/TrimRequest.h | 2 +- 11 files changed, 77 insertions(+), 21 deletions(-) create mode 100644 src/librbd/operation/Request.cc create mode 100644 src/librbd/operation/Request.h diff --git a/src/librbd/AsyncRequest.h b/src/librbd/AsyncRequest.h index 5ecaf8202fecd..ca306d531c9e2 100644 --- a/src/librbd/AsyncRequest.h +++ b/src/librbd/AsyncRequest.h @@ -22,7 +22,9 @@ public: void complete(int r) { if (should_complete(r)) { - m_on_finish->complete(filter_return_code(r)); + r = filter_return_code(r); + finish(r); + m_on_finish->complete(r); delete this; } } @@ -47,9 +49,12 @@ protected: void async_complete(int r); virtual bool should_complete(int r) = 0; - virtual int filter_return_code(int r) { + virtual int filter_return_code(int r) const { return r; } + + virtual void finish(int r) { + } private: bool m_canceled; typename xlist *>::item m_xlist_item; diff --git a/src/librbd/Makefile.am b/src/librbd/Makefile.am index c8d840e906067..90776dac70be6 100644 --- a/src/librbd/Makefile.am +++ b/src/librbd/Makefile.am @@ -27,6 +27,7 @@ librbd_internal_la_SOURCES = \ librbd/ObjectMap.cc \ librbd/operation/FlattenRequest.cc \ librbd/operation/RebuildObjectMapRequest.cc \ + librbd/operation/Request.cc \ librbd/operation/ResizeRequest.cc \ librbd/operation/TrimRequest.cc noinst_LTLIBRARIES += librbd_internal.la @@ -78,6 +79,7 @@ noinst_HEADERS += \ librbd/WatchNotifyTypes.h \ librbd/operation/FlattenRequest.h \ librbd/operation/RebuildObjectMapRequest.h \ + librbd/operation/Request.h \ librbd/operation/ResizeRequest.h \ librbd/operation/TrimRequest.h diff --git a/src/librbd/ObjectMap.h b/src/librbd/ObjectMap.h index c85703a286feb..f0d1bbe9434b1 100644 --- a/src/librbd/ObjectMap.h +++ b/src/librbd/ObjectMap.h @@ -73,7 +73,7 @@ private: const uint64_t m_snap_id; virtual bool should_complete(int r); - virtual int filter_return_code(int r) { + virtual int filter_return_code(int r) const { // never propagate an error back to the caller return 0; } diff --git a/src/librbd/operation/FlattenRequest.cc b/src/librbd/operation/FlattenRequest.cc index e3d91812a1318..2a08e4562dc27 100644 --- a/src/librbd/operation/FlattenRequest.cc +++ b/src/librbd/operation/FlattenRequest.cc @@ -89,7 +89,7 @@ bool FlattenRequest::should_complete(int r) { return false; } -void FlattenRequest::send() { +void FlattenRequest::send_op() { assert(m_image_ctx.owner_lock.is_locked()); CephContext *cct = m_image_ctx.cct; ldout(cct, 5) << this << " send" << dendl; diff --git a/src/librbd/operation/FlattenRequest.h b/src/librbd/operation/FlattenRequest.h index 8474f9c3dfcb7..f8ef2670e6151 100644 --- a/src/librbd/operation/FlattenRequest.h +++ b/src/librbd/operation/FlattenRequest.h @@ -3,7 +3,7 @@ #ifndef CEPH_LIBRBD_OPERATION_FLATTEN_REQUEST_H #define CEPH_LIBRBD_OPERATION_FLATTEN_REQUEST_H -#include "librbd/AsyncRequest.h" +#include "librbd/operation/Request.h" #include "librbd/parent_types.h" #include "common/snap_types.h" @@ -14,21 +14,20 @@ class ProgressContext; namespace operation { -class FlattenRequest : public AsyncRequest<> +class FlattenRequest : public Request { public: FlattenRequest(ImageCtx &image_ctx, Context *on_finish, uint64_t object_size, uint64_t overlap_objects, const ::SnapContext &snapc, ProgressContext &prog_ctx) - : AsyncRequest(image_ctx, on_finish), m_object_size(object_size), + : Request(image_ctx, on_finish), m_object_size(object_size), m_overlap_objects(overlap_objects), m_snapc(snapc), m_prog_ctx(prog_ctx), m_ignore_enoent(false) { } - virtual void send(); - protected: + virtual void send_op(); virtual bool should_complete(int r); private: diff --git a/src/librbd/operation/Request.cc b/src/librbd/operation/Request.cc new file mode 100644 index 0000000000000..82017de05c2c6 --- /dev/null +++ b/src/librbd/operation/Request.cc @@ -0,0 +1,23 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include "librbd/operation/Request.h" + +namespace librbd { +namespace operation { + +Request::Request(ImageCtx &image_ctx, Context *on_finish) + : AsyncRequest(image_ctx, on_finish) { +} + +void Request::send() { + // TODO: record op start in journal + send_op(); +} + +void Request::finish(int r) { + // TODO: record op finish in journal +} + +} // namespace operation +} // namespace librbd diff --git a/src/librbd/operation/Request.h b/src/librbd/operation/Request.h new file mode 100644 index 0000000000000..b4a805d57477f --- /dev/null +++ b/src/librbd/operation/Request.h @@ -0,0 +1,27 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#ifndef CEPH_LIBRBD_OPERATION_REQUEST_H +#define CEPH_LIBRBD_OPERATION_REQUEST_H + +#include "librbd/AsyncRequest.h" + +namespace librbd { +namespace operation { + +class Request : public AsyncRequest<> { +public: + Request(ImageCtx &image_ctx, Context *on_finish); + + virtual void send(); + +protected: + virtual void finish(int r); + virtual void send_op() = 0; + +}; + +} // namespace operation +} // namespace librbd + +#endif // CEPH_LIBRBD_OPERATION_REQUEST_H diff --git a/src/librbd/operation/ResizeRequest.cc b/src/librbd/operation/ResizeRequest.cc index 03247431f4316..afe925bac8c95 100644 --- a/src/librbd/operation/ResizeRequest.cc +++ b/src/librbd/operation/ResizeRequest.cc @@ -20,7 +20,7 @@ namespace operation { ResizeRequest::ResizeRequest(ImageCtx &image_ctx, Context *on_finish, uint64_t new_size, ProgressContext &prog_ctx) - : AsyncRequest(image_ctx, on_finish), + : Request(image_ctx, on_finish), m_original_size(0), m_new_size(new_size), m_prog_ctx(prog_ctx), m_new_parent_overlap(0), m_xlist_item(this) @@ -99,7 +99,7 @@ bool ResizeRequest::should_complete(int r) { return false; } -void ResizeRequest::send() { +void ResizeRequest::send_op() { assert(m_image_ctx.owner_lock.is_locked()); { diff --git a/src/librbd/operation/ResizeRequest.h b/src/librbd/operation/ResizeRequest.h index f7b941005fbda..dcef8fa22ac91 100644 --- a/src/librbd/operation/ResizeRequest.h +++ b/src/librbd/operation/ResizeRequest.h @@ -3,7 +3,7 @@ #ifndef CEPH_LIBRBD_OPERATION_RESIZE_REQUEST_H #define CEPH_LIBRBD_OPERATION_RESIZE_REQUEST_H -#include "librbd/AsyncRequest.h" +#include "librbd/operation/Request.h" #include "include/xlist.h" namespace librbd @@ -14,15 +14,13 @@ class ProgressContext; namespace operation { -class ResizeRequest : public AsyncRequest<> +class ResizeRequest : public Request { public: ResizeRequest(ImageCtx &image_ctx, Context *on_finish, uint64_t new_size, ProgressContext &prog_ctx); virtual ~ResizeRequest(); - virtual void send(); - inline bool shrinking() const { return m_new_size < m_original_size; } @@ -31,6 +29,10 @@ public: return m_new_size; } +protected: + virtual void send_op(); + virtual bool should_complete(int r); + private: /** * Resize goes through the following state machine to resize the image @@ -84,8 +86,6 @@ private: xlist::item m_xlist_item; - virtual bool should_complete(int r); - void send_flush(); void send_invalidate_cache(); void send_trim_image(); diff --git a/src/librbd/operation/TrimRequest.cc b/src/librbd/operation/TrimRequest.cc index 8d9546d15f72d..d29f2018b7f52 100644 --- a/src/librbd/operation/TrimRequest.cc +++ b/src/librbd/operation/TrimRequest.cc @@ -138,7 +138,7 @@ bool TrimRequest::should_complete(int r) case STATE_CLEAN_BOUNDARY: ldout(cct, 5) << "CLEAN_BOUNDARY" << dendl; - finish(0); + send_finish(0); break; case STATE_FINISHED: @@ -304,7 +304,7 @@ void TrimRequest::send_clean_boundary() { assert(m_image_ctx.owner_lock.is_locked()); CephContext *cct = m_image_ctx.cct; if (m_delete_off <= m_new_size) { - finish(0); + send_finish(0); return; } @@ -349,7 +349,7 @@ void TrimRequest::send_clean_boundary() { completion->finish_adding_requests(); } -void TrimRequest::finish(int r) { +void TrimRequest::send_finish(int r) { m_state = STATE_FINISHED; async_complete(r); } diff --git a/src/librbd/operation/TrimRequest.h b/src/librbd/operation/TrimRequest.h index d781c0c97b142..d8b9358297ac4 100644 --- a/src/librbd/operation/TrimRequest.h +++ b/src/librbd/operation/TrimRequest.h @@ -84,7 +84,7 @@ private: void send_pre_remove(); void send_post_remove(); void send_clean_boundary(); - void finish(int r); + void send_finish(int r); }; } // namespace operation -- 2.39.5