From: Jason Dillaman Date: Thu, 27 Feb 2020 15:44:21 +0000 (-0500) Subject: librbd: allow force promotions to create necessary orphan snapshot X-Git-Tag: v15.1.1~153^2~8 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=5af1578d109de7af3f9c651159c5537061d104a7;p=ceph-ci.git librbd: allow force promotions to create necessary orphan snapshot The rbd-mirror daemon needs to accept the RPC request to create an orphan snapshot so that it knows to shut-down the replayer. Signed-off-by: Jason Dillaman --- diff --git a/src/cls/rbd/cls_rbd_types.h b/src/cls/rbd/cls_rbd_types.h index 1e4a537b04d..081540d8e79 100644 --- a/src/cls/rbd/cls_rbd_types.h +++ b/src/cls/rbd/cls_rbd_types.h @@ -584,6 +584,12 @@ struct MirrorSnapshotNamespace { state == MIRROR_SNAPSHOT_STATE_NON_PRIMARY_DEMOTED); } + inline bool is_orphan() const { + return (is_non_primary() && + primary_mirror_uuid.empty() && + primary_snap_id == CEPH_NOSNAP); + } + void encode(bufferlist& bl) const; void decode(bufferlist::const_iterator& it); diff --git a/src/librbd/ImageWatcher.cc b/src/librbd/ImageWatcher.cc index 18440c0452f..073123094d2 100644 --- a/src/librbd/ImageWatcher.cc +++ b/src/librbd/ImageWatcher.cc @@ -777,8 +777,16 @@ bool ImageWatcher::handle_payload(const SnapCreatePayload &payload, std::shared_lock l{m_image_ctx.owner_lock}; if (m_image_ctx.exclusive_lock != nullptr) { int r; - if (m_image_ctx.exclusive_lock->accept_request( - exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, &r)) { + auto request_type = exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL; + + // rbd-mirror needs to accept forced promotion orphan snap create requests + auto mirror_ns = boost::get( + &payload.snap_namespace); + if (mirror_ns != nullptr && mirror_ns->is_orphan()) { + request_type = exclusive_lock::OPERATION_REQUEST_TYPE_FORCE_PROMOTION; + } + + if (m_image_ctx.exclusive_lock->accept_request(request_type, &r)) { ldout(m_image_ctx.cct, 10) << this << " remote snap_create request: " << payload.snap_name << dendl; diff --git a/src/librbd/exclusive_lock/Policy.h b/src/librbd/exclusive_lock/Policy.h index 8dcbf444441..7064a6515ba 100644 --- a/src/librbd/exclusive_lock/Policy.h +++ b/src/librbd/exclusive_lock/Policy.h @@ -10,6 +10,7 @@ namespace exclusive_lock { enum OperationRequestType { OPERATION_REQUEST_TYPE_GENERAL = 0, OPERATION_REQUEST_TYPE_TRASH_SNAP_REMOVE = 1, + OPERATION_REQUEST_TYPE_FORCE_PROMOTION = 2, }; struct Policy { diff --git a/src/librbd/mirror/snapshot/CreateNonPrimaryRequest.cc b/src/librbd/mirror/snapshot/CreateNonPrimaryRequest.cc index 8922ee24076..7dffb92e97e 100644 --- a/src/librbd/mirror/snapshot/CreateNonPrimaryRequest.cc +++ b/src/librbd/mirror/snapshot/CreateNonPrimaryRequest.cc @@ -122,6 +122,7 @@ void CreateNonPrimaryRequest::create_snapshot() { cls::rbd::MIRROR_SNAPSHOT_STATE_NON_PRIMARY), {}, m_primary_mirror_uuid, m_primary_snap_id}; ns.snap_seqs = m_snap_seqs; + ns.complete = is_orphan(); ldout(cct, 20) << "ns=" << ns << dendl; auto ctx = create_context_callback< @@ -160,6 +161,7 @@ void CreateNonPrimaryRequest::write_image_state() { if (is_orphan()) { finish(0); + return; } CephContext *cct = m_image_ctx->cct; diff --git a/src/librbd/mirror/snapshot/PromoteRequest.cc b/src/librbd/mirror/snapshot/PromoteRequest.cc index 91d4a25b116..d0295907793 100644 --- a/src/librbd/mirror/snapshot/PromoteRequest.cc +++ b/src/librbd/mirror/snapshot/PromoteRequest.cc @@ -43,6 +43,8 @@ void PromoteRequest::send() { return; } + ldout(cct, 20) << "requires_orphan=" << requires_orphan << ", " + << "rollback_snap_id=" << m_rollback_snap_id << dendl; create_orphan_snapshot(); } @@ -233,6 +235,7 @@ void PromoteRequest::handle_acquire_exclusive_lock(int r) { r = m_image_ctx->exclusive_lock->get_unlocked_op_error(); locker.unlock(); finish(r); + return; } } diff --git a/src/tools/rbd_mirror/image_replayer/OpenLocalImageRequest.cc b/src/tools/rbd_mirror/image_replayer/OpenLocalImageRequest.cc index 6606a5009e1..70e935fd72d 100644 --- a/src/tools/rbd_mirror/image_replayer/OpenLocalImageRequest.cc +++ b/src/tools/rbd_mirror/image_replayer/OpenLocalImageRequest.cc @@ -62,11 +62,13 @@ struct MirrorExclusiveLockPolicy : public librbd::exclusive_lock::Policy { bool accept_blocked_request( librbd::exclusive_lock::OperationRequestType request_type) override { - if (request_type == - librbd::exclusive_lock::OPERATION_REQUEST_TYPE_TRASH_SNAP_REMOVE) { + switch (request_type) { + case librbd::exclusive_lock::OPERATION_REQUEST_TYPE_TRASH_SNAP_REMOVE: + case librbd::exclusive_lock::OPERATION_REQUEST_TYPE_FORCE_PROMOTION: return true; + default: + return false; } - return false; } };