From: Jason Dillaman Date: Wed, 26 Aug 2015 19:07:33 +0000 (-0400) Subject: librbd: new intermediate request class for handling journal ops X-Git-Tag: v10.0.2~193^2~31 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6a12b95d3be4010c839ae1f03f552a71573c76f8;p=ceph.git 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 --- diff --git a/src/librbd/AsyncRequest.h b/src/librbd/AsyncRequest.h index 5ecaf8202fe..ca306d531c9 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 c8d840e9060..90776dac70b 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 c85703a286f..f0d1bbe9434 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 e3d91812a13..2a08e4562dc 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 8474f9c3dfc..f8ef2670e61 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 00000000000..82017de05c2 --- /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 00000000000..b4a805d5747 --- /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 03247431f43..afe925bac8c 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 f7b941005fb..dcef8fa22ac 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 8d9546d15f7..d29f2018b7f 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 d781c0c97b1..d8b9358297a 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