rgw::sal::RadosBucket dest_bucket(store, dest_bucket_info);
rgw::sal::RadosObject dest_obj(store, dest_key.value_or(key), &dest_bucket);
-
+
+ rgw_obj stat_dest_obj;
+
+ if (!stat_follow_olh) {
+ stat_dest_obj = dest_obj.get_obj();
+ } else {
+ stat_dest_obj = src_obj;
+ }
+
std::string etag;
std::optional<uint64_t> bytes_transferred;
NULL, /* void *progress_data*); */
dpp,
filter.get(),
+ stat_follow_olh,
+ stat_dest_obj,
source_trace_entry,
&zones_trace,
&bytes_transferred);
bool copy_if_newer;
std::shared_ptr<RGWFetchObjFilter> filter;
+ bool stat_follow_olh;
rgw_zone_set_entry source_trace_entry;
rgw_zone_set zones_trace;
PerfCounters* counters;
std::optional<uint64_t> _versioned_epoch,
bool _if_newer,
std::shared_ptr<RGWFetchObjFilter> _filter,
+ bool _stat_follow_olh,
const rgw_zone_set_entry& source_trace_entry,
rgw_zone_set *_zones_trace,
- PerfCounters* counters, const DoutPrefixProvider *dpp)
+ PerfCounters* counters,
+ const DoutPrefixProvider *dpp)
: RGWAsyncRadosRequest(caller, cn), store(_store),
source_zone(_source_zone),
user_id(_user_id),
versioned_epoch(_versioned_epoch),
copy_if_newer(_if_newer),
filter(_filter),
+ stat_follow_olh(_stat_follow_olh),
source_trace_entry(source_trace_entry),
counters(counters),
dpp(dpp)
std::shared_ptr<RGWFetchObjFilter> filter;
RGWAsyncFetchRemoteObj *req;
+ bool stat_follow_olh;
const rgw_zone_set_entry& source_trace_entry;
rgw_zone_set *zones_trace;
PerfCounters* counters;
std::optional<uint64_t> _versioned_epoch,
bool _if_newer,
std::shared_ptr<RGWFetchObjFilter> _filter,
+ bool _stat_follow_olh,
const rgw_zone_set_entry& source_trace_entry,
rgw_zone_set *_zones_trace,
- PerfCounters* counters, const DoutPrefixProvider *dpp)
+ PerfCounters* counters,
+ const DoutPrefixProvider *dpp)
: RGWSimpleCoroutine(_store->ctx()), cct(_store->ctx()),
async_rados(_async_rados), store(_store),
source_zone(_source_zone),
copy_if_newer(_if_newer),
filter(_filter),
req(NULL),
+ stat_follow_olh(_stat_follow_olh),
source_trace_entry(source_trace_entry),
zones_trace(_zones_trace), counters(counters), dpp(dpp) {}
int send_request(const DoutPrefixProvider *dpp) override {
req = new RGWAsyncFetchRemoteObj(this, stack->create_completion_notifier(), store,
- source_zone, user_id, src_bucket, dest_placement_rule, dest_bucket_info,
+ source_zone, user_id, src_bucket, dest_placement_rule, dest_bucket_info,
key, dest_key, versioned_epoch, copy_if_newer, filter,
- source_trace_entry, zones_trace, counters, dpp);
+ stat_follow_olh, source_trace_entry, zones_trace, counters, dpp);
async_rados->queue(req);
return 0;
}
rgw_obj_key& key;
std::optional<rgw_obj_key> dest_key;
std::optional<uint64_t> versioned_epoch;
+ bool stat_follow_olh;
const rgw_zone_set_entry& source_trace_entry;
rgw_zone_set *zones_trace;
rgw_obj_key& _key,
std::optional<rgw_obj_key> _dest_key,
std::optional<uint64_t> _versioned_epoch,
+ bool _stat_follow_olh,
const rgw_zone_set_entry& source_trace_entry,
rgw_zone_set *_zones_trace) : RGWCoroutine(_sc->cct),
sc(_sc), sync_env(_sc->env),
key(_key),
dest_key(_dest_key),
versioned_epoch(_versioned_epoch),
+ stat_follow_olh(_stat_follow_olh),
source_trace_entry(source_trace_entry),
zones_trace(_zones_trace) {
}
call(new RGWFetchRemoteObjCR(sync_env->async_rados, sync_env->driver, sc->source_zone,
nullopt,
- sync_pipe.info.source_bs.bucket,
+ sync_pipe.source_bucket_info.bucket,
std::nullopt, sync_pipe.dest_bucket_info,
key, dest_key, versioned_epoch,
true,
std::static_pointer_cast<RGWFetchObjFilter>(filter),
+ stat_follow_olh,
source_trace_entry, zones_trace,
sync_env->counters, dpp));
}
const rgw_zone_set_entry& source_trace_entry,
rgw_zone_set *zones_trace)
{
- return new RGWObjFetchCR(sc, sync_pipe, key, std::nullopt, versioned_epoch,
+ bool stat_follow_olh = false;
+ return new RGWObjFetchCR(sc, sync_pipe, key, std::nullopt, versioned_epoch, stat_follow_olh,
source_trace_entry, zones_trace);
}
}
std::optional<rgw_obj_key> dest_key;
+ bool stat_follow_olh = false;
+
if (versioned_epoch.value_or(0) == 0) { /* force version if not set */
+ stat_follow_olh = true;
versioned_epoch = 0;
dest_key = key;
+ if (key.instance.empty()) {
+ sync_env->driver->getRados()->gen_rand_obj_instance_name(&(*dest_key));
+ }
}
if (key.instance.empty()) {
}
return new RGWObjFetchCR(sc, sync_pipe, key, dest_key, versioned_epoch,
- source_trace_entry, zones_trace);
+ stat_follow_olh, source_trace_entry, zones_trace);
}
RGWCoroutine *RGWArchiveDataSyncModule::remove_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key,
void *progress_data,
const DoutPrefixProvider *dpp,
RGWFetchObjFilter *filter,
+ bool stat_follow_olh,
+ const rgw_obj& stat_dest_obj,
const rgw_zone_set_entry& source_trace_entry,
rgw_zone_set *zones_trace,
std::optional<uint64_t>* bytes_transferred)
if (copy_if_newer) {
/* need to get mtime for destination */
- ret = get_obj_state(dpp, &obj_ctx, dest_bucket_info, dest_obj, &dest_state, &manifest, false, null_yield);
+ ret = get_obj_state(dpp, &obj_ctx, dest_bucket_info, stat_dest_obj, &dest_state, &manifest, stat_follow_olh, null_yield);
if (ret < 0)
goto set_err_state;
if (copy_if_newer && canceled) {
ldpp_dout(dpp, 20) << "raced with another write of obj: " << dest_obj << dendl;
obj_ctx.invalidate(dest_obj); /* object was overwritten */
- ret = get_obj_state(dpp, &obj_ctx, dest_bucket_info, dest_obj, &dest_state, &manifest, false, null_yield);
+ ret = get_obj_state(dpp, &obj_ctx, dest_bucket_info, stat_dest_obj, &dest_state, &manifest, stat_follow_olh, null_yield);
if (ret < 0) {
ldpp_dout(dpp, 0) << "ERROR: " << __func__ << ": get_err_state() returned ret=" << ret << dendl;
goto set_err_state;
bool remote_src;
bool remote_dest;
+ bool stat_follow_olh = false;
+ rgw_obj stat_dest_obj = dest_obj;
+
append_rand_alpha(cct, dest_obj.get_oid(), shadow_oid, 32);
shadow_obj.init_ns(dest_obj.bucket, shadow_oid, shadow_ns);
unmod_ptr, high_precision_time,
if_match, if_nomatch, attrs_mod, copy_if_newer, attrs, category,
olh_epoch, delete_at, ptag, petag, progress_cb, progress_data, dpp,
- nullptr /* filter */, source_trace_entry);
+ nullptr /* filter */, stat_follow_olh, stat_dest_obj, source_trace_entry);
}
map<string, bufferlist> src_attrs;
void *progress_data,
const DoutPrefixProvider *dpp,
RGWFetchObjFilter *filter,
+ bool stat_follow_olh,
+ const rgw_obj& stat_dest_obj,
const rgw_zone_set_entry& source_trace_entry,
rgw_zone_set *zones_trace = nullptr,
std::optional<uint64_t>* bytes_transferred = 0);