From cdc637f0f191db537d9e24a83a017a1405206a47 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 11 Sep 2013 15:09:59 -0700 Subject: [PATCH] osd: block requests on object during COPY_FROM Block any request on an object (read or write) during the COPY_FROM operation. This could potentially be broken down into read vs write operations without much difficulty, but blocking any op indescriminately is sufficient for now, so let's keep it simple. Signed-off-by: Sage Weil --- src/osd/ReplicatedPG.cc | 4 ++++ src/osd/osd_types.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index c9f4cb624deab..ca747db90c61a 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -4170,6 +4170,7 @@ void ReplicatedPG::process_copy_chunk(hobject_t oid, tid_t tid, int r) if (r < 0) { copy_ops.erase(ctx->obc->obs.oi.soid); --ctx->obc->copyfrom_readside; + kick_object_context_blocked(ctx->obc); reply_ctx(ctx, r); return; } @@ -4207,6 +4208,7 @@ void ReplicatedPG::process_copy_chunk(hobject_t oid, tid_t tid, int r) copy_ops.erase(ctx->obc->obs.oi.soid); --ctx->obc->copyfrom_readside; ctx->copy_op.reset(); + kick_object_context_blocked(ctx->obc); } void ReplicatedPG::_write_copy_chunk(CopyOpRef cop, ObjectStore::Transaction *t) @@ -4292,6 +4294,8 @@ void ReplicatedPG::cancel_copy(CopyOpRef cop) --ctx->obc->copyfrom_readside; ctx->copy_op.reset(); + kick_object_context_blocked(ctx->obc); + delete ctx; } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 45937a91dd898..626848bbdf4bd 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -2153,7 +2153,7 @@ public: } bool is_blocked() const { - return false; + return copyfrom_readside > 0; } // do simple synchronous mutual exclusion, for now. now waitqueues or anything fancy. -- 2.39.5