From: Zhang Shaowen Date: Fri, 3 Feb 2017 02:03:45 +0000 (+0800) Subject: rgw: optimize data sync. Add zones_trace in bi log to avoid needless sync. X-Git-Tag: v12.1.0~87^2~7^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=014c55df97c5ff0d45381d19c88271c27dc03e97;p=ceph.git rgw: optimize data sync. Add zones_trace in bi log to avoid needless sync. Fixes: http://tracker.ceph.com/issues/19219 Signed-off-by: Zhang Shaowen --- diff --git a/src/cls/rgw/cls_rgw.cc b/src/cls/rgw/cls_rgw.cc index aad9b4f8ac68..0361a5ca25a7 100644 --- a/src/cls/rgw/cls_rgw.cc +++ b/src/cls/rgw/cls_rgw.cc @@ -111,7 +111,7 @@ static void bi_log_index_key(cls_method_context_t hctx, string& key, string& id, static int log_index_operation(cls_method_context_t hctx, cls_rgw_obj_key& obj_key, RGWModifyOp op, string& tag, real_time& timestamp, rgw_bucket_entry_ver& ver, RGWPendingState state, uint64_t index_ver, - string& max_marker, uint16_t bilog_flags, string *owner, string *owner_display_name) + string& max_marker, uint16_t bilog_flags, string *owner, string *owner_display_name, rgw_zone_set *zones_trace) { bufferlist bl; @@ -132,6 +132,9 @@ static int log_index_operation(cls_method_context_t hctx, cls_rgw_obj_key& obj_k if (owner_display_name) { entry.owner_display_name = *owner_display_name; } + if (zones_trace) { + entry.zones_trace = std::move(*zones_trace); + } string key; bi_log_index_key(hctx, key, entry.id, index_ver); @@ -689,7 +692,7 @@ int rgw_bucket_prepare_op(cls_method_context_t hctx, bufferlist *in, bufferlist if (op.log_op) { rc = log_index_operation(hctx, op.key, op.op, op.tag, entry.meta.mtime, - entry.ver, info.state, header.ver, header.max_marker, op.bilog_flags, NULL, NULL); + entry.ver, info.state, header.ver, header.max_marker, op.bilog_flags, NULL, NULL, &op.zones_trace); if (rc < 0) return rc; } @@ -846,7 +849,7 @@ int rgw_bucket_complete_op(cls_method_context_t hctx, bufferlist *in, bufferlist if (cancel) { if (op.log_op) { rc = log_index_operation(hctx, op.key, op.op, op.tag, entry.meta.mtime, entry.ver, - CLS_RGW_STATE_COMPLETE, header.ver, header.max_marker, op.bilog_flags, NULL, NULL); + CLS_RGW_STATE_COMPLETE, header.ver, header.max_marker, op.bilog_flags, NULL, NULL, &op.zones_trace); if (rc < 0) return rc; } @@ -908,7 +911,7 @@ int rgw_bucket_complete_op(cls_method_context_t hctx, bufferlist *in, bufferlist if (op.log_op) { rc = log_index_operation(hctx, op.key, op.op, op.tag, entry.meta.mtime, entry.ver, - CLS_RGW_STATE_COMPLETE, header.ver, header.max_marker, op.bilog_flags, NULL, NULL); + CLS_RGW_STATE_COMPLETE, header.ver, header.max_marker, op.bilog_flags, NULL, NULL, &op.zones_trace); if (rc < 0) return rc; } @@ -933,7 +936,7 @@ int rgw_bucket_complete_op(cls_method_context_t hctx, bufferlist *in, bufferlist if (op.log_op) { rc = log_index_operation(hctx, remove_key, CLS_RGW_OP_DEL, op.tag, remove_entry.meta.mtime, - remove_entry.ver, CLS_RGW_STATE_COMPLETE, header.ver, header.max_marker, op.bilog_flags, NULL, NULL); + remove_entry.ver, CLS_RGW_STATE_COMPLETE, header.ver, header.max_marker, op.bilog_flags, NULL, NULL, &op.zones_trace); if (rc < 0) continue; } @@ -1536,7 +1539,7 @@ static int rgw_bucket_link_olh(cls_method_context_t hctx, bufferlist *in, buffer ret = log_index_operation(hctx, op.key, operation, op.op_tag, entry.meta.mtime, ver, CLS_RGW_STATE_COMPLETE, header.ver, header.max_marker, op.bilog_flags | RGW_BILOG_FLAG_VERSIONED_OP, - powner, powner_display_name); + powner, powner_display_name, &op.zones_trace); if (ret < 0) return ret; } @@ -1682,7 +1685,7 @@ static int rgw_bucket_unlink_instance(cls_method_context_t hctx, bufferlist *in, ret = log_index_operation(hctx, op.key, CLS_RGW_OP_UNLINK_INSTANCE, op.op_tag, mtime, ver, CLS_RGW_STATE_COMPLETE, header.ver, header.max_marker, - op.bilog_flags | RGW_BILOG_FLAG_VERSIONED_OP, NULL, NULL); + op.bilog_flags | RGW_BILOG_FLAG_VERSIONED_OP, NULL, NULL, &op.zones_trace); if (ret < 0) return ret; } @@ -1942,7 +1945,7 @@ int rgw_dir_suggest_changes(cls_method_context_t hctx, bufferlist *in, bufferlis return ret; if (log_op && cur_disk.exists) { ret = log_index_operation(hctx, cur_disk.key, CLS_RGW_OP_DEL, cur_disk.tag, cur_disk.meta.mtime, - cur_disk.ver, CLS_RGW_STATE_COMPLETE, header.ver, header.max_marker, 0, NULL, NULL); + cur_disk.ver, CLS_RGW_STATE_COMPLETE, header.ver, header.max_marker, 0, NULL, NULL, NULL); if (ret < 0) { CLS_LOG(0, "ERROR: %s(): failed to log operation ret=%d", __func__, ret); return ret; @@ -1965,7 +1968,7 @@ int rgw_dir_suggest_changes(cls_method_context_t hctx, bufferlist *in, bufferlis return ret; if (log_op) { ret = log_index_operation(hctx, cur_change.key, CLS_RGW_OP_ADD, cur_change.tag, cur_change.meta.mtime, - cur_change.ver, CLS_RGW_STATE_COMPLETE, header.ver, header.max_marker, 0, NULL, NULL); + cur_change.ver, CLS_RGW_STATE_COMPLETE, header.ver, header.max_marker, 0, NULL, NULL, NULL); if (ret < 0) { CLS_LOG(0, "ERROR: %s(): failed to log operation ret=%d", __func__, ret); return ret; diff --git a/src/cls/rgw/cls_rgw_client.cc b/src/cls/rgw/cls_rgw_client.cc index 969a467d1cd5..6bd3a5c8ef55 100644 --- a/src/cls/rgw/cls_rgw_client.cc +++ b/src/cls/rgw/cls_rgw_client.cc @@ -152,7 +152,7 @@ void cls_rgw_bucket_update_stats(librados::ObjectWriteOperation& o, bool absolut void cls_rgw_bucket_prepare_op(ObjectWriteOperation& o, RGWModifyOp op, string& tag, const cls_rgw_obj_key& key, const string& locator, bool log_op, - uint16_t bilog_flags) + uint16_t bilog_flags, rgw_zone_set& zones_trace) { struct rgw_cls_obj_prepare_op call; call.op = op; @@ -161,6 +161,7 @@ void cls_rgw_bucket_prepare_op(ObjectWriteOperation& o, RGWModifyOp op, string& call.locator = locator; call.log_op = log_op; call.bilog_flags = bilog_flags; + call.zones_trace = zones_trace; bufferlist in; ::encode(call, in); o.exec(RGW_CLASS, RGW_BUCKET_PREPARE_OP, in); @@ -171,7 +172,8 @@ void cls_rgw_bucket_complete_op(ObjectWriteOperation& o, RGWModifyOp op, string& const cls_rgw_obj_key& key, rgw_bucket_dir_entry_meta& dir_meta, list *remove_objs, bool log_op, - uint16_t bilog_flags) + uint16_t bilog_flags, + rgw_zone_set& zones_trace) { bufferlist in; @@ -185,6 +187,7 @@ void cls_rgw_bucket_complete_op(ObjectWriteOperation& o, RGWModifyOp op, string& call.bilog_flags = bilog_flags; if (remove_objs) call.remove_objs = *remove_objs; + call.zones_trace = zones_trace; ::encode(call, in); o.exec(RGW_CLASS, RGW_BUCKET_COMPLETE_OP, in); } @@ -328,7 +331,7 @@ int cls_rgw_bi_list(librados::IoCtx& io_ctx, const string oid, int cls_rgw_bucket_link_olh(librados::IoCtx& io_ctx, const string& oid, const cls_rgw_obj_key& key, bufferlist& olh_tag, bool delete_marker, const string& op_tag, struct rgw_bucket_dir_entry_meta *meta, - uint64_t olh_epoch, ceph::real_time unmod_since, bool high_precision_time, bool log_op) + uint64_t olh_epoch, ceph::real_time unmod_since, bool high_precision_time, bool log_op, rgw_zone_set& zones_trace) { bufferlist in, out; struct rgw_cls_link_olh_op call; @@ -343,6 +346,7 @@ int cls_rgw_bucket_link_olh(librados::IoCtx& io_ctx, const string& oid, const cl call.log_op = log_op; call.unmod_since = unmod_since; call.high_precision_time = high_precision_time; + call.zones_trace = zones_trace; ::encode(call, in); int r = io_ctx.exec(oid, RGW_CLASS, RGW_BUCKET_LINK_OLH, in, out); if (r < 0) @@ -353,7 +357,7 @@ int cls_rgw_bucket_link_olh(librados::IoCtx& io_ctx, const string& oid, const cl int cls_rgw_bucket_unlink_instance(librados::IoCtx& io_ctx, const string& oid, const cls_rgw_obj_key& key, const string& op_tag, - const string& olh_tag, uint64_t olh_epoch, bool log_op) + const string& olh_tag, uint64_t olh_epoch, bool log_op, rgw_zone_set& zones_trace) { bufferlist in, out; struct rgw_cls_unlink_instance_op call; @@ -362,6 +366,7 @@ int cls_rgw_bucket_unlink_instance(librados::IoCtx& io_ctx, const string& oid, call.olh_epoch = olh_epoch; call.olh_tag = olh_tag; call.log_op = log_op; + call.zones_trace = zones_trace; ::encode(call, in); int r = io_ctx.exec(oid, RGW_CLASS, RGW_BUCKET_UNLINK_INSTANCE, in, out); if (r < 0) diff --git a/src/cls/rgw/cls_rgw_client.h b/src/cls/rgw/cls_rgw_client.h index aa2413fdb911..fb7aee86b9ba 100644 --- a/src/cls/rgw/cls_rgw_client.h +++ b/src/cls/rgw/cls_rgw_client.h @@ -313,14 +313,14 @@ void cls_rgw_bucket_update_stats(librados::ObjectWriteOperation& o, bool absolut void cls_rgw_bucket_prepare_op(librados::ObjectWriteOperation& o, RGWModifyOp op, string& tag, const cls_rgw_obj_key& key, const string& locator, bool log_op, - uint16_t bilog_op); + uint16_t bilog_op, rgw_zone_set& zones_trace); void cls_rgw_bucket_complete_op(librados::ObjectWriteOperation& o, RGWModifyOp op, string& tag, rgw_bucket_entry_ver& ver, const cls_rgw_obj_key& key, rgw_bucket_dir_entry_meta& dir_meta, list *remove_objs, bool log_op, - uint16_t bilog_op); + uint16_t bilog_op, rgw_zone_set& zones_trace); void cls_rgw_remove_obj(librados::ObjectWriteOperation& o, list& keep_attr_prefixes); void cls_rgw_obj_store_pg_ver(librados::ObjectWriteOperation& o, const string& attr); @@ -339,9 +339,9 @@ int cls_rgw_bi_list(librados::IoCtx& io_ctx, const string oid, int cls_rgw_bucket_link_olh(librados::IoCtx& io_ctx, const string& oid, const cls_rgw_obj_key& key, bufferlist& olh_tag, bool delete_marker, const string& op_tag, struct rgw_bucket_dir_entry_meta *meta, - uint64_t olh_epoch, ceph::real_time unmod_since, bool high_precision_time, bool log_op); + uint64_t olh_epoch, ceph::real_time unmod_since, bool high_precision_time, bool log_op, rgw_zone_set& zones_trace); int cls_rgw_bucket_unlink_instance(librados::IoCtx& io_ctx, const string& oid, const cls_rgw_obj_key& key, const string& op_tag, - const string& olh_tag, uint64_t olh_epoch, bool log_op); + const string& olh_tag, uint64_t olh_epoch, bool log_op, rgw_zone_set& zones_trace); int cls_rgw_get_olh_log(librados::IoCtx& io_ctx, string& oid, librados::ObjectReadOperation& op, const cls_rgw_obj_key& olh, uint64_t ver_marker, const string& olh_tag, map > *log, bool *is_truncated); diff --git a/src/cls/rgw/cls_rgw_ops.cc b/src/cls/rgw/cls_rgw_ops.cc index 0b3701bf9ff3..cfa9eb9ba414 100644 --- a/src/cls/rgw/cls_rgw_ops.cc +++ b/src/cls/rgw/cls_rgw_ops.cc @@ -108,6 +108,7 @@ void rgw_cls_obj_prepare_op::dump(Formatter *f) const f->dump_string("locator", locator); f->dump_bool("log_op", log_op); f->dump_int("bilog_flags", bilog_flags); + ::encode_json("zones_trace", zones_trace, f); } void rgw_cls_obj_complete_op::generate_test_instances(list& o) @@ -145,6 +146,7 @@ void rgw_cls_obj_complete_op::dump(Formatter *f) const f->dump_string("tag", tag); f->dump_bool("log_op", log_op); f->dump_int("bilog_flags", bilog_flags); + ::encode_json("zones_trace", zones_trace, f); } void rgw_cls_link_olh_op::generate_test_instances(list& o) @@ -179,6 +181,7 @@ void rgw_cls_link_olh_op::dump(Formatter *f) const utime_t ut(unmod_since); ::encode_json("unmod_since", ut, f); ::encode_json("high_precision_time", high_precision_time, f); + ::encode_json("zones_trace", zones_trace, f); } void rgw_cls_unlink_instance_op::generate_test_instances(list& o) @@ -201,6 +204,7 @@ void rgw_cls_unlink_instance_op::dump(Formatter *f) const ::encode_json("olh_epoch", olh_epoch, f); ::encode_json("log_op", log_op, f); ::encode_json("bilog_flags", (uint32_t)bilog_flags, f); + ::encode_json("zones_trace", zones_trace, f); } void rgw_cls_read_olh_log_op::generate_test_instances(list& o) diff --git a/src/cls/rgw/cls_rgw_ops.h b/src/cls/rgw/cls_rgw_ops.h index 74035929387b..fce4e6954714 100644 --- a/src/cls/rgw/cls_rgw_ops.h +++ b/src/cls/rgw/cls_rgw_ops.h @@ -36,11 +36,12 @@ struct rgw_cls_obj_prepare_op string locator; bool log_op; uint16_t bilog_flags; + rgw_zone_set zones_trace; rgw_cls_obj_prepare_op() : op(CLS_RGW_OP_UNKNOWN), log_op(false), bilog_flags(0) {} void encode(bufferlist &bl) const { - ENCODE_START(6, 5, bl); + ENCODE_START(7, 5, bl); uint8_t c = (uint8_t)op; ::encode(c, bl); ::encode(tag, bl); @@ -48,10 +49,11 @@ struct rgw_cls_obj_prepare_op ::encode(log_op, bl); ::encode(key, bl); ::encode(bilog_flags, bl); + ::encode(zones_trace, bl); ENCODE_FINISH(bl); } void decode(bufferlist::iterator &bl) { - DECODE_START_LEGACY_COMPAT_LEN(6, 3, 3, bl); + DECODE_START_LEGACY_COMPAT_LEN(7, 3, 3, bl); uint8_t c; ::decode(c, bl); op = (RGWModifyOp)c; @@ -71,6 +73,9 @@ struct rgw_cls_obj_prepare_op if (struct_v >= 6) { ::decode(bilog_flags, bl); } + if (struct_v >= 7) { + ::decode(zones_trace, bl); + } DECODE_FINISH(bl); } void dump(Formatter *f) const; @@ -90,11 +95,12 @@ struct rgw_cls_obj_complete_op uint16_t bilog_flags; list remove_objs; + rgw_zone_set zones_trace; rgw_cls_obj_complete_op() : op(CLS_RGW_OP_ADD), log_op(false), bilog_flags(0) {} void encode(bufferlist &bl) const { - ENCODE_START(8, 7, bl); + ENCODE_START(9, 7, bl); uint8_t c = (uint8_t)op; ::encode(c, bl); ::encode(ver.epoch, bl); @@ -106,10 +112,11 @@ struct rgw_cls_obj_complete_op ::encode(log_op, bl); ::encode(key, bl); ::encode(bilog_flags, bl); + ::encode(zones_trace, bl); ENCODE_FINISH(bl); } void decode(bufferlist::iterator &bl) { - DECODE_START_LEGACY_COMPAT_LEN(8, 3, 3, bl); + DECODE_START_LEGACY_COMPAT_LEN(9, 3, 3, bl); uint8_t c; ::decode(c, bl); op = (RGWModifyOp)c; @@ -149,6 +156,9 @@ struct rgw_cls_obj_complete_op if (struct_v >= 8) { ::decode(bilog_flags, bl); } + if (struct_v >= 9) { + ::decode(zones_trace, bl); + } DECODE_FINISH(bl); } void dump(Formatter *f) const; @@ -167,11 +177,12 @@ struct rgw_cls_link_olh_op { uint16_t bilog_flags; real_time unmod_since; /* only create delete marker if newer then this */ bool high_precision_time; + rgw_zone_set zones_trace; rgw_cls_link_olh_op() : delete_marker(false), olh_epoch(0), log_op(false), bilog_flags(0), high_precision_time(false) {} void encode(bufferlist& bl) const { - ENCODE_START(4, 1, bl); + ENCODE_START(5, 1, bl); ::encode(key, bl); ::encode(olh_tag, bl); ::encode(delete_marker, bl); @@ -184,11 +195,12 @@ struct rgw_cls_link_olh_op { ::encode(t, bl); ::encode(unmod_since, bl); ::encode(high_precision_time, bl); + ::encode(zones_trace, bl); ENCODE_FINISH(bl); } void decode(bufferlist::iterator& bl) { - DECODE_START(4, bl); + DECODE_START(5, bl); ::decode(key, bl); ::decode(olh_tag, bl); ::decode(delete_marker, bl); @@ -203,11 +215,16 @@ struct rgw_cls_link_olh_op { unmod_since = ceph::real_clock::from_time_t(static_cast(t)); } if (struct_v >= 3) { + uint64_t t; + ::decode(t, bl); ::decode(unmod_since, bl); } if (struct_v >= 4) { ::decode(high_precision_time, bl); } + if (struct_v >= 5) { + ::decode(zones_trace, bl); + } DECODE_FINISH(bl); } @@ -223,22 +240,24 @@ struct rgw_cls_unlink_instance_op { bool log_op; uint16_t bilog_flags; string olh_tag; + rgw_zone_set zones_trace; rgw_cls_unlink_instance_op() : olh_epoch(0), log_op(false), bilog_flags(0) {} void encode(bufferlist& bl) const { - ENCODE_START(2, 1, bl); + ENCODE_START(3, 1, bl); ::encode(key, bl); ::encode(op_tag, bl); ::encode(olh_epoch, bl); ::encode(log_op, bl); ::encode(bilog_flags, bl); ::encode(olh_tag, bl); + ::encode(zones_trace, bl); ENCODE_FINISH(bl); } void decode(bufferlist::iterator& bl) { - DECODE_START(2, bl); + DECODE_START(3, bl); ::decode(key, bl); ::decode(op_tag, bl); ::decode(olh_epoch, bl); @@ -247,6 +266,9 @@ struct rgw_cls_unlink_instance_op { if (struct_v >= 2) { ::decode(olh_tag, bl); } + if (struct_v >= 3) { + ::decode(zones_trace, bl); + } DECODE_FINISH(bl); } diff --git a/src/cls/rgw/cls_rgw_types.cc b/src/cls/rgw/cls_rgw_types.cc index 7d9c83bfad8e..2247f36847bf 100644 --- a/src/cls/rgw/cls_rgw_types.cc +++ b/src/cls/rgw/cls_rgw_types.cc @@ -391,6 +391,7 @@ void rgw_bi_log_entry::decode_json(JSONObj *obj) bilog_flags = (uint16_t)f; JSONDecoder::decode_json("owner", owner, obj); JSONDecoder::decode_json("owner_display_name", owner_display_name, obj); + JSONDecoder::decode_json("zones_trace", zones_trace, obj); } void rgw_bi_log_entry::dump(Formatter *f) const @@ -449,6 +450,7 @@ void rgw_bi_log_entry::dump(Formatter *f) const f->dump_bool("versioned", (bilog_flags & RGW_BILOG_FLAG_VERSIONED_OP) != 0); f->dump_string("owner", owner); f->dump_string("owner_display_name", owner_display_name); + encode_json("zones_trace", zones_trace, f); } void rgw_bi_log_entry::generate_test_instances(list& ls) diff --git a/src/cls/rgw/cls_rgw_types.h b/src/cls/rgw/cls_rgw_types.h index 2b8dae327f1d..f4e5ac83a001 100644 --- a/src/cls/rgw/cls_rgw_types.h +++ b/src/cls/rgw/cls_rgw_types.h @@ -21,6 +21,8 @@ namespace ceph { class Formatter; } +using rgw_zone_set = std::set; + enum RGWPendingState { CLS_RGW_STATE_PENDING_MODIFY = 0, CLS_RGW_STATE_COMPLETE = 1, @@ -510,11 +512,12 @@ struct rgw_bi_log_entry { uint16_t bilog_flags; string owner; /* only being set if it's a delete marker */ string owner_display_name; /* only being set if it's a delete marker */ + rgw_zone_set zones_trace; rgw_bi_log_entry() : op(CLS_RGW_OP_UNKNOWN), state(CLS_RGW_STATE_PENDING_MODIFY), index_ver(0), bilog_flags(0) {} void encode(bufferlist &bl) const { - ENCODE_START(3, 1, bl); + ENCODE_START(4, 1, bl); ::encode(id, bl); ::encode(object, bl); ::encode(timestamp, bl); @@ -529,10 +532,11 @@ struct rgw_bi_log_entry { ::encode(bilog_flags, bl); ::encode(owner, bl); ::encode(owner_display_name, bl); + ::encode(zones_trace, bl); ENCODE_FINISH(bl); } void decode(bufferlist::iterator &bl) { - DECODE_START(2, bl); + DECODE_START(4, bl); ::decode(id, bl); ::decode(object, bl); ::decode(timestamp, bl); @@ -552,6 +556,9 @@ struct rgw_bi_log_entry { ::decode(owner, bl); ::decode(owner_display_name, bl); } + if (struct_v >= 4) { + ::decode(zones_trace, bl); + } DECODE_FINISH(bl); } void dump(Formatter *f) const; diff --git a/src/rgw/rgw_cr_rados.cc b/src/rgw/rgw_cr_rados.cc index 353deaa67ecf..c4e4b0be28f0 100644 --- a/src/rgw/rgw_cr_rados.cc +++ b/src/rgw/rgw_cr_rados.cc @@ -543,7 +543,8 @@ int RGWAsyncFetchRemoteObj::_send_request() NULL, /* string *petag, */ NULL, /* struct rgw_err *err, */ NULL, /* void (*progress_cb)(off_t, void *), */ - NULL); /* void *progress_data*); */ + NULL, /* void *progress_data*); */ + zones_trace); if (r < 0) { ldout(store->ctx(), 0) << "store->fetch_remote_obj() returned r=" << r << dendl; @@ -646,6 +647,7 @@ int RGWAsyncRemoveObj::_send_request() del_op.params.obj_owner.set_name(owner_display_name); del_op.params.mtime = timestamp; del_op.params.high_precision_time = true; + del_op.params.zones_trace = zones_trace; ret = del_op.delete_obj(); if (ret < 0) { diff --git a/src/rgw/rgw_cr_rados.h b/src/rgw/rgw_cr_rados.h index a892b2a6db0f..c75fa5862f02 100644 --- a/src/rgw/rgw_cr_rados.h +++ b/src/rgw/rgw_cr_rados.h @@ -742,6 +742,7 @@ class RGWAsyncFetchRemoteObj : public RGWAsyncRadosRequest { real_time src_mtime; bool copy_if_newer; + rgw_zone_set *zones_trace; protected: int _send_request() override; @@ -751,12 +752,12 @@ public: RGWBucketInfo& _bucket_info, const rgw_obj_key& _key, uint64_t _versioned_epoch, - bool _if_newer) : RGWAsyncRadosRequest(caller, cn), store(_store), + bool _if_newer, rgw_zone_set *_zones_trace) : RGWAsyncRadosRequest(caller, cn), store(_store), source_zone(_source_zone), bucket_info(_bucket_info), key(_key), versioned_epoch(_versioned_epoch), - copy_if_newer(_if_newer) {} + copy_if_newer(_if_newer), zones_trace(_zones_trace) {} }; class RGWFetchRemoteObjCR : public RGWSimpleCoroutine { @@ -775,6 +776,7 @@ class RGWFetchRemoteObjCR : public RGWSimpleCoroutine { bool copy_if_newer; RGWAsyncFetchRemoteObj *req; + rgw_zone_set *zones_trace; public: RGWFetchRemoteObjCR(RGWAsyncRadosProcessor *_async_rados, RGWRados *_store, @@ -782,13 +784,13 @@ public: RGWBucketInfo& _bucket_info, const rgw_obj_key& _key, uint64_t _versioned_epoch, - bool _if_newer) : RGWSimpleCoroutine(_store->ctx()), cct(_store->ctx()), + 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), key(_key), versioned_epoch(_versioned_epoch), - copy_if_newer(_if_newer), req(NULL) {} + copy_if_newer(_if_newer), req(NULL), zones_trace(_zones_trace) {} ~RGWFetchRemoteObjCR() override { @@ -804,7 +806,7 @@ public: int send_request() override { req = new RGWAsyncFetchRemoteObj(this, stack->create_completion_notifier(), store, source_zone, bucket_info, - key, versioned_epoch, copy_if_newer); + key, versioned_epoch, copy_if_newer, zones_trace); async_rados->queue(req); return 0; } @@ -916,6 +918,7 @@ class RGWAsyncRemoveObj : public RGWAsyncRadosRequest { bool del_if_older; ceph::real_time timestamp; + rgw_zone_set *zones_trace; protected: int _send_request() override; @@ -930,7 +933,8 @@ public: uint64_t _versioned_epoch, bool _delete_marker, bool _if_older, - real_time& _timestamp) : RGWAsyncRadosRequest(caller, cn), store(_store), + real_time& _timestamp, + rgw_zone_set* _zones_trace) : RGWAsyncRadosRequest(caller, cn), store(_store), source_zone(_source_zone), bucket_info(_bucket_info), key(_key), @@ -939,7 +943,7 @@ public: versioned(_versioned), versioned_epoch(_versioned_epoch), del_if_older(_if_older), - timestamp(_timestamp) { + timestamp(_timestamp), zones_trace(_zones_trace) { if (_delete_marker) { marker_version_id = key.instance; } @@ -965,6 +969,8 @@ class RGWRemoveObjCR : public RGWSimpleCoroutine { real_time timestamp; RGWAsyncRemoveObj *req; + + rgw_zone_set *zones_trace; public: RGWRemoveObjCR(RGWAsyncRadosProcessor *_async_rados, RGWRados *_store, @@ -976,14 +982,15 @@ public: string *_owner, string *_owner_display_name, bool _delete_marker, - real_time *_timestamp) : RGWSimpleCoroutine(_store->ctx()), cct(_store->ctx()), + real_time *_timestamp, + 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), key(_key), versioned(_versioned), versioned_epoch(_versioned_epoch), - delete_marker(_delete_marker), req(NULL) { + delete_marker(_delete_marker), req(NULL), zones_trace(_zones_trace) { del_if_older = (_timestamp != NULL); if (_timestamp) { timestamp = *_timestamp; @@ -1011,7 +1018,7 @@ public: int send_request() override { req = new RGWAsyncRemoveObj(this, stack->create_completion_notifier(), store, source_zone, bucket_info, key, owner, owner_display_name, versioned, versioned_epoch, - delete_marker, del_if_older, timestamp); + delete_marker, del_if_older, timestamp, zones_trace); async_rados->queue(req); return 0; } diff --git a/src/rgw/rgw_data_sync.cc b/src/rgw/rgw_data_sync.cc index e3f3b0793656..b23e306c124b 100644 --- a/src/rgw/rgw_data_sync.cc +++ b/src/rgw/rgw_data_sync.cc @@ -1535,10 +1535,10 @@ class RGWDefaultDataSyncModule : public RGWDataSyncModule { public: RGWDefaultDataSyncModule() {} - RGWCoroutine *sync_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, uint64_t versioned_epoch) override; - RGWCoroutine *remove_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime, bool versioned, uint64_t versioned_epoch) override; + RGWCoroutine *sync_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, uint64_t versioned_epoch, rgw_zone_set *zones_trace) override; + RGWCoroutine *remove_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) override; RGWCoroutine *create_delete_marker(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime, - rgw_bucket_entry_owner& owner, bool versioned, uint64_t versioned_epoch) override; + rgw_bucket_entry_owner& owner, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) override; }; class RGWDefaultSyncModuleInstance : public RGWSyncModuleInstance { @@ -1556,27 +1556,27 @@ int RGWDefaultSyncModule::create_instance(CephContext *cct, map& return 0; } -RGWCoroutine *RGWDefaultDataSyncModule::sync_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, uint64_t versioned_epoch) +RGWCoroutine *RGWDefaultDataSyncModule::sync_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, uint64_t versioned_epoch, rgw_zone_set *zones_trace) { return new RGWFetchRemoteObjCR(sync_env->async_rados, sync_env->store, sync_env->source_zone, bucket_info, key, versioned_epoch, - true); + true, zones_trace); } RGWCoroutine *RGWDefaultDataSyncModule::remove_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, - real_time& mtime, bool versioned, uint64_t versioned_epoch) + real_time& mtime, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) { return new RGWRemoveObjCR(sync_env->async_rados, sync_env->store, sync_env->source_zone, bucket_info, key, versioned, versioned_epoch, - NULL, NULL, false, &mtime); + NULL, NULL, false, &mtime, zones_trace); } RGWCoroutine *RGWDefaultDataSyncModule::create_delete_marker(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime, - rgw_bucket_entry_owner& owner, bool versioned, uint64_t versioned_epoch) + rgw_bucket_entry_owner& owner, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) { return new RGWRemoveObjCR(sync_env->async_rados, sync_env->store, sync_env->source_zone, bucket_info, key, versioned, versioned_epoch, - &owner.id, &owner.display_name, true, &mtime); + &owner.id, &owner.display_name, true, &mtime, zones_trace); } class RGWDataSyncControlCR : public RGWBackoffControlCR @@ -2179,6 +2179,8 @@ class RGWBucketSyncSingleEntryCR : public RGWCoroutine { bool error_injection; RGWDataSyncModule *data_sync_module; + + rgw_zone_set zones_trace; public: RGWBucketSyncSingleEntryCR(RGWDataSyncEnv *_sync_env, @@ -2188,7 +2190,7 @@ public: real_time& _timestamp, const rgw_bucket_entry_owner& _owner, RGWModifyOp _op, RGWPendingState _op_state, - const T& _entry_marker, RGWSyncShardMarkerTrack *_marker_tracker) : RGWCoroutine(_sync_env->cct), + const T& _entry_marker, RGWSyncShardMarkerTrack *_marker_tracker, rgw_zone_set& _zones_trace) : RGWCoroutine(_sync_env->cct), sync_env(_sync_env), bucket_info(_bucket_info), bs(bs), key(_key), versioned(_versioned), versioned_epoch(_versioned_epoch), @@ -2197,7 +2199,7 @@ public: op_state(_op_state), entry_marker(_entry_marker), marker_tracker(_marker_tracker), - sync_status(0) { + sync_status(0){ stringstream ss; ss << bucket_shard_str{bs} << "/" << key << "[" << versioned_epoch << "]"; set_description() << "bucket sync single entry (source_zone=" << sync_env->source_zone << ") b=" << ss.str() << " log_entry=" << entry_marker << " op=" << (int)op << " op_state=" << (int)op_state; @@ -2209,6 +2211,9 @@ public: error_injection = (sync_env->cct->_conf->rgw_sync_data_inject_err_probability > 0); data_sync_module = sync_env->sync_module->get_data_handler(); + + zones_trace = _zones_trace; + zones_trace.insert(sync_env->store->get_zone().id); } int operate() override { @@ -2241,19 +2246,19 @@ public: set_status("syncing obj"); ldout(sync_env->cct, 5) << "bucket sync: sync obj: " << sync_env->source_zone << "/" << bucket_info->bucket << "/" << key << "[" << versioned_epoch << "]" << dendl; logger.log("fetch"); - call(data_sync_module->sync_object(sync_env, *bucket_info, key, versioned_epoch)); + call(data_sync_module->sync_object(sync_env, *bucket_info, key, versioned_epoch, &zones_trace)); } else if (op == CLS_RGW_OP_DEL || op == CLS_RGW_OP_UNLINK_INSTANCE) { set_status("removing obj"); if (op == CLS_RGW_OP_UNLINK_INSTANCE) { versioned = true; } logger.log("remove"); - call(data_sync_module->remove_object(sync_env, *bucket_info, key, timestamp, versioned, versioned_epoch)); + call(data_sync_module->remove_object(sync_env, *bucket_info, key, timestamp, versioned, versioned_epoch, &zones_trace)); } else if (op == CLS_RGW_OP_LINK_OLH_DM) { logger.log("creating delete marker"); set_status("creating delete marker"); ldout(sync_env->cct, 10) << "creating delete marker: obj: " << sync_env->source_zone << "/" << bucket_info->bucket << "/" << key << "[" << versioned_epoch << "]" << dendl; - call(data_sync_module->create_delete_marker(sync_env, *bucket_info, key, timestamp, owner, versioned, versioned_epoch)); + call(data_sync_module->create_delete_marker(sync_env, *bucket_info, key, timestamp, owner, versioned, versioned_epoch, &zones_trace)); } } } while (marker_tracker->need_retry(key)); @@ -2315,6 +2320,7 @@ class RGWBucketShardFullSyncCR : public RGWCoroutine { const string& status_oid; RGWDataSyncDebugLogger logger; + rgw_zone_set zones_trace; public: RGWBucketShardFullSyncCR(RGWDataSyncEnv *_sync_env, const rgw_bucket_shard& bs, RGWBucketInfo *_bucket_info, @@ -2326,6 +2332,7 @@ public: marker_tracker(sync_env, status_oid, full_marker), status_oid(status_oid) { logger.init(sync_env, "BucketFull", bs.get_key()); + zones_trace.insert(sync_env->source_zone); } int operate() override; @@ -2367,13 +2374,12 @@ int RGWBucketShardFullSyncCR::operate() ldout(sync_env->cct, 0) << "ERROR: cannot start syncing " << entry->key << ". Duplicate entry?" << dendl; } else { op = (entry->key.instance.empty() || entry->key.instance == "null" ? CLS_RGW_OP_ADD : CLS_RGW_OP_LINK_OLH); - using SyncCR = RGWBucketSyncSingleEntryCR; yield spawn(new SyncCR(sync_env, bucket_info, bs, entry->key, false, /* versioned, only matters for object removal */ entry->versioned_epoch, entry->mtime, entry->owner, op, CLS_RGW_STATE_COMPLETE, - entry->key, &marker_tracker), + entry->key, &marker_tracker, zones_trace), false); } while (num_spawned() > BUCKET_SYNC_SPAWN_WINDOW) { @@ -2449,6 +2455,7 @@ class RGWBucketShardIncrementalSyncCR : public RGWCoroutine { RGWBucketIncSyncShardMarkerTrack marker_tracker; bool updated_status{false}; const string& status_oid; + const string& zone_id; string cur_id; @@ -2465,7 +2472,7 @@ public: rgw_bucket_shard_inc_sync_marker& _inc_marker) : RGWCoroutine(_sync_env->cct), sync_env(_sync_env), bs(bs), bucket_info(_bucket_info), lease_cr(lease_cr), inc_marker(_inc_marker), - marker_tracker(sync_env, status_oid, inc_marker), status_oid(status_oid) { + marker_tracker(sync_env, status_oid, inc_marker), status_oid(status_oid) , zone_id(_sync_env->store->get_zone().id){ set_description() << "bucket shard incremental sync bucket=" << bucket_shard_str{bs}; set_status("init"); @@ -2498,6 +2505,9 @@ int RGWBucketShardIncrementalSyncCR::operate() if (e.state != CLS_RGW_STATE_COMPLETE) { continue; } + if (e.zones_trace.find(zone_id) != e.zones_trace.end()) { + continue; + } auto& squash_entry = squash_map[make_pair(e.object, e.instance)]; if (squash_entry.first <= e.timestamp) { squash_entry = make_pair<>(e.timestamp, e.op); @@ -2551,6 +2561,13 @@ int RGWBucketShardIncrementalSyncCR::operate() marker_tracker.try_update_high_marker(cur_id, 0, entry->timestamp); continue; } + if (entry->zones_trace.find(zone_id) != entry->zones_trace.end()) { + set_status() << "redundant operation, skipping"; + ldout(sync_env->cct, 20) << "[inc sync] skipping object: " + <timestamp); + continue; + } if (make_pair<>(entry->timestamp, entry->op) != squash_map[make_pair(entry->object, entry->instance)]) { set_status() << "squashed operation, skipping"; ldout(sync_env->cct, 20) << "[inc sync] skipping object: " @@ -2599,7 +2616,7 @@ int RGWBucketShardIncrementalSyncCR::operate() spawn(new SyncCR(sync_env, bucket_info, bs, key, entry->is_versioned(), versioned_epoch, entry->timestamp, owner, entry->op, entry->state, - cur_id, &marker_tracker), + cur_id, &marker_tracker, entry->zones_trace), false); } // } diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 844b1dad5b02..f5b097a574bc 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -2674,7 +2674,7 @@ int RGWPutObjProcessor_Multipart::do_complete(size_t accounted_size, map& attrs, real_time delete_at, const char *if_match, - const char *if_nomatch, const string *user_data) + const char *if_nomatch, const string *user_data, rgw_zone_set *zones_trace) { complete_writing_data(); @@ -2685,6 +2685,7 @@ int RGWPutObjProcessor_Multipart::do_complete(size_t accounted_size, head_obj_op.meta.mtime = mtime; head_obj_op.meta.owner = s->owner.get_id(); head_obj_op.meta.delete_at = delete_at; + head_obj_op.meta.zones_trace = zones_trace; int r = head_obj_op.write_meta(obj_len, accounted_size, attrs); if (r < 0) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 562b067beb23..59f36f9f939a 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -2385,9 +2385,10 @@ void RGWObjVersionTracker::generate_new_write_ver(CephContext *cct) int RGWPutObjProcessor::complete(size_t accounted_size, const string& etag, real_time *mtime, real_time set_mtime, map& attrs, real_time delete_at, - const char *if_match, const char *if_nomatch, const string *user_data) + const char *if_match, const char *if_nomatch, const string *user_data, + rgw_zone_set *zones_trace) { - int r = do_complete(accounted_size, etag, mtime, set_mtime, attrs, delete_at, if_match, if_nomatch, user_data); + int r = do_complete(accounted_size, etag, mtime, set_mtime, attrs, delete_at, if_match, if_nomatch, user_data, zones_trace); if (r < 0) return r; @@ -2732,7 +2733,8 @@ int RGWPutObjProcessor_Atomic::do_complete(size_t accounted_size, const string& map& attrs, real_time delete_at, const char *if_match, - const char *if_nomatch, const string *user_data) { + const char *if_nomatch, const string *user_data, + rgw_zone_set *zones_trace) { int r = complete_writing_data(); if (r < 0) return r; @@ -2758,6 +2760,7 @@ int RGWPutObjProcessor_Atomic::do_complete(size_t accounted_size, const string& obj_op.meta.olh_epoch = olh_epoch; obj_op.meta.delete_at = delete_at; obj_op.meta.user_data = user_data; + obj_op.meta.zones_trace = zones_trace; r = obj_op.write_meta(obj_len, accounted_size, attrs); if (r < 0) { @@ -6564,7 +6567,7 @@ int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_si state = NULL; if (versioned_op) { - r = store->set_olh(target->get_ctx(), target->get_bucket_info(), obj, false, NULL, meta.olh_epoch, real_time(), false); + r = store->set_olh(target->get_ctx(), target->get_bucket_info(), obj, false, NULL, meta.olh_epoch, real_time(), false, meta.zones_trace); if (r < 0) { return r; } @@ -6640,7 +6643,8 @@ int RGWRados::Object::Write::write_meta(uint64_t size, uint64_t accounted_size, RGWRados::Bucket bop(target->get_store(), bucket_info); RGWRados::Bucket::UpdateIndex index_op(&bop, target->get_obj()); - + index_op.set_zones_trace(meta.zones_trace); + bool assume_noent = (meta.if_match == NULL && meta.if_nomatch == NULL); int r; if (assume_noent) { @@ -6941,8 +6945,8 @@ public: } int complete(const string& etag, real_time *mtime, real_time set_mtime, - map& attrs, real_time delete_at) { - return processor->complete(data_len, etag, mtime, set_mtime, attrs, delete_at); + map& attrs, real_time delete_at, rgw_zone_set *zones_trace) { + return processor->complete(data_len, etag, mtime, set_mtime, attrs, delete_at, NULL, NULL, NULL, zones_trace); } bool is_canceled() { @@ -7227,7 +7231,8 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, ceph::buffer::list *petag, struct rgw_err *err, void (*progress_cb)(off_t, void *), - void *progress_data) + void *progress_data, + rgw_zone_set *zones_trace) { /* source is in a different zonegroup, copy from there */ @@ -7393,7 +7398,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, #define MAX_COMPLETE_RETRY 100 for (i = 0; i < MAX_COMPLETE_RETRY; i++) { - ret = cb.complete(etag, mtime, set_mtime, attrs, delete_at); + ret = cb.complete(etag, mtime, set_mtime, attrs, delete_at, zones_trace); if (ret < 0) { goto set_err_state; } @@ -8324,7 +8329,7 @@ int RGWRados::Object::Delete::delete_obj() meta.mtime = params.mtime; } - int r = store->set_olh(target->get_ctx(), target->get_bucket_info(), marker, true, &meta, params.olh_epoch, params.unmod_since, params.high_precision_time); + int r = store->set_olh(target->get_ctx(), target->get_bucket_info(), marker, true, &meta, params.olh_epoch, params.unmod_since, params.high_precision_time, params.zones_trace); if (r < 0) { return r; } @@ -8336,7 +8341,7 @@ int RGWRados::Object::Delete::delete_obj() return r; } result.delete_marker = dirent.is_delete_marker(); - r = store->unlink_obj_instance(target->get_ctx(), target->get_bucket_info(), obj, params.olh_epoch); + r = store->unlink_obj_instance(target->get_ctx(), target->get_bucket_info(), obj, params.olh_epoch, params.zones_trace); if (r < 0) { return r; } @@ -8424,7 +8429,8 @@ int RGWRados::Object::Delete::delete_obj() RGWRados::Bucket bop(store, bucket_info); RGWRados::Bucket::UpdateIndex index_op(&bop, obj); - + + index_op.set_zones_trace(params.zones_trace); index_op.set_bilog_flags(params.bilog_flags); @@ -8482,7 +8488,8 @@ int RGWRados::delete_obj(RGWObjectCtx& obj_ctx, const rgw_obj& obj, int versioning_status, uint16_t bilog_flags, - const real_time& expiration_time) + const real_time& expiration_time, + rgw_zone_set *zones_trace) { RGWRados::Object del_target(this, bucket_info, obj_ctx, obj); RGWRados::Object::Delete del_op(&del_target); @@ -8491,6 +8498,7 @@ int RGWRados::delete_obj(RGWObjectCtx& obj_ctx, del_op.params.versioning_status = versioning_status; del_op.params.bilog_flags = bilog_flags; del_op.params.expiration_time = expiration_time; + del_op.params.zones_trace = zones_trace; return del_op.delete_obj(); } @@ -9500,7 +9508,7 @@ int RGWRados::Bucket::UpdateIndex::prepare(RGWModifyOp op, const string *write_t } } - int r = store->cls_obj_prepare_op(*bs, op, optag, obj, bilog_flags); + int r = store->cls_obj_prepare_op(*bs, op, optag, obj, bilog_flags, zones_trace); if (r < 0) { return r; } @@ -9547,7 +9555,7 @@ int RGWRados::Bucket::UpdateIndex::complete(int64_t poolid, uint64_t epoch, ent.meta.owner_display_name = owner.get_display_name(); ent.meta.content_type = content_type; - ret = store->cls_obj_complete_add(*bs, optag, poolid, epoch, ent, category, remove_objs, bilog_flags); + ret = store->cls_obj_complete_add(*bs, optag, poolid, epoch, ent, category, remove_objs, bilog_flags, zones_trace); int r = store->data_log->add_entry(bs->bucket, bs->shard_id); if (r < 0) { @@ -9572,7 +9580,7 @@ int RGWRados::Bucket::UpdateIndex::complete_del(int64_t poolid, uint64_t epoch, return ret; } - ret = store->cls_obj_complete_del(*bs, optag, poolid, epoch, obj, removed_mtime, remove_objs, bilog_flags); + ret = store->cls_obj_complete_del(*bs, optag, poolid, epoch, obj, removed_mtime, remove_objs, bilog_flags, zones_trace); int r = store->data_log->add_entry(bs->bucket, bs->shard_id); if (r < 0) { @@ -9596,7 +9604,7 @@ int RGWRados::Bucket::UpdateIndex::cancel() return ret; } - ret = store->cls_obj_complete_cancel(*bs, optag, obj, bilog_flags); + ret = store->cls_obj_complete_cancel(*bs, optag, obj, bilog_flags, zones_trace); /* * need to update data log anyhow, so that whoever follows needs to update its internal markers @@ -10399,7 +10407,7 @@ int RGWRados::bucket_index_link_olh(const RGWBucketInfo& bucket_info, RGWObjStat const string& op_tag, struct rgw_bucket_dir_entry_meta *meta, uint64_t olh_epoch, - real_time unmod_since, bool high_precision_time) + real_time unmod_since, bool high_precision_time, rgw_zone_set *_zones_trace) { rgw_rados_ref ref; int r = get_obj_head_ref(bucket_info, obj_instance, &ref); @@ -10413,11 +10421,19 @@ int RGWRados::bucket_index_link_olh(const RGWBucketInfo& bucket_info, RGWObjStat ldout(cct, 5) << "bs.init() returned ret=" << ret << dendl; return ret; } + + rgw_zone_set zones_trace; + if (_zones_trace) { + zones_trace = *_zones_trace; + } + else { + zones_trace.insert(get_zone().id); + } cls_rgw_obj_key key(obj_instance.key.get_index_key_name(), obj_instance.key.instance); ret = cls_rgw_bucket_link_olh(bs.index_ctx, bs.bucket_obj, key, olh_state.olh_tag, delete_marker, op_tag, meta, olh_epoch, unmod_since, high_precision_time, - get_zone().log_data); + get_zone().log_data, zones_trace); if (ret < 0) { return ret; } @@ -10432,7 +10448,7 @@ void RGWRados::bucket_index_guard_olh_op(RGWObjState& olh_state, ObjectOperation } int RGWRados::bucket_index_unlink_instance(const RGWBucketInfo& bucket_info, const rgw_obj& obj_instance, - const string& op_tag, const string& olh_tag, uint64_t olh_epoch) + const string& op_tag, const string& olh_tag, uint64_t olh_epoch, rgw_zone_set *_zones_trace) { rgw_rados_ref ref; int r = get_obj_head_ref(bucket_info, obj_instance, &ref); @@ -10446,9 +10462,15 @@ int RGWRados::bucket_index_unlink_instance(const RGWBucketInfo& bucket_info, con ldout(cct, 5) << "bs.init() returned ret=" << ret << dendl; return ret; } + + rgw_zone_set zones_trace; + if (_zones_trace) { + zones_trace = *_zones_trace; + } + zones_trace.insert(get_zone().id); cls_rgw_obj_key key(obj_instance.key.get_index_key_name(), obj_instance.key.instance); - ret = cls_rgw_bucket_unlink_instance(bs.index_ctx, bs.bucket_obj, key, op_tag, olh_tag, olh_epoch, get_zone().log_data); + ret = cls_rgw_bucket_unlink_instance(bs.index_ctx, bs.bucket_obj, key, op_tag, olh_tag, olh_epoch, get_zone().log_data, zones_trace); if (ret < 0) { return ret; } @@ -10547,7 +10569,7 @@ int RGWRados::bucket_index_clear_olh(const RGWBucketInfo& bucket_info, RGWObjSta int RGWRados::apply_olh_log(RGWObjectCtx& obj_ctx, RGWObjState& state, const RGWBucketInfo& bucket_info, const rgw_obj& obj, bufferlist& olh_tag, map >& log, - uint64_t *plast_ver) + uint64_t *plast_ver, rgw_zone_set* zones_trace) { if (log.empty()) { return 0; @@ -10624,7 +10646,7 @@ int RGWRados::apply_olh_log(RGWObjectCtx& obj_ctx, RGWObjState& state, const RGW liter != remove_instances.end(); ++liter) { cls_rgw_obj_key& key = *liter; rgw_obj obj_instance(bucket, key); - int ret = delete_obj(obj_ctx, bucket_info, obj_instance, 0, RGW_BILOG_FLAG_VERSIONED_OP); + int ret = delete_obj(obj_ctx, bucket_info, obj_instance, 0, RGW_BILOG_FLAG_VERSIONED_OP, ceph::real_time(), zones_trace); if (ret < 0 && ret != -ENOENT) { ldout(cct, 0) << "ERROR: delete_obj() returned " << ret << " obj_instance=" << obj_instance << dendl; return ret; @@ -10676,7 +10698,7 @@ int RGWRados::apply_olh_log(RGWObjectCtx& obj_ctx, RGWObjState& state, const RGW /* * read olh log and apply it */ -int RGWRados::update_olh(RGWObjectCtx& obj_ctx, RGWObjState *state, const RGWBucketInfo& bucket_info, const rgw_obj& obj) +int RGWRados::update_olh(RGWObjectCtx& obj_ctx, RGWObjState *state, const RGWBucketInfo& bucket_info, const rgw_obj& obj, rgw_zone_set *zones_trace) { map > log; bool is_truncated; @@ -10687,7 +10709,7 @@ int RGWRados::update_olh(RGWObjectCtx& obj_ctx, RGWObjState *state, const RGWBuc if (ret < 0) { return ret; } - ret = apply_olh_log(obj_ctx, *state, bucket_info, obj, state->olh_tag, log, &ver_marker); + ret = apply_olh_log(obj_ctx, *state, bucket_info, obj, state->olh_tag, log, &ver_marker, zones_trace); if (ret < 0) { return ret; } @@ -10697,7 +10719,7 @@ int RGWRados::update_olh(RGWObjectCtx& obj_ctx, RGWObjState *state, const RGWBuc } int RGWRados::set_olh(RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_info, const rgw_obj& target_obj, bool delete_marker, rgw_bucket_dir_entry_meta *meta, - uint64_t olh_epoch, real_time unmod_since, bool high_precision_time) + uint64_t olh_epoch, real_time unmod_since, bool high_precision_time, rgw_zone_set *zones_trace) { string op_tag; @@ -10708,7 +10730,7 @@ int RGWRados::set_olh(RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_info, const r int ret = 0; int i; - + #define MAX_ECANCELED_RETRY 100 for (i = 0; i < MAX_ECANCELED_RETRY; i++) { if (ret == -ECANCELED) { @@ -10728,7 +10750,7 @@ int RGWRados::set_olh(RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_info, const r } return ret; } - ret = bucket_index_link_olh(bucket_info, *state, target_obj, delete_marker, op_tag, meta, olh_epoch, unmod_since, high_precision_time); + ret = bucket_index_link_olh(bucket_info, *state, target_obj, delete_marker, op_tag, meta, olh_epoch, unmod_since, high_precision_time, zones_trace); if (ret < 0) { ldout(cct, 20) << "bucket_index_link_olh() target_obj=" << target_obj << " delete_marker=" << (int)delete_marker << " returned " << ret << dendl; if (ret == -ECANCELED) { @@ -10757,7 +10779,7 @@ int RGWRados::set_olh(RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_info, const r } int RGWRados::unlink_obj_instance(RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_info, const rgw_obj& target_obj, - uint64_t olh_epoch) + uint64_t olh_epoch, rgw_zone_set *zones_trace) { string op_tag; @@ -10789,7 +10811,7 @@ int RGWRados::unlink_obj_instance(RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_i string olh_tag(state->olh_tag.c_str(), state->olh_tag.length()); - ret = bucket_index_unlink_instance(bucket_info, target_obj, op_tag, olh_tag, olh_epoch); + ret = bucket_index_unlink_instance(bucket_info, target_obj, op_tag, olh_tag, olh_epoch, zones_trace); if (ret < 0) { ldout(cct, 20) << "bucket_index_unlink_instance() target_obj=" << target_obj << " returned " << ret << dendl; if (ret == -ECANCELED) { @@ -10805,7 +10827,7 @@ int RGWRados::unlink_obj_instance(RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_i return -EIO; } - ret = update_olh(obj_ctx, state, bucket_info, olh_obj); + ret = update_olh(obj_ctx, state, bucket_info, olh_obj, zones_trace); if (ret == -ECANCELED) { /* already did what we needed, no need to retry, raced with another user */ return 0; } @@ -12027,18 +12049,26 @@ int RGWRados::cls_rgw_init_index(librados::IoCtx& index_ctx, librados::ObjectWri } int RGWRados::cls_obj_prepare_op(BucketShard& bs, RGWModifyOp op, string& tag, - rgw_obj& obj, uint16_t bilog_flags) + rgw_obj& obj, uint16_t bilog_flags, rgw_zone_set *_zones_trace) { + rgw_zone_set zones_trace; + if (_zones_trace) { + zones_trace = *_zones_trace; + } + else { + zones_trace.insert(get_zone().id); + } + ObjectWriteOperation o; cls_rgw_obj_key key(obj.key.get_index_key_name(), obj.key.instance); - cls_rgw_bucket_prepare_op(o, op, tag, key, obj.key.get_loc(), get_zone().log_data, bilog_flags); + cls_rgw_bucket_prepare_op(o, op, tag, key, obj.key.get_loc(), get_zone().log_data, bilog_flags, zones_trace); return bs.index_ctx.operate(bs.bucket_obj, &o); } int RGWRados::cls_obj_complete_op(BucketShard& bs, RGWModifyOp op, string& tag, int64_t pool, uint64_t epoch, rgw_bucket_dir_entry& ent, RGWObjCategory category, - list *remove_objs, uint16_t bilog_flags) + list *remove_objs, uint16_t bilog_flags, rgw_zone_set *_zones_trace) { list *pro = NULL; list ro; @@ -12055,12 +12085,20 @@ int RGWRados::cls_obj_complete_op(BucketShard& bs, RGWModifyOp op, string& tag, dir_meta = ent.meta; dir_meta.category = category; + rgw_zone_set zones_trace; + if (_zones_trace) { + zones_trace = *_zones_trace; + } + else { + zones_trace.insert(get_zone().id); + } + rgw_bucket_entry_ver ver; ver.pool = pool; ver.epoch = epoch; cls_rgw_obj_key key(ent.key.name, ent.key.instance); cls_rgw_bucket_complete_op(o, op, tag, ver, key, dir_meta, pro, - get_zone().log_data, bilog_flags); + get_zone().log_data, bilog_flags, zones_trace); AioCompletion *c = librados::Rados::aio_create_completion(NULL, NULL, NULL); int ret = bs.index_ctx.aio_operate(bs.bucket_obj, c, &o); @@ -12071,9 +12109,9 @@ int RGWRados::cls_obj_complete_op(BucketShard& bs, RGWModifyOp op, string& tag, int RGWRados::cls_obj_complete_add(BucketShard& bs, string& tag, int64_t pool, uint64_t epoch, rgw_bucket_dir_entry& ent, RGWObjCategory category, - list *remove_objs, uint16_t bilog_flags) + list *remove_objs, uint16_t bilog_flags, rgw_zone_set *zones_trace) { - return cls_obj_complete_op(bs, CLS_RGW_OP_ADD, tag, pool, epoch, ent, category, remove_objs, bilog_flags); + return cls_obj_complete_op(bs, CLS_RGW_OP_ADD, tag, pool, epoch, ent, category, remove_objs, bilog_flags, zones_trace); } int RGWRados::cls_obj_complete_del(BucketShard& bs, string& tag, @@ -12081,19 +12119,20 @@ int RGWRados::cls_obj_complete_del(BucketShard& bs, string& tag, rgw_obj& obj, real_time& removed_mtime, list *remove_objs, - uint16_t bilog_flags) + uint16_t bilog_flags, + rgw_zone_set *zones_trace) { rgw_bucket_dir_entry ent; ent.meta.mtime = removed_mtime; obj.key.get_index_key(&ent.key); - return cls_obj_complete_op(bs, CLS_RGW_OP_DEL, tag, pool, epoch, ent, RGW_OBJ_CATEGORY_NONE, remove_objs, bilog_flags); + return cls_obj_complete_op(bs, CLS_RGW_OP_DEL, tag, pool, epoch, ent, RGW_OBJ_CATEGORY_NONE, remove_objs, bilog_flags, zones_trace); } -int RGWRados::cls_obj_complete_cancel(BucketShard& bs, string& tag, rgw_obj& obj, uint16_t bilog_flags) +int RGWRados::cls_obj_complete_cancel(BucketShard& bs, string& tag, rgw_obj& obj, uint16_t bilog_flags, rgw_zone_set *zones_trace) { rgw_bucket_dir_entry ent; obj.key.get_index_key(&ent.key); - return cls_obj_complete_op(bs, CLS_RGW_OP_CANCEL, tag, -1 /* pool id */, 0, ent, RGW_OBJ_CATEGORY_NONE, NULL, bilog_flags); + return cls_obj_complete_op(bs, CLS_RGW_OP_CANCEL, tag, -1 /* pool id */, 0, ent, RGW_OBJ_CATEGORY_NONE, NULL, bilog_flags, zones_trace); } int RGWRados::cls_obj_set_bucket_tag_timeout(RGWBucketInfo& bucket_info, uint64_t timeout) diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index cbb6610235ec..d0ab92b81420 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -2742,10 +2742,11 @@ public: ceph::real_time delete_at; bool canceled; const string *user_data; + rgw_zone_set *zones_trace; MetaParams() : mtime(NULL), rmattrs(NULL), data(NULL), manifest(NULL), ptag(NULL), remove_objs(NULL), category(RGW_OBJ_CATEGORY_MAIN), flags(0), - if_match(NULL), if_nomatch(NULL), olh_epoch(0), canceled(false), user_data(nullptr) {} + if_match(NULL), if_nomatch(NULL), olh_epoch(0), canceled(false), user_data(nullptr), zones_trace(nullptr) {} } meta; explicit Write(RGWRados::Object *_target) : target(_target) {} @@ -2774,8 +2775,9 @@ public: ceph::real_time unmod_since; ceph::real_time mtime; /* for setting delete marker mtime */ bool high_precision_time; + rgw_zone_set *zones_trace; - DeleteParams() : versioning_status(0), olh_epoch(0), bilog_flags(0), remove_objs(NULL), high_precision_time(false) {} + DeleteParams() : versioning_status(0), olh_epoch(0), bilog_flags(0), remove_objs(NULL), high_precision_time(false), zones_trace(nullptr) {} } params; struct DeleteResult { @@ -2850,6 +2852,7 @@ public: bool bs_initialized{false}; bool blind; bool prepared{false}; + rgw_zone_set *zones_trace{nullptr}; public: UpdateIndex(RGWRados::Bucket *_target, const rgw_obj& _obj) : target(_target), obj(_obj), @@ -2872,6 +2875,10 @@ public: void set_bilog_flags(uint16_t flags) { bilog_flags = flags; } + + void set_zones_trace(rgw_zone_set *_zones_trace) { + zones_trace = _zones_trace; + } int prepare(RGWModifyOp, const string *write_tag); int complete(int64_t poolid, uint64_t epoch, uint64_t size, @@ -3025,7 +3032,8 @@ public: ceph::buffer::list *petag, struct rgw_err *err, void (*progress_cb)(off_t, void *), - void *progress_data); + void *progress_data, + rgw_zone_set *zones_trace= nullptr); /** * Copy an object. * dest_obj: the object to copy into @@ -3119,7 +3127,8 @@ public: const rgw_obj& src_obj, int versioning_status, uint16_t bilog_flags = 0, - const ceph::real_time& expiration_time = ceph::real_time()); + const ceph::real_time& expiration_time = ceph::real_time(), + rgw_zone_set *zones_trace = nullptr); /** Delete a raw object.*/ int delete_raw_obj(const rgw_raw_obj& obj); @@ -3220,20 +3229,20 @@ public: const rgw_obj& obj_instance, bool delete_marker, const string& op_tag, struct rgw_bucket_dir_entry_meta *meta, uint64_t olh_epoch, - ceph::real_time unmod_since, bool high_precision_time); - int bucket_index_unlink_instance(const RGWBucketInfo& bucket_info, const rgw_obj& obj_instance, const string& op_tag, const string& olh_tag, uint64_t olh_epoch); + ceph::real_time unmod_since, bool high_precision_time, rgw_zone_set *zones_trace = nullptr); + int bucket_index_unlink_instance(const RGWBucketInfo& bucket_info, const rgw_obj& obj_instance, const string& op_tag, const string& olh_tag, uint64_t olh_epoch, rgw_zone_set *zones_trace = nullptr); int bucket_index_read_olh_log(const RGWBucketInfo& bucket_info, RGWObjState& state, const rgw_obj& obj_instance, uint64_t ver_marker, map > *log, bool *is_truncated); int bucket_index_trim_olh_log(const RGWBucketInfo& bucket_info, RGWObjState& obj_state, const rgw_obj& obj_instance, uint64_t ver); int bucket_index_clear_olh(const RGWBucketInfo& bucket_info, RGWObjState& state, const rgw_obj& obj_instance); int apply_olh_log(RGWObjectCtx& ctx, RGWObjState& obj_state, const RGWBucketInfo& bucket_info, const rgw_obj& obj, bufferlist& obj_tag, map >& log, - uint64_t *plast_ver); - int update_olh(RGWObjectCtx& obj_ctx, RGWObjState *state, const RGWBucketInfo& bucket_info, const rgw_obj& obj); + uint64_t *plast_ver, rgw_zone_set *zones_trace = nullptr); + int update_olh(RGWObjectCtx& obj_ctx, RGWObjState *state, const RGWBucketInfo& bucket_info, const rgw_obj& obj, rgw_zone_set *zones_trace = nullptr); int set_olh(RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_info, const rgw_obj& target_obj, bool delete_marker, rgw_bucket_dir_entry_meta *meta, - uint64_t olh_epoch, ceph::real_time unmod_since, bool high_precision_time); + uint64_t olh_epoch, ceph::real_time unmod_since, bool high_precision_time, rgw_zone_set *zones_trace = nullptr); int unlink_obj_instance(RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_info, const rgw_obj& target_obj, - uint64_t olh_epoch); + uint64_t olh_epoch, rgw_zone_set *zones_trace = nullptr); void check_pending_olh_entries(map& pending_entries, map *rm_pending_entries); int remove_olh_pending_entries(const RGWBucketInfo& bucket_info, RGWObjState& state, const rgw_obj& olh_obj, map& pending_attrs); @@ -3310,14 +3319,14 @@ public: map *pattrs, bool create_entry_point); int cls_rgw_init_index(librados::IoCtx& io_ctx, librados::ObjectWriteOperation& op, string& oid); - int cls_obj_prepare_op(BucketShard& bs, RGWModifyOp op, string& tag, rgw_obj& obj, uint16_t bilog_flags); + int cls_obj_prepare_op(BucketShard& bs, RGWModifyOp op, string& tag, rgw_obj& obj, uint16_t bilog_flags, rgw_zone_set *zones_trace = nullptr); int cls_obj_complete_op(BucketShard& bs, RGWModifyOp op, string& tag, int64_t pool, uint64_t epoch, - rgw_bucket_dir_entry& ent, RGWObjCategory category, list *remove_objs, uint16_t bilog_flags); + rgw_bucket_dir_entry& ent, RGWObjCategory category, list *remove_objs, uint16_t bilog_flags, rgw_zone_set *zones_trace = nullptr); int cls_obj_complete_add(BucketShard& bs, string& tag, int64_t pool, uint64_t epoch, rgw_bucket_dir_entry& ent, - RGWObjCategory category, list *remove_objs, uint16_t bilog_flags); + RGWObjCategory category, list *remove_objs, uint16_t bilog_flags, rgw_zone_set *zones_trace = nullptr); int cls_obj_complete_del(BucketShard& bs, string& tag, int64_t pool, uint64_t epoch, rgw_obj& obj, - ceph::real_time& removed_mtime, list *remove_objs, uint16_t bilog_flags); - int cls_obj_complete_cancel(BucketShard& bs, string& tag, rgw_obj& obj, uint16_t bilog_flags); + ceph::real_time& removed_mtime, list *remove_objs, uint16_t bilog_flags, rgw_zone_set *zones_trace = nullptr); + int cls_obj_complete_cancel(BucketShard& bs, string& tag, rgw_obj& obj, uint16_t bilog_flags, rgw_zone_set *zones_trace = nullptr); int cls_obj_set_bucket_tag_timeout(RGWBucketInfo& bucket_info, uint64_t timeout); int cls_bucket_list(RGWBucketInfo& bucket_info, int shard_id, rgw_obj_index_key& start, const string& prefix, uint32_t num_entries, bool list_versions, map& m, @@ -3658,7 +3667,8 @@ protected: virtual int do_complete(size_t accounted_size, const string& etag, ceph::real_time *mtime, ceph::real_time set_mtime, map& attrs, ceph::real_time delete_at, - const char *if_match, const char *if_nomatch, const string *user_data) = 0; + const char *if_match, const char *if_nomatch, const string *user_data, + rgw_zone_set* zones_trace = nullptr) = 0; public: RGWPutObjProcessor(RGWObjectCtx& _obj_ctx, RGWBucketInfo& _bi) : store(NULL), @@ -3675,7 +3685,8 @@ public: int complete(size_t accounted_size, const string& etag, ceph::real_time *mtime, ceph::real_time set_mtime, map& attrs, ceph::real_time delete_at, - const char *if_match = NULL, const char *if_nomatch = NULL, const string *user_data = nullptr); + const char *if_match = NULL, const char *if_nomatch = NULL, const string *user_data = nullptr, + rgw_zone_set *zones_trace = nullptr); CephContext *ctx(); @@ -3753,7 +3764,7 @@ protected: int do_complete(size_t accounted_size, const string& etag, ceph::real_time *mtime, ceph::real_time set_mtime, map& attrs, ceph::real_time delete_at, - const char *if_match, const char *if_nomatch, const string *user_data) override; + const char *if_match, const char *if_nomatch, const string *user_data, rgw_zone_set *zones_trace) override; int prepare_next_part(off_t ofs); int complete_parts(); @@ -3868,7 +3879,8 @@ protected: int do_complete(size_t accounted_size, const string& etag, ceph::real_time *mtime, ceph::real_time set_mtime, map& attrs, ceph::real_time delete_at, - const char *if_match, const char *if_nomatch, const string *user_data) override; + const char *if_match, const char *if_nomatch, const string *user_data, + rgw_zone_set *zones_trace) override; public: bool immutable_head() { return true; } RGWPutObjProcessor_Multipart(RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_info, uint64_t _p, req_state *_s) : diff --git a/src/rgw/rgw_sync_module.h b/src/rgw/rgw_sync_module.h index 16e63ed640da..f6f070b1c36f 100644 --- a/src/rgw/rgw_sync_module.h +++ b/src/rgw/rgw_sync_module.h @@ -16,11 +16,11 @@ public: RGWDataSyncModule() {} virtual ~RGWDataSyncModule() {} - virtual RGWCoroutine *sync_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, uint64_t versioned_epoch) = 0; + virtual RGWCoroutine *sync_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, uint64_t versioned_epoch, rgw_zone_set *zones_trace) = 0; virtual RGWCoroutine *remove_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime, - bool versioned, uint64_t versioned_epoch) = 0; + bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) = 0; virtual RGWCoroutine *create_delete_marker(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime, - rgw_bucket_entry_owner& owner, bool versioned, uint64_t versioned_epoch) = 0; + rgw_bucket_entry_owner& owner, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) = 0; }; class RGWSyncModuleInstance { diff --git a/src/rgw/rgw_sync_module_es.cc b/src/rgw/rgw_sync_module_es.cc index 48f633bd5b80..d500e9b937bd 100644 --- a/src/rgw/rgw_sync_module_es.cc +++ b/src/rgw/rgw_sync_module_es.cc @@ -202,17 +202,17 @@ public: delete conf.conn; } - RGWCoroutine *sync_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, uint64_t versioned_epoch) override { + RGWCoroutine *sync_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, uint64_t versioned_epoch, rgw_zone_set *zones_trace) override { ldout(sync_env->cct, 0) << conf.id << ": sync_object: b=" << bucket_info.bucket << " k=" << key << " versioned_epoch=" << versioned_epoch << dendl; return new RGWElasticHandleRemoteObjCR(sync_env, bucket_info, key, conf); } - RGWCoroutine *remove_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime, bool versioned, uint64_t versioned_epoch) override { + RGWCoroutine *remove_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) override { /* versioned and versioned epoch params are useless in the elasticsearch backend case */ ldout(sync_env->cct, 0) << conf.id << ": rm_object: b=" << bucket_info.bucket << " k=" << key << " mtime=" << mtime << " versioned=" << versioned << " versioned_epoch=" << versioned_epoch << dendl; return new RGWElasticRemoveRemoteObjCBCR(sync_env, bucket_info, key, mtime, conf); } RGWCoroutine *create_delete_marker(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime, - rgw_bucket_entry_owner& owner, bool versioned, uint64_t versioned_epoch) override { + rgw_bucket_entry_owner& owner, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) override { ldout(sync_env->cct, 0) << conf.id << ": create_delete_marker: b=" << bucket_info.bucket << " k=" << key << " mtime=" << mtime << " versioned=" << versioned << " versioned_epoch=" << versioned_epoch << dendl; return NULL; diff --git a/src/rgw/rgw_sync_module_log.cc b/src/rgw/rgw_sync_module_log.cc index 180086d68929..f253d7074297 100644 --- a/src/rgw/rgw_sync_module_log.cc +++ b/src/rgw/rgw_sync_module_log.cc @@ -39,16 +39,16 @@ class RGWLogDataSyncModule : public RGWDataSyncModule { public: RGWLogDataSyncModule(const string& _prefix) : prefix(_prefix) {} - RGWCoroutine *sync_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, uint64_t versioned_epoch) override { + RGWCoroutine *sync_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, uint64_t versioned_epoch, rgw_zone_set *zones_trace) override { ldout(sync_env->cct, 0) << prefix << ": SYNC_LOG: sync_object: b=" << bucket_info.bucket << " k=" << key << " versioned_epoch=" << versioned_epoch << dendl; return new RGWLogStatRemoteObjCR(sync_env, bucket_info, key); } - RGWCoroutine *remove_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime, bool versioned, uint64_t versioned_epoch) override { + RGWCoroutine *remove_object(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) override { ldout(sync_env->cct, 0) << prefix << ": SYNC_LOG: rm_object: b=" << bucket_info.bucket << " k=" << key << " mtime=" << mtime << " versioned=" << versioned << " versioned_epoch=" << versioned_epoch << dendl; return NULL; } RGWCoroutine *create_delete_marker(RGWDataSyncEnv *sync_env, RGWBucketInfo& bucket_info, rgw_obj_key& key, real_time& mtime, - rgw_bucket_entry_owner& owner, bool versioned, uint64_t versioned_epoch) override { + rgw_bucket_entry_owner& owner, bool versioned, uint64_t versioned_epoch, rgw_zone_set *zones_trace) override { ldout(sync_env->cct, 0) << prefix << ": SYNC_LOG: create_delete_marker: b=" << bucket_info.bucket << " k=" << key << " mtime=" << mtime << " versioned=" << versioned << " versioned_epoch=" << versioned_epoch << dendl; return NULL; diff --git a/src/test/cls_rgw/test_cls_rgw.cc b/src/test/cls_rgw/test_cls_rgw.cc index 22f137dd284f..9cc997c32fa8 100644 --- a/src/test/cls_rgw/test_cls_rgw.cc +++ b/src/test/cls_rgw/test_cls_rgw.cc @@ -12,6 +12,7 @@ #include #include #include +#include using namespace librados; @@ -88,7 +89,8 @@ void index_prepare(OpMgr& mgr, librados::IoCtx& ioctx, string& oid, RGWModifyOp { ObjectWriteOperation *op = mgr.write_op(); cls_rgw_obj_key key(obj, string()); - cls_rgw_bucket_prepare_op(*op, index_op, tag, key, loc, true, 0); + rgw_zone_set zones_trace; + cls_rgw_bucket_prepare_op(*op, index_op, tag, key, loc, true, 0, zones_trace); ASSERT_EQ(0, ioctx.operate(oid, op)); } @@ -100,7 +102,8 @@ void index_complete(OpMgr& mgr, librados::IoCtx& ioctx, string& oid, RGWModifyOp ver.pool = ioctx.get_id(); ver.epoch = epoch; meta.accounted_size = meta.size; - cls_rgw_bucket_complete_op(*op, index_op, tag, ver, key, meta, NULL, true, 0); + rgw_zone_set zones_trace; + cls_rgw_bucket_complete_op(*op, index_op, tag, ver, key, meta, NULL, true, 0, zones_trace); ASSERT_EQ(0, ioctx.operate(oid, op)); }