summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-09-11 15:09:59 -0700
committerSage Weil <sage@inktank.com>2013-09-17 11:06:27 -0700
commitcdc637f0f191db537d9e24a83a017a1405206a47 (patch)
treeed53b8081835580c98eed134aedf8d7444579990
parentf97277cc50a1bfe34689aadda65eb8a4b8521798 (diff)
downloadceph-cdc637f0f191db537d9e24a83a017a1405206a47.tar.gz
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 <sage@inktank.com>
-rw-r--r--src/osd/ReplicatedPG.cc4
-rw-r--r--src/osd/osd_types.h2
2 files changed, 5 insertions, 1 deletions
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc
index c9f4cb624de..ca747db90c6 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 45937a91dd8..626848bbdf4 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.