#include "rgw_zone.h"
#include "rgw_coroutine.h"
#include "rgw_cr_rados.h"
+#include "rgw_sync_counters.h"
#include "services/svc_zone.h"
#include "services/svc_zone_utils.h"
rgw_obj dest_obj(bucket_info.bucket, dest_key.value_or(key));
+ std::optional<uint64_t> bytes_transferred;
int r = store->fetch_remote_obj(obj_ctx,
user_id,
NULL, /* req_info */
NULL, /* string *petag, */
NULL, /* void (*progress_cb)(off_t, void *), */
NULL, /* void *progress_data*); */
- &zones_trace);
+ &zones_trace,
+ &bytes_transferred);
if (r < 0) {
ldout(store->ctx(), 0) << "store->fetch_remote_obj() returned r=" << r << dendl;
+ if (counters) {
+ counters->inc(sync_counters::l_fetch_err, 1);
+ }
+ } else if (counters) {
+ if (bytes_transferred) {
+ counters->inc(sync_counters::l_fetch, *bytes_transferred);
+ } else {
+ counters->inc(sync_counters::l_fetch_not_modified);
+ }
}
return r;
}
bool copy_if_newer;
rgw_zone_set zones_trace;
+ PerfCounters* counters;
protected:
int _send_request() override;
const rgw_obj_key& _key,
const std::optional<rgw_obj_key>& _dest_key,
std::optional<uint64_t> _versioned_epoch,
- bool _if_newer, rgw_zone_set *_zones_trace) : RGWAsyncRadosRequest(caller, cn), store(_store),
- source_zone(_source_zone),
- bucket_info(_bucket_info),
- dest_placement_rule(_dest_placement_rule),
- key(_key),
- dest_key(_dest_key),
- versioned_epoch(_versioned_epoch),
- copy_if_newer(_if_newer)
+ bool _if_newer, rgw_zone_set *_zones_trace,
+ PerfCounters* counters)
+ : RGWAsyncRadosRequest(caller, cn), store(_store),
+ source_zone(_source_zone),
+ bucket_info(_bucket_info),
+ dest_placement_rule(_dest_placement_rule),
+ key(_key),
+ dest_key(_dest_key),
+ versioned_epoch(_versioned_epoch),
+ copy_if_newer(_if_newer), counters(counters)
{
if (_zones_trace) {
zones_trace = *_zones_trace;
RGWAsyncFetchRemoteObj *req;
rgw_zone_set *zones_trace;
+ PerfCounters* counters;
public:
RGWFetchRemoteObjCR(RGWAsyncRadosProcessor *_async_rados, RGWRados *_store,
const rgw_obj_key& _key,
const std::optional<rgw_obj_key>& _dest_key,
std::optional<uint64_t> _versioned_epoch,
- bool _if_newer, rgw_zone_set *_zones_trace) : RGWSimpleCoroutine(_store->ctx()), cct(_store->ctx()),
- async_rados(_async_rados), store(_store),
- source_zone(_source_zone),
- bucket_info(_bucket_info),
- dest_placement_rule(_dest_placement_rule),
- key(_key),
- dest_key(_dest_key),
- versioned_epoch(_versioned_epoch),
- copy_if_newer(_if_newer), req(NULL), zones_trace(_zones_trace) {}
+ bool _if_newer, rgw_zone_set *_zones_trace,
+ PerfCounters* counters)
+ : RGWSimpleCoroutine(_store->ctx()), cct(_store->ctx()),
+ async_rados(_async_rados), store(_store),
+ source_zone(_source_zone),
+ bucket_info(_bucket_info),
+ dest_placement_rule(_dest_placement_rule),
+ key(_key),
+ dest_key(_dest_key),
+ versioned_epoch(_versioned_epoch),
+ copy_if_newer(_if_newer), req(NULL),
+ zones_trace(_zones_trace), counters(counters) {}
~RGWFetchRemoteObjCR() override {
int send_request() override {
req = new RGWAsyncFetchRemoteObj(this, stack->create_completion_notifier(), store,
source_zone, bucket_info, dest_placement_rule,
- key, dest_key, versioned_epoch, copy_if_newer, zones_trace);
+ key, dest_key, versioned_epoch, copy_if_newer,
+ zones_trace, counters);
async_rados->queue(req);
return 0;
}
return new RGWFetchRemoteObjCR(sync_env->async_rados, sync_env->store, sync_env->source_zone, bucket_info,
std::nullopt,
key, std::nullopt, versioned_epoch,
- true, zones_trace);
+ true, zones_trace, sync_env->counters);
}
RGWCoroutine *RGWDefaultDataSyncModule::remove_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key,
return new RGWFetchRemoteObjCR(sync_env->async_rados, sync_env->store, sync_env->source_zone,
bucket_info, std::nullopt,
key, dest_key, versioned_epoch,
- true, zones_trace);
+ true, zones_trace, nullptr);
}
RGWCoroutine *RGWArchiveDataSyncModule::remove_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key,