1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab ft=cpp
4 #include "rgw_common.h"
5 #include "rgw_coroutine.h"
6 #include "rgw_cr_rados.h"
7 #include "rgw_sync_module.h"
8 #include "rgw_data_sync.h"
9 #include "rgw_sync_module_log.h"
11 #define dout_subsys ceph_subsys_rgw
13 class RGWLogStatRemoteObjCBCR
: public RGWStatRemoteObjCBCR
{
15 RGWLogStatRemoteObjCBCR(RGWDataSyncCtx
*_sc
,
16 rgw_bucket
& _src_bucket
, rgw_obj_key
& _key
) : RGWStatRemoteObjCBCR(_sc
, _src_bucket
, _key
) {}
17 int operate() override
{
18 ldout(sync_env
->cct
, 0) << "SYNC_LOG: stat of remote obj: z=" << sc
->source_zone
19 << " b=" << src_bucket
<< " k=" << key
<< " size=" << size
<< " mtime=" << mtime
20 << " attrs=" << attrs
<< dendl
;
26 class RGWLogStatRemoteObjCR
: public RGWCallStatRemoteObjCR
{
28 RGWLogStatRemoteObjCR(RGWDataSyncCtx
*_sc
,
29 rgw_bucket
& _src_bucket
, rgw_obj_key
& _key
) : RGWCallStatRemoteObjCR(_sc
, _src_bucket
, _key
) {
32 ~RGWLogStatRemoteObjCR() override
{}
34 RGWStatRemoteObjCBCR
*allocate_callback() override
{
35 return new RGWLogStatRemoteObjCBCR(sc
, src_bucket
, key
);
39 class RGWLogDataSyncModule
: public RGWDataSyncModule
{
42 explicit RGWLogDataSyncModule(const string
& _prefix
) : prefix(_prefix
) {}
44 RGWCoroutine
*sync_object(RGWDataSyncCtx
*sc
, rgw_bucket_sync_pipe
& sync_pipe
, rgw_obj_key
& key
, std::optional
<uint64_t> versioned_epoch
, rgw_zone_set
*zones_trace
) override
{
45 ldout(sc
->cct
, 0) << prefix
<< ": SYNC_LOG: sync_object: b=" << sync_pipe
.info
.source_bs
.bucket
<< " k=" << key
<< " versioned_epoch=" << versioned_epoch
.value_or(0) << dendl
;
46 return new RGWLogStatRemoteObjCR(sc
, sync_pipe
.info
.source_bs
.bucket
, key
);
48 RGWCoroutine
*remove_object(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
{
49 ldout(sc
->cct
, 0) << prefix
<< ": SYNC_LOG: rm_object: b=" << sync_pipe
.info
.source_bs
.bucket
<< " k=" << key
<< " mtime=" << mtime
<< " versioned=" << versioned
<< " versioned_epoch=" << versioned_epoch
<< dendl
;
52 RGWCoroutine
*create_delete_marker(RGWDataSyncCtx
*sc
, rgw_bucket_sync_pipe
& sync_pipe
, rgw_obj_key
& key
, real_time
& mtime
,
53 rgw_bucket_entry_owner
& owner
, bool versioned
, uint64_t versioned_epoch
, rgw_zone_set
*zones_trace
) override
{
54 ldout(sc
->cct
, 0) << prefix
<< ": SYNC_LOG: create_delete_marker: b=" << sync_pipe
.info
.source_bs
.bucket
<< " k=" << key
<< " mtime=" << mtime
55 << " versioned=" << versioned
<< " versioned_epoch=" << versioned_epoch
<< dendl
;
60 class RGWLogSyncModuleInstance
: public RGWSyncModuleInstance
{
61 RGWLogDataSyncModule data_handler
;
63 explicit RGWLogSyncModuleInstance(const string
& prefix
) : data_handler(prefix
) {}
64 RGWDataSyncModule
*get_data_handler() override
{
69 int RGWLogSyncModule::create_instance(CephContext
*cct
, const JSONFormattable
& config
, RGWSyncModuleInstanceRef
*instance
) {
70 string prefix
= config
["prefix"];
71 instance
->reset(new RGWLogSyncModuleInstance(prefix
));