]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd: add processed_subop_count for cls_cxx_subop_version()
authorCasey Bodley <cbodley@redhat.com>
Sat, 28 Oct 2017 20:28:27 +0000 (16:28 -0400)
committerCasey Bodley <cbodley@redhat.com>
Mon, 30 Oct 2017 18:19:02 +0000 (14:19 -0400)
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 <cbodley@redhat.com>
src/objclass/class_api.cc
src/osd/PrimaryLogPG.cc
src/osd/PrimaryLogPG.h

index d8994192dd558a468230e552e85478dd4eb71171..e480b8be0573505635483c40b924c3a7bc50f4d1 100644 (file)
@@ -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)
index b95112c838c66dcb6ab8be597b0573fd57868c84..d1b82b45389dd05775184610bdc4702384c1d362 100644 (file)
@@ -4955,7 +4955,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
   dout(10) << "do_osd_op " << soid << " " << ops << dendl;
 
   ctx->current_osd_subop_num = 0;
-  for (vector<OSDOp>::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;
 
index fb9541787150d8ab75b3f59649c90b146f1f1169..1093a302fcdb57edb4d4359c8d297606ec7fd0f5 100644 (file)
@@ -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<pg_log_entry_t> log;