From fb4dd5c81541568fe068ecf215d8bdbd271cc62c Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Mon, 1 May 2023 12:32:08 -0400 Subject: [PATCH] rgw/rados: pass source zone trace into fetch_remote_obj() Signed-off-by: Casey Bodley (cherry picked from commit 4023a157addfaf9033ac016b9b5446f18a8e728b) --- src/rgw/driver/rados/rgw_cr_rados.cc | 1 + src/rgw/driver/rados/rgw_cr_rados.h | 8 +++- src/rgw/driver/rados/rgw_data_sync.cc | 47 ++++++++++++++++----- src/rgw/driver/rados/rgw_rados.cc | 4 +- src/rgw/driver/rados/rgw_rados.h | 3 +- src/rgw/driver/rados/rgw_sync_module.h | 6 ++- src/rgw/driver/rados/rgw_sync_module_aws.cc | 1 + src/rgw/driver/rados/rgw_sync_module_es.cc | 2 +- src/rgw/driver/rados/rgw_sync_module_log.cc | 2 +- 9 files changed, 58 insertions(+), 16 deletions(-) diff --git a/src/rgw/driver/rados/rgw_cr_rados.cc b/src/rgw/driver/rados/rgw_cr_rados.cc index a3efedb2713e6..25d1e9a9dca28 100644 --- a/src/rgw/driver/rados/rgw_cr_rados.cc +++ b/src/rgw/driver/rados/rgw_cr_rados.cc @@ -772,6 +772,7 @@ int RGWAsyncFetchRemoteObj::_send_request(const DoutPrefixProvider *dpp) NULL, /* void *progress_data*); */ dpp, filter.get(), + source_trace_entry, &zones_trace, &bytes_transferred); diff --git a/src/rgw/driver/rados/rgw_cr_rados.h b/src/rgw/driver/rados/rgw_cr_rados.h index f17061b37ea29..7bda18878f48f 100644 --- a/src/rgw/driver/rados/rgw_cr_rados.h +++ b/src/rgw/driver/rados/rgw_cr_rados.h @@ -1069,6 +1069,7 @@ class RGWAsyncFetchRemoteObj : public RGWAsyncRadosRequest { bool copy_if_newer; std::shared_ptr filter; + rgw_zone_set_entry source_trace_entry; rgw_zone_set zones_trace; PerfCounters* counters; const DoutPrefixProvider *dpp; @@ -1087,6 +1088,7 @@ public: std::optional _versioned_epoch, bool _if_newer, std::shared_ptr _filter, + const rgw_zone_set_entry& source_trace_entry, rgw_zone_set *_zones_trace, PerfCounters* counters, const DoutPrefixProvider *dpp) : RGWAsyncRadosRequest(caller, cn), store(_store), @@ -1100,6 +1102,7 @@ public: versioned_epoch(_versioned_epoch), copy_if_newer(_if_newer), filter(_filter), + source_trace_entry(source_trace_entry), counters(counters), dpp(dpp) { @@ -1132,6 +1135,7 @@ class RGWFetchRemoteObjCR : public RGWSimpleCoroutine { std::shared_ptr filter; RGWAsyncFetchRemoteObj *req; + const rgw_zone_set_entry& source_trace_entry; rgw_zone_set *zones_trace; PerfCounters* counters; const DoutPrefixProvider *dpp; @@ -1148,6 +1152,7 @@ public: std::optional _versioned_epoch, bool _if_newer, std::shared_ptr _filter, + const rgw_zone_set_entry& source_trace_entry, rgw_zone_set *_zones_trace, PerfCounters* counters, const DoutPrefixProvider *dpp) : RGWSimpleCoroutine(_store->ctx()), cct(_store->ctx()), @@ -1163,6 +1168,7 @@ public: copy_if_newer(_if_newer), filter(_filter), req(NULL), + source_trace_entry(source_trace_entry), zones_trace(_zones_trace), counters(counters), dpp(dpp) {} @@ -1181,7 +1187,7 @@ public: req = new RGWAsyncFetchRemoteObj(this, stack->create_completion_notifier(), store, source_zone, user_id, src_bucket, dest_placement_rule, dest_bucket_info, key, dest_key, versioned_epoch, copy_if_newer, filter, - zones_trace, counters, dpp); + source_trace_entry, zones_trace, counters, dpp); async_rados->queue(req); return 0; } diff --git a/src/rgw/driver/rados/rgw_data_sync.cc b/src/rgw/driver/rados/rgw_data_sync.cc index 5981effda6477..a5730e51d032c 100644 --- a/src/rgw/driver/rados/rgw_data_sync.cc +++ b/src/rgw/driver/rados/rgw_data_sync.cc @@ -2474,7 +2474,11 @@ class RGWDefaultDataSyncModule : public RGWDataSyncModule { public: RGWDefaultDataSyncModule() {} - RGWCoroutine *sync_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, std::optional versioned_epoch, rgw_zone_set *zones_trace) override; + RGWCoroutine *sync_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, + rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, + std::optional versioned_epoch, + const rgw_zone_set_entry& source_trace_entry, + rgw_zone_set *zones_trace) override; RGWCoroutine *remove_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, real_time& mtime, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) override; RGWCoroutine *create_delete_marker(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, real_time& mtime, rgw_bucket_entry_owner& owner, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) override; @@ -2782,6 +2786,7 @@ class RGWObjFetchCR : public RGWCoroutine { rgw_obj_key& key; std::optional dest_key; std::optional versioned_epoch; + const rgw_zone_set_entry& source_trace_entry; rgw_zone_set *zones_trace; bool need_more_info{false}; @@ -2810,12 +2815,14 @@ public: rgw_obj_key& _key, std::optional _dest_key, std::optional _versioned_epoch, + const rgw_zone_set_entry& source_trace_entry, rgw_zone_set *_zones_trace) : RGWCoroutine(_sc->cct), sc(_sc), sync_env(_sc->env), sync_pipe(_sync_pipe), key(_key), dest_key(_dest_key), versioned_epoch(_versioned_epoch), + source_trace_entry(source_trace_entry), zones_trace(_zones_trace) { } @@ -2941,7 +2948,8 @@ public: key, dest_key, versioned_epoch, true, std::static_pointer_cast(filter), - zones_trace, sync_env->counters, dpp)); + source_trace_entry, zones_trace, + sync_env->counters, dpp)); } if (retcode < 0) { if (*need_retry) { @@ -2961,9 +2969,14 @@ public: } }; -RGWCoroutine *RGWDefaultDataSyncModule::sync_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, std::optional versioned_epoch, rgw_zone_set *zones_trace) +RGWCoroutine *RGWDefaultDataSyncModule::sync_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, + rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, + std::optional versioned_epoch, + const rgw_zone_set_entry& source_trace_entry, + rgw_zone_set *zones_trace) { - return new RGWObjFetchCR(sc, sync_pipe, key, std::nullopt, versioned_epoch, zones_trace); + return new RGWObjFetchCR(sc, sync_pipe, key, std::nullopt, versioned_epoch, + source_trace_entry, zones_trace); } RGWCoroutine *RGWDefaultDataSyncModule::remove_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, @@ -2988,7 +3001,11 @@ class RGWArchiveDataSyncModule : public RGWDefaultDataSyncModule { public: RGWArchiveDataSyncModule() {} - RGWCoroutine *sync_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, std::optional versioned_epoch, rgw_zone_set *zones_trace) override; + RGWCoroutine *sync_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, + rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, + std::optional versioned_epoch, + const rgw_zone_set_entry& source_trace_entry, + rgw_zone_set *zones_trace) override; RGWCoroutine *remove_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, real_time& mtime, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) override; RGWCoroutine *create_delete_marker(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, real_time& mtime, rgw_bucket_entry_owner& owner, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) override; @@ -3015,7 +3032,11 @@ int RGWArchiveSyncModule::create_instance(const DoutPrefixProvider *dpp, CephCon return 0; } -RGWCoroutine *RGWArchiveDataSyncModule::sync_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, std::optional versioned_epoch, rgw_zone_set *zones_trace) +RGWCoroutine *RGWArchiveDataSyncModule::sync_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, + rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, + std::optional versioned_epoch, + const rgw_zone_set_entry& source_trace_entry, + rgw_zone_set *zones_trace) { auto sync_env = sc->env; ldout(sc->cct, 5) << "SYNC_ARCHIVE: sync_object: b=" << sync_pipe.info.source_bs.bucket << " k=" << key << " versioned_epoch=" << versioned_epoch.value_or(0) << dendl; @@ -3042,7 +3063,8 @@ RGWCoroutine *RGWArchiveDataSyncModule::sync_object(const DoutPrefixProvider *dp sync_env->driver->getRados()->gen_rand_obj_instance_name(&(*dest_key)); } - return new RGWObjFetchCR(sc, sync_pipe, key, dest_key, versioned_epoch, zones_trace); + return new RGWObjFetchCR(sc, sync_pipe, key, dest_key, versioned_epoch, + source_trace_entry, zones_trace); } RGWCoroutine *RGWArchiveDataSyncModule::remove_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, @@ -4273,7 +4295,8 @@ class RGWBucketSyncSingleEntryCR : public RGWCoroutine { bool error_injection; RGWDataSyncModule *data_sync_module; - + + rgw_zone_set_entry source_trace_entry; rgw_zone_set zones_trace; RGWSyncTraceNodeRef tn; @@ -4309,7 +4332,10 @@ public: error_injection = (sync_env->cct->_conf->rgw_sync_data_inject_err_probability > 0); data_sync_module = sync_env->sync_module->get_data_handler(); - + + source_trace_entry.zone = sc->source_zone.id; + source_trace_entry.location_key = _sync_pipe.info.source_bs.bucket.get_key(); + zones_trace = _zones_trace; zones_trace.insert(sync_env->svc->zone->get_zone().id, _sync_pipe.info.dest_bucket.get_key()); @@ -4352,7 +4378,8 @@ public: pretty_print(sc->env, "Syncing object s3://{}/{} in sync from zone {}\n", bs.bucket.name, key, zone_name); } - call(data_sync_module->sync_object(dpp, sc, sync_pipe, key, versioned_epoch, &zones_trace)); + call(data_sync_module->sync_object(dpp, sc, sync_pipe, key, versioned_epoch, + source_trace_entry, &zones_trace)); } else if (op == CLS_RGW_OP_DEL || op == CLS_RGW_OP_UNLINK_INSTANCE) { set_status("removing obj"); if (versioned_epoch) { diff --git a/src/rgw/driver/rados/rgw_rados.cc b/src/rgw/driver/rados/rgw_rados.cc index 02ca98f2498ac..84ac1e26624de 100644 --- a/src/rgw/driver/rados/rgw_rados.cc +++ b/src/rgw/driver/rados/rgw_rados.cc @@ -3881,6 +3881,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, void *progress_data, const DoutPrefixProvider *dpp, RGWFetchObjFilter *filter, + const rgw_zone_set_entry& source_trace_entry, rgw_zone_set *zones_trace, std::optional* bytes_transferred) { @@ -4323,13 +4324,14 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, ldpp_dout(dpp, 5) << "Copy object " << src_obj.bucket << ":" << src_obj.get_oid() << " => " << dest_obj.bucket << ":" << dest_obj.get_oid() << dendl; if (remote_src || !source_zone.empty()) { + rgw_zone_set_entry source_trace_entry{source_zone.id, std::nullopt}; return fetch_remote_obj(obj_ctx, user_id, info, source_zone, dest_obj, src_obj, dest_bucket_info, &src_bucket_info, dest_placement, src_mtime, mtime, mod_ptr, 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 */); + nullptr /* filter */, source_trace_entry); } map src_attrs; diff --git a/src/rgw/driver/rados/rgw_rados.h b/src/rgw/driver/rados/rgw_rados.h index 886ab16cce9b1..17c2bbaf64f7a 100644 --- a/src/rgw/driver/rados/rgw_rados.h +++ b/src/rgw/driver/rados/rgw_rados.h @@ -1132,7 +1132,8 @@ public: void *progress_data, const DoutPrefixProvider *dpp, RGWFetchObjFilter *filter, - rgw_zone_set *zones_trace= nullptr, + const rgw_zone_set_entry& source_trace_entry, + rgw_zone_set *zones_trace = nullptr, std::optional* bytes_transferred = 0); /** * Copy an object. diff --git a/src/rgw/driver/rados/rgw_sync_module.h b/src/rgw/driver/rados/rgw_sync_module.h index 494e88608c11e..38abb3d1adfdf 100644 --- a/src/rgw/driver/rados/rgw_sync_module.h +++ b/src/rgw/driver/rados/rgw_sync_module.h @@ -29,7 +29,11 @@ public: virtual RGWCoroutine *start_sync(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc) { return nullptr; } - virtual RGWCoroutine *sync_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, std::optional versioned_epoch, rgw_zone_set *zones_trace) = 0; + virtual RGWCoroutine *sync_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, + rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, + std::optional versioned_epoch, + const rgw_zone_set_entry& my_trace_entry, + rgw_zone_set *zones_trace) = 0; virtual RGWCoroutine *remove_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& bucket_info, rgw_obj_key& key, real_time& mtime, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) = 0; virtual RGWCoroutine *create_delete_marker(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& bucket_info, rgw_obj_key& key, real_time& mtime, diff --git a/src/rgw/driver/rados/rgw_sync_module_aws.cc b/src/rgw/driver/rados/rgw_sync_module_aws.cc index 55340b16cefe8..cefcd9dd10c61 100644 --- a/src/rgw/driver/rados/rgw_sync_module_aws.cc +++ b/src/rgw/driver/rados/rgw_sync_module_aws.cc @@ -1782,6 +1782,7 @@ public: RGWCoroutine *sync_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, std::optional versioned_epoch, + const rgw_zone_set_entry& source_trace_entry, rgw_zone_set *zones_trace) override { ldout(sc->cct, 0) << instance.id << ": sync_object: b=" << sync_pipe.info.source_bs.bucket << " k=" << key << " versioned_epoch=" << versioned_epoch.value_or(0) << dendl; return new RGWAWSHandleRemoteObjCR(sc, sync_pipe, key, instance, versioned_epoch.value_or(0)); diff --git a/src/rgw/driver/rados/rgw_sync_module_es.cc b/src/rgw/driver/rados/rgw_sync_module_es.cc index 3c294bbbc193e..4e8eb6201db4a 100644 --- a/src/rgw/driver/rados/rgw_sync_module_es.cc +++ b/src/rgw/driver/rados/rgw_sync_module_es.cc @@ -886,7 +886,7 @@ public: return new RGWElasticGetESInfoCBCR(sc, conf); } - RGWCoroutine *sync_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, std::optional versioned_epoch, rgw_zone_set *zones_trace) override { + RGWCoroutine *sync_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, std::optional versioned_epoch, const rgw_zone_set_entry& source_trace_entry, rgw_zone_set *zones_trace) override { ldpp_dout(dpp, 10) << conf->id << ": sync_object: b=" << sync_pipe.info.source_bs.bucket << " k=" << key << " versioned_epoch=" << versioned_epoch.value_or(0) << dendl; if (!conf->should_handle_operation(sync_pipe.dest_bucket_info)) { ldpp_dout(dpp, 10) << conf->id << ": skipping operation (bucket not approved)" << dendl; diff --git a/src/rgw/driver/rados/rgw_sync_module_log.cc b/src/rgw/driver/rados/rgw_sync_module_log.cc index a21604cc228ed..9666ecc4cf686 100644 --- a/src/rgw/driver/rados/rgw_sync_module_log.cc +++ b/src/rgw/driver/rados/rgw_sync_module_log.cc @@ -43,7 +43,7 @@ class RGWLogDataSyncModule : public RGWDataSyncModule { public: explicit RGWLogDataSyncModule(const string& _prefix) : prefix(_prefix) {} - RGWCoroutine *sync_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, std::optional versioned_epoch, rgw_zone_set *zones_trace) override { + RGWCoroutine *sync_object(const DoutPrefixProvider *dpp, RGWDataSyncCtx *sc, rgw_bucket_sync_pipe& sync_pipe, rgw_obj_key& key, std::optional versioned_epoch, const rgw_zone_set_entry& source_trace_entry, rgw_zone_set *zones_trace) override { ldpp_dout(dpp, 0) << prefix << ": SYNC_LOG: sync_object: b=" << sync_pipe.info.source_bs.bucket << " k=" << key << " versioned_epoch=" << versioned_epoch.value_or(0) << dendl; return new RGWLogStatRemoteObjCR(sc, sync_pipe.info.source_bs.bucket, key); } -- 2.39.5