From 95faac9ae2cd38b1ca25c90f90bd4a53fe6af4d4 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Sat, 28 Oct 2017 16:28:27 -0400 Subject: [PATCH] osd: add processed_subop_count for cls_cxx_subop_version() cls_log_add() relies on cls_cxx_subop_version() to generate unique keys for log entries with the same timestamp. because cls calls back into do_osd_ops(), resetting current_osd_subop_num means that cls_log_add() will keep seeing the same subop version and generating the same keys. this causes the following failure in ceph_test_cls_log: [ RUN ] cls_rgw.test_log_add_same_time /home/cbodley/ceph/src/test/cls_log/test_cls_log.cc:144: Failure Expected: 10 To be equal to: (int)entries.size() Which is: 1 [ FAILED ] cls_rgw.test_log_add_same_time (1180 ms) Fixes: http://tracker.ceph.com/issues/21964 Signed-off-by: Casey Bodley --- src/objclass/class_api.cc | 2 +- src/osd/PrimaryLogPG.cc | 2 +- src/osd/PrimaryLogPG.h | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/objclass/class_api.cc b/src/objclass/class_api.cc index d8994192dd5..e480b8be057 100644 --- a/src/objclass/class_api.cc +++ b/src/objclass/class_api.cc @@ -677,7 +677,7 @@ int cls_current_subop_num(cls_method_context_t hctx) { PrimaryLogPG::OpContext *ctx = *(PrimaryLogPG::OpContext **)hctx; - return ctx->current_osd_subop_num; + return ctx->processed_subop_count; } uint64_t cls_get_features(cls_method_context_t hctx) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index b95112c838c..d1b82b45389 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -4955,7 +4955,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) dout(10) << "do_osd_op " << soid << " " << ops << dendl; ctx->current_osd_subop_num = 0; - for (vector::iterator p = ops.begin(); p != ops.end(); ++p, ctx->current_osd_subop_num++) { + for (auto p = ops.begin(); p != ops.end(); ++p, ctx->current_osd_subop_num++, ctx->processed_subop_count++) { OSDOp& osd_op = *p; ceph_osd_op& op = osd_op.op; diff --git a/src/osd/PrimaryLogPG.h b/src/osd/PrimaryLogPG.h index fb954178715..1093a302fcd 100644 --- a/src/osd/PrimaryLogPG.h +++ b/src/osd/PrimaryLogPG.h @@ -536,7 +536,10 @@ public: eversion_t at_version; // pg's current version pointer version_t user_at_version; // pg's current user version pointer + /// index of the current subop - only valid inside of do_osd_ops() int current_osd_subop_num; + /// total number of subops processed in this context for cls_cxx_subop_version() + int processed_subop_count = 0; PGTransactionUPtr op_t; vector log; -- 2.39.5