From d2d4bb42d59566afba8ce47b2bb1c12a47e5541a Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 14 Dec 2015 10:31:54 -0500 Subject: [PATCH] librbd: refresh object map after rollback An image refresh will no longer trigger an automatic object map reload, therefore explicitly reload the object map after rollback. Signed-off-by: Jason Dillaman --- .../operation/SnapshotRollbackRequest.cc | 50 ++++++++++++++++++- .../operation/SnapshotRollbackRequest.h | 24 ++++++--- 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/src/librbd/operation/SnapshotRollbackRequest.cc b/src/librbd/operation/SnapshotRollbackRequest.cc index a0cb47cb85f58..f7df78be35e36 100644 --- a/src/librbd/operation/SnapshotRollbackRequest.cc +++ b/src/librbd/operation/SnapshotRollbackRequest.cc @@ -36,6 +36,9 @@ std::ostream& operator<<(std::ostream& os, case SnapshotRollbackRequest::STATE_ROLLBACK_OBJECTS: os << "ROLLBACK_OBJECTS"; break; + case SnapshotRollbackRequest::STATE_REFRESH_OBJECT_MAP: + os << "REFRESH_OBJECT_MAP"; + break; case SnapshotRollbackRequest::STATE_INVALIDATE_CACHE: os << "INVALIDATE_CACHE"; break; @@ -88,7 +91,13 @@ SnapshotRollbackRequest::SnapshotRollbackRequest(I &image_ctx, uint64_t snap_size, ProgressContext &prog_ctx) : Request(image_ctx, on_finish), m_snap_name(snap_name), - m_snap_id(snap_id), m_snap_size(snap_size), m_prog_ctx(prog_ctx) { + m_snap_id(snap_id), m_snap_size(snap_size), m_prog_ctx(prog_ctx), + m_object_map(nullptr) { +} + +template +SnapshotRollbackRequest::~SnapshotRollbackRequest() { + delete m_object_map; } template @@ -117,6 +126,9 @@ bool SnapshotRollbackRequest::should_complete(int r) { send_rollback_objects(); break; case STATE_ROLLBACK_OBJECTS: + finished = send_refresh_object_map(); + break; + case STATE_REFRESH_OBJECT_MAP: finished = send_invalidate_cache(); break; case STATE_INVALIDATE_CACHE: @@ -202,11 +214,36 @@ void SnapshotRollbackRequest::send_rollback_objects() { throttle->start_ops(image_ctx.concurrent_management_ops); } +template +bool SnapshotRollbackRequest::send_refresh_object_map() { + I &image_ctx = this->m_image_ctx; + assert(image_ctx.owner_lock.is_locked()); + + if (image_ctx.object_map == nullptr) { + return send_invalidate_cache(); + } + + CephContext *cct = image_ctx.cct; + ldout(cct, 5) << this << " " << __func__ << dendl; + m_state = STATE_REFRESH_OBJECT_MAP; + + m_object_map = image_ctx.create_object_map(CEPH_NOSNAP); + + image_ctx.owner_lock.put_read(); + Context *ctx = this->create_callback_context(); + m_object_map->open(ctx); + image_ctx.owner_lock.get_read(); + + return false; +} + template bool SnapshotRollbackRequest::send_invalidate_cache() { I &image_ctx = this->m_image_ctx; assert(image_ctx.owner_lock.is_locked()); + apply(); + if (image_ctx.object_cacher == NULL) { return true; } @@ -219,6 +256,17 @@ bool SnapshotRollbackRequest::send_invalidate_cache() { return false; } +template +void SnapshotRollbackRequest::apply() { + I &image_ctx = this->m_image_ctx; + + assert(image_ctx.owner_lock.is_locked()); + RWLock::WLocker snap_locker(image_ctx.snap_lock); + if (image_ctx.object_map != nullptr) { + std::swap(m_object_map, image_ctx.object_map); + } +} + } // namespace operation } // namespace librbd diff --git a/src/librbd/operation/SnapshotRollbackRequest.h b/src/librbd/operation/SnapshotRollbackRequest.h index f66fc5ba0b111..54dd742a3da6d 100644 --- a/src/librbd/operation/SnapshotRollbackRequest.h +++ b/src/librbd/operation/SnapshotRollbackRequest.h @@ -5,6 +5,7 @@ #define CEPH_LIBRBD_OPERATION_SNAPSHOT_ROLLBACK_REQUEST_H #include "librbd/operation/Request.h" +#include "librbd/ImageCtx.h" #include "librbd/internal.h" #include @@ -34,13 +35,16 @@ public: * . . . . > STATE_ROLLBACK_OBJECT_MAP * . | * . v - * . . . . > STATE_ROLLBACK_OBJECTS . . . - * | . - * v . - * STATE_INVALIDATE_CACHE . - * | . - * v . - * < . . . . . . . . + * . . . . > STATE_ROLLBACK_OBJECTS . . . . . . . . . . . + * | . + * v . + * STATE_REFRESH_OBJECT_MAP (skip if object . + * | map disabled) . + * v . + * STATE_INVALIDATE_CACHE . + * | . + * v . + * < . . . . . . . . . . . . . . . . * * @endverbatim * @@ -52,12 +56,14 @@ public: STATE_RESIZE_IMAGE, STATE_ROLLBACK_OBJECT_MAP, STATE_ROLLBACK_OBJECTS, + STATE_REFRESH_OBJECT_MAP, STATE_INVALIDATE_CACHE }; SnapshotRollbackRequest(ImageCtxT &image_ctx, Context *on_finish, const std::string &snap_name, uint64_t snap_id, uint64_t snap_size, ProgressContext &prog_ctx); + virtual ~SnapshotRollbackRequest(); protected: virtual void send_op(); @@ -76,11 +82,15 @@ private: NoOpProgressContext m_no_op_prog_ctx; State m_state; + decltype(ImageCtxT::object_map) m_object_map; + void send_resize_image(); void send_rollback_object_map(); void send_rollback_objects(); + bool send_refresh_object_map(); bool send_invalidate_cache(); + void apply(); }; } // namespace operation -- 2.39.5