@@ -3248,7 +3248,7 @@ int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_si
32483248 auto & ioctx = ref.ioctx ;
32493249
32503250 tracepoint (rgw_rados, operate_enter, req_id.c_str ());
3251- r = rgw_rados_operate (rctx.dpp , ref.ioctx , ref.obj .oid , &op, rctx.y , 0 , &trace);
3251+ r = rgw_rados_operate (rctx.dpp , ref.ioctx , ref.obj .oid , &op, rctx.y , 0 , &trace, &epoch );
32523252 tracepoint (rgw_rados, operate_exit, req_id.c_str ());
32533253 if (r < 0 ) { /* we can expect to get -ECANCELED if object was replaced under,
32543254 or -ENOENT if was removed, or -EEXIST if it did not exist
@@ -3260,7 +3260,6 @@ int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_si
32603260 goto done_cancel;
32613261 }
32623262
3263- epoch = ioctx.get_last_version ();
32643263 poolid = ioctx.get_id ();
32653264
32663265 r = target->complete_atomic_modification (rctx.dpp , rctx.y );
@@ -5876,7 +5875,8 @@ int RGWRados::Object::Delete::delete_obj(optional_yield y, const DoutPrefixProvi
58765875 }
58775876
58785877 auto & ioctx = ref.ioctx ;
5879- r = rgw_rados_operate (dpp, ioctx, ref.obj .oid , &op, y);
5878+ version_t epoch = 0 ;
5879+ r = rgw_rados_operate (dpp, ioctx, ref.obj .oid , &op, y, 0 , nullptr , &epoch);
58805880
58815881 /* raced with another operation, object state is indeterminate */
58825882 const bool need_invalidate = (r == -ECANCELED);
@@ -5888,7 +5888,7 @@ int RGWRados::Object::Delete::delete_obj(optional_yield y, const DoutPrefixProvi
58885888 tombstone_entry entry{*state};
58895889 obj_tombstone_cache->add (obj, entry);
58905890 }
5891- r = index_op.complete_del (dpp, poolid, ioctx. get_last_version () , state->mtime , params.remove_objs , y, log_op);
5891+ r = index_op.complete_del (dpp, poolid, epoch , state->mtime , params.remove_objs , y, log_op);
58925892
58935893 int ret = target->complete_atomic_modification (dpp, y);
58945894 if (ret < 0 ) {
@@ -6609,7 +6609,8 @@ int RGWRados::set_attrs(const DoutPrefixProvider *dpp, RGWObjectCtx* octx, RGWBu
66096609 struct timespec mtime_ts = real_clock::to_timespec (mtime);
66106610 op.mtime2 (&mtime_ts);
66116611 auto & ioctx = ref.ioctx ;
6612- r = rgw_rados_operate (dpp, ioctx, ref.obj .oid , &op, y);
6612+ version_t epoch = 0 ;
6613+ r = rgw_rados_operate (dpp, ioctx, ref.obj .oid , &op, y, 0 , nullptr , &epoch);
66136614 if (state) {
66146615 if (r >= 0 ) {
66156616 ACLOwner owner;
@@ -6640,7 +6641,6 @@ int RGWRados::set_attrs(const DoutPrefixProvider *dpp, RGWObjectCtx* octx, RGWBu
66406641 iter != state->attrset .end ()) {
66416642 storage_class = rgw_bl_str (iter->second );
66426643 }
6643- uint64_t epoch = ioctx.get_last_version ();
66446644 int64_t poolid = ioctx.get_id ();
66456645 r = index_op.complete (dpp, poolid, epoch, state->size , state->accounted_size ,
66466646 mtime, etag, content_type, storage_class, owner,
@@ -8805,12 +8805,7 @@ int RGWRados::raw_obj_stat(const DoutPrefixProvider *dpp,
88058805 }
88068806
88078807 bufferlist outbl;
8808- r = rgw_rados_operate (dpp, ref.ioctx , ref.obj .oid , &op, &outbl, y);
8809-
8810- if (epoch) {
8811- *epoch = ref.ioctx .get_last_version ();
8812- }
8813-
8808+ r = rgw_rados_operate (dpp, ref.ioctx , ref.obj .oid , &op, &outbl, y, 0 , nullptr , epoch);
88148809 if (r < 0 )
88158810 return r;
88168811
@@ -9662,6 +9657,12 @@ int RGWRados::cls_bucket_list_ordered(const DoutPrefixProvider *dpp,
96629657 num_entries << " total entries" << dendl;
96639658
96649659 auto & ioctx = index_pool;
9660+
9661+ // XXX: check_disk_state() relies on ioctx.get_last_version() but that
9662+ // returns 0 because CLSRGWIssueBucketList doesn't make any synchonous calls
9663+ rgw_bucket_entry_ver index_ver;
9664+ index_ver.pool = ioctx.get_id ();
9665+
96659666 std::map<int , rgw_cls_list_ret> shard_list_results;
96669667 cls_rgw_obj_key start_after_key (start_after.name , start_after.instance );
96679668 maybe_warn_about_blocking (dpp); // TODO: use AioTrottle
@@ -9786,12 +9787,10 @@ int RGWRados::cls_bucket_list_ordered(const DoutPrefixProvider *dpp,
97869787 /* there are uncommitted ops. We need to check the current
97879788 * state, and if the tags are old we need to do clean-up as
97889789 * well. */
9789- librados::IoCtx sub_ctx;
9790- sub_ctx.dup (ioctx);
97919790 ldout_bitx (bitx, dpp, 20 ) << " INFO: " << __func__ <<
97929791 " calling check_disk_state bucket=" << bucket_info.bucket <<
97939792 " entry=" << dirent.key << dendl_bitx;
9794- r = check_disk_state (dpp, sub_ctx, bucket_info , dirent, dirent,
9793+ r = check_disk_state (dpp, bucket_info, index_ver , dirent, dirent,
97959794 updates[tracker.oid_name ], y);
97969795 if (r < 0 && r != -ENOENT) {
97979796 ldpp_dout (dpp, 0 ) << __func__ <<
@@ -10013,6 +10012,9 @@ int RGWRados::cls_bucket_list_unordered(const DoutPrefixProvider *dpp,
1001310012 }
1001410013 }
1001510014
10015+ rgw_bucket_entry_ver index_ver;
10016+ index_ver.pool = ioctx.get_id ();
10017+
1001610018 uint32_t count = 0u ;
1001710019 std::map<std::string, bufferlist> updates;
1001810020 rgw_obj_index_key last_added_entry;
@@ -10027,7 +10029,7 @@ int RGWRados::cls_bucket_list_unordered(const DoutPrefixProvider *dpp,
1002710029 cls_rgw_bucket_list_op (op, marker, prefix, empty_delimiter,
1002810030 num_entries,
1002910031 list_versions, &result);
10030- r = rgw_rados_operate (dpp, ioctx, oid, &op, nullptr , y);
10032+ r = rgw_rados_operate (dpp, ioctx, oid, &op, nullptr , y, 0 , nullptr , &index_ver. epoch );
1003110033 if (r < 0 ) {
1003210034 ldpp_dout (dpp, 0 ) << " ERROR: " << __func__ <<
1003310035 " : error in rgw_rados_operate (bucket list op), r=" << r << dendl;
@@ -10044,12 +10046,10 @@ int RGWRados::cls_bucket_list_unordered(const DoutPrefixProvider *dpp,
1004410046 force_check) {
1004510047 /* there are uncommitted ops. We need to check the current state,
1004610048 * and if the tags are old we need to do cleanup as well. */
10047- librados::IoCtx sub_ctx;
10048- sub_ctx.dup (ioctx);
1004910049 ldout_bitx (bitx, dpp, 20 ) << " INFO: " << __func__ <<
1005010050 " : calling check_disk_state bucket=" << bucket_info.bucket <<
1005110051 " entry=" << dirent.key << dendl_bitx;
10052- r = check_disk_state (dpp, sub_ctx, bucket_info , dirent, dirent, updates[oid], y);
10052+ r = check_disk_state (dpp, bucket_info, index_ver , dirent, dirent, updates[oid], y);
1005310053 if (r < 0 && r != -ENOENT) {
1005410054 ldpp_dout (dpp, 0 ) << " ERROR: " << __func__ <<
1005510055 " : error in check_disk_state, r=" << r << dendl;
@@ -10281,8 +10281,8 @@ int RGWRados::remove_objs_from_index(const DoutPrefixProvider *dpp,
1028110281}
1028210282
1028310283int RGWRados::check_disk_state (const DoutPrefixProvider *dpp,
10284- librados::IoCtx io_ctx,
1028510284 RGWBucketInfo& bucket_info,
10285+ const rgw_bucket_entry_ver& index_ver,
1028610286 rgw_bucket_dir_entry& list_state,
1028710287 rgw_bucket_dir_entry& object,
1028810288 bufferlist& suggested_updates,
@@ -10310,8 +10310,6 @@ int RGWRados::check_disk_state(const DoutPrefixProvider *dpp,
1031010310 ldpp_dout (dpp, 0 ) << " WARNING: generated locator (" << loc << " ) is different from listed locator (" << list_state.locator << " )" << dendl;
1031110311 }
1031210312
10313- io_ctx.locator_set_key (list_state.locator );
10314-
1031510313 RGWObjState *astate = NULL ;
1031610314 RGWObjManifest *manifest = nullptr ;
1031710315 RGWObjectCtx octx (this ->driver );
@@ -10332,8 +10330,7 @@ int RGWRados::check_disk_state(const DoutPrefixProvider *dpp,
1033210330 }
1033310331
1033410332 // encode a suggested removal of that key
10335- list_state.ver .epoch = io_ctx.get_last_version ();
10336- list_state.ver .pool = io_ctx.get_id ();
10333+ list_state.ver = index_ver;
1033710334 ldout_bitx (bitx, dpp, 10 ) << " INFO: " << __func__ << " : encoding remove of " << list_state.key << " on suggested_updates" << dendl_bitx;
1033810335 cls_rgw_encode_suggestion (CEPH_RGW_REMOVE | suggest_flag, list_state, suggested_updates);
1033910336 return -ENOENT;
0 commit comments