From: Samuel Just Date: Tue, 8 Dec 2015 23:31:05 +0000 (-0800) Subject: ReplicatedPG: s/release_op_ctx_locks/release_object_locks, don't use opcontext X-Git-Tag: v10.1.0~277^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=43f3d82946310a4c150cb714c7cf643c0b98c25b;p=ceph.git ReplicatedPG: s/release_op_ctx_locks/release_object_locks, don't use opcontext This gets us one step closer to removing OpContext from Repop. Signed-off-by: Samuel Just --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 1cdaa4561a97..43d5bae9accd 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -8455,8 +8455,8 @@ ReplicatedPG::RepGather *ReplicatedPG::new_repop( void ReplicatedPG::remove_repop(RepGather *repop) { dout(20) << __func__ << " " << *repop << dendl; - if (repop->ctx->obc) - dout(20) << " obc " << *repop->ctx->obc << dendl; + assert(repop->ctx->obc); + dout(20) << " obc " << *repop->ctx->obc << dendl; if (repop->ctx->clone_obc) dout(20) << " clone_obc " << *repop->ctx->clone_obc << dendl; if (repop->ctx->snapset_obc) @@ -8468,7 +8468,9 @@ void ReplicatedPG::remove_repop(RepGather *repop) (*p)(); } - release_op_ctx_locks(repop->ctx); + release_object_locks( + repop->ctx->obc->obs.oi.soid.get_head(), + repop->ctx->lock_manager); repop->put(); osd->logger->dec(l_osd_op_wip); diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index 4d19eb5c2d08..d2b77f3f7f78 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -677,7 +677,6 @@ public: } ~OpContext() { assert(!op_t); - assert(lock_type == ObjectContext::RWState::RWNONE); if (reply) reply->put(); for (list, @@ -805,7 +804,7 @@ protected: * @param ctx [in] ctx to clean up */ void close_op_ctx(OpContext *ctx) { - release_op_ctx_locks(ctx); + release_object_locks(ctx->lock_manager); ctx->op_t.reset(); for (auto p = ctx->on_finish.begin(); p != ctx->on_finish.end(); @@ -816,37 +815,38 @@ protected: } /** - * Releases ctx locks + * Releases locks * - * @param ctx [in] ctx to clean up + * @param manager [in] manager with locks to release */ - void release_op_ctx_locks(OpContext *ctx) { - list to_req; + void release_object_locks( + ObcLockManager &lock_manager) { + list > > to_req; bool requeue_recovery = false; bool requeue_snaptrim = false; - ctx->lock_manager.put_locks( + lock_manager.put_locks( &to_req, &requeue_recovery, &requeue_snaptrim); - ctx->lock_type = ObjectContext::RWState::RWNONE; if (requeue_recovery) osd->recovery_wq.queue(this); if (requeue_snaptrim) queue_snap_trim(); if (!to_req.empty()) { - assert(ctx->obc); // requeue at front of scrub blocking queue if we are blocked by scrub - if (scrubber.write_blocked_by_scrub( - ctx->obc->obs.oi.soid.get_head(), - get_sort_bitwise())) { - waiting_for_active.splice( - waiting_for_active.begin(), - to_req, - to_req.begin(), - to_req.end()); - } else { - requeue_ops(to_req); + for (auto &&p: to_req) { + if (scrubber.write_blocked_by_scrub( + p.first.get_head(), + get_sort_bitwise())) { + waiting_for_active.splice( + waiting_for_active.begin(), + p.second, + p.second.begin(), + p.second.end()); + } else { + requeue_ops(p.second); + } } } }