diff --git a/src/rgw/rgw_lc.cc b/src/rgw/rgw_lc.cc index 2be2d86b824feb..0e673f0b477b8b 100644 --- a/src/rgw/rgw_lc.cc +++ b/src/rgw/rgw_lc.cc @@ -423,7 +423,7 @@ int RGWLC::bucket_lc_process(string& shard_id) RGWObjectCtx rctx(store); rgw_obj obj(bucket_info.bucket, obj_iter->key); RGWObjState *state; - int ret = store->get_obj_state(&rctx, obj, &state, false); + int ret = store->get_obj_state(&rctx, bucket_info, obj, &state, false); if (ret < 0) { return ret; } diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 3917d7cb5a6dcc..47febd1bc62a1b 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -5490,8 +5490,7 @@ void RGWSetAttrs::execute() if (op_ret < 0) return; - rgw_obj obj(s->bucket, s->object.name); - obj.set_instance(s->object.instance); + rgw_obj obj(s->bucket, s->object); store->set_atomic(s->obj_ctx, obj); diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 499141f6f764dc..af00d1980ce965 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -186,6 +186,36 @@ int rgw_init_ioctx(librados::Rados *rados, const rgw_pool& pool, IoCtx& ioctx, b return 0; } +template<> +void RGWObjectCtxImpl::invalidate(rgw_obj& obj) { + RWLock::WLocker wl(lock); + auto iter = objs_state.find(obj); + if (iter == objs_state.end()) { + return; + } + bool is_atomic = iter->second.is_atomic; + bool prefetch_data = iter->second.prefetch_data; + + objs_state.erase(iter); + + if (is_atomic || prefetch_data) { + auto& s = objs_state[obj]; + s.is_atomic = is_atomic; + s.prefetch_data = prefetch_data; + } +} + +template<> +void RGWObjectCtxImpl::invalidate(rgw_raw_obj& obj) { + RWLock::WLocker wl(lock); + auto iter = objs_state.find(obj); + if (iter == objs_state.end()) { + return; + } + + objs_state.erase(iter); +} + void RGWDefaultZoneGroupInfo::dump(Formatter *f) const { encode_json("default_zonegroup", default_zonegroup, f); } @@ -5062,7 +5092,7 @@ int RGWRados::Bucket::List::list_objects(int max, vector * rgw_obj_index_key cur_end_marker; if (!params.ns.empty()) { end_marker_obj = rgw_obj_key(params.end_marker.name, params.end_marker.instance, params.ns); - end_marker_obj.set_ns(params.ns); + end_marker_obj.ns = params.ns; end_marker_obj.get_index_key(&cur_end_marker); } rgw_obj_index_key cur_marker; @@ -8337,7 +8367,7 @@ int RGWRados::delete_raw_obj(const rgw_raw_obj& obj) int RGWRados::delete_system_obj(rgw_raw_obj& obj, RGWObjVersionTracker *objv_tracker) { - if (obj.get_object().empty()) { + if (obj.empty()) { ldout(cct, 1) << "delete_system_obj got empty object name " << obj << ", returning EINVAL" << dendl; return -EINVAL; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 833f15c554e611..24dbffff425c54 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -2104,6 +2104,12 @@ class RGWObjectCtxImpl { } }; +template<> +void RGWObjectCtxImpl::invalidate(rgw_obj& obj); + +template<> +void RGWObjectCtxImpl::invalidate(rgw_raw_obj& obj); + struct RGWObjectCtx { RGWRados *store; void *user_ctx; @@ -3135,7 +3141,7 @@ class RGWRados int get_system_obj_state(RGWObjectCtx *rctx, rgw_raw_obj& obj, RGWRawObjState **state, RGWObjVersionTracker *objv_tracker); int get_obj_state(RGWObjectCtx *rctx, const RGWBucketInfo& bucket_info, const rgw_obj& obj, RGWObjState **state, - bool follow_olh, assume_noent = false); + bool follow_olh, bool assume_noent = false); int get_obj_state(RGWObjectCtx *rctx, const RGWBucketInfo& bucket_info, const rgw_obj& obj, RGWObjState **state) { return get_obj_state(rctx, bucket_info, obj, state, true); } diff --git a/src/rgw/rgw_tools.cc b/src/rgw/rgw_tools.cc index 6a607f69cb69e7..e58182bddab095 100644 --- a/src/rgw/rgw_tools.cc +++ b/src/rgw/rgw_tools.cc @@ -91,10 +91,10 @@ int rgw_get_system_obj(RGWRados *rgwstore, RGWObjectCtx& obj_ctx, rgw_pool& pool return 0; } -int rgw_delete_system_obj(RGWRados *rgwstore, rgw_bucket& bucket, const string& oid, +int rgw_delete_system_obj(RGWRados *rgwstore, rgw_pool& pool, const string& oid, RGWObjVersionTracker *objv_tracker) { - rgw_obj obj(bucket, oid); + rgw_raw_obj obj(pool, oid); return rgwstore->delete_system_obj(obj, objv_tracker); } diff --git a/src/rgw/rgw_tools.h b/src/rgw/rgw_tools.h index bec35ed71a16d9..97df2021d8dd73 100644 --- a/src/rgw/rgw_tools.h +++ b/src/rgw/rgw_tools.h @@ -21,7 +21,7 @@ int rgw_put_system_obj(RGWRados *rgwstore, rgw_pool& pool, const string& oid, co int rgw_get_system_obj(RGWRados *rgwstore, RGWObjectCtx& obj_ctx, rgw_pool& pool, const string& key, bufferlist& bl, RGWObjVersionTracker *objv_tracker, real_time *pmtime, map *pattrs = NULL, rgw_cache_entry_info *cache_info = NULL); -int rgw_delete_system_obj(RGWRados *rgwstore, rgw_bucket& bucket, const string& oid, +int rgw_delete_system_obj(RGWRados *rgwstore, rgw_pool& pool, const string& oid, RGWObjVersionTracker *objv_tracker); int rgw_tools_init(CephContext *cct);