summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/osd/ReplicatedPG.cc19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc
index a04ab485e7e..86d2db51cdb 100644
--- a/src/osd/ReplicatedPG.cc
+++ b/src/osd/ReplicatedPG.cc
@@ -1024,21 +1024,22 @@ void ReplicatedPG::do_op(OpRequestRef op)
}
ctx->reply->set_result(result);
- if (result >= 0) {
- ctx->reply->set_reply_versions(ctx->at_version, ctx->user_at_version);
- } else if (result == -ENOENT) {
- ctx->reply->set_enoent_reply_versions(info.last_update, ctx->user_at_version);
- }
-
// read or error?
if (ctx->op_t.empty() || result < 0) {
+ MOSDOpReply *reply = ctx->reply;
+ ctx->reply = NULL;
+
if (result >= 0) {
log_op_stats(ctx);
publish_stats_to_osd();
+
+ // on read, return the current object version
+ reply->set_reply_versions(eversion_t(), ctx->obs->oi.user_version);
+ } else if (result == -ENOENT) {
+ // on ENOENT, set a floor for what the next user version will be.
+ reply->set_enoent_reply_versions(info.last_update, ctx->user_at_version);
}
- MOSDOpReply *reply = ctx->reply;
- ctx->reply = NULL;
reply->add_flags(CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK);
osd->send_message_osd_client(reply, m->get_connection());
delete ctx;
@@ -1046,6 +1047,8 @@ void ReplicatedPG::do_op(OpRequestRef op)
return;
}
+ ctx->reply->set_reply_versions(ctx->at_version, ctx->user_at_version);
+
assert(op->may_write());
// trim log?