From 54d39917fa4bc8eefb846a2eb08698619596f59f Mon Sep 17 00:00:00 2001 From: Tianshan Qu Date: Wed, 20 Jun 2018 10:02:47 +0800 Subject: [PATCH] rgw: fix index complete miss zones_trace set index complete default with nullptr of zones_trace, and we should init one, otherwise will cause data sync redundant. fixes: http://tracker.ceph.com/issues/24590 Signed-off-by: Tianshan Qu --- src/rgw/rgw_rados.cc | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 767196612753a..a954316276dff 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -11312,9 +11312,8 @@ int RGWRados::bucket_index_link_olh(const RGWBucketInfo& bucket_info, RGWObjStat rgw_zone_set zones_trace; if (_zones_trace) { zones_trace = *_zones_trace; - } else { - zones_trace.insert(get_zone().id); } + zones_trace.insert(get_zone().id); BucketShard bs(this); @@ -13098,10 +13097,8 @@ int RGWRados::cls_obj_prepare_op(BucketShard& bs, RGWModifyOp op, string& tag, if (_zones_trace) { zones_trace = *_zones_trace; } - else { - zones_trace.insert(get_zone().id); - } - + zones_trace.insert(get_zone().id); + ObjectWriteOperation o; cls_rgw_obj_key key(obj.key.get_index_key_name(), obj.key.instance); cls_rgw_guard_bucket_resharding(o, -ERR_BUSY_RESHARDING); @@ -13119,16 +13116,22 @@ int RGWRados::cls_obj_complete_op(BucketShard& bs, const rgw_obj& obj, RGWModify dir_meta = ent.meta; dir_meta.category = category; + rgw_zone_set zones_trace; + if (_zones_trace) { + zones_trace = *_zones_trace; + } + 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_guard_bucket_resharding(o, -ERR_BUSY_RESHARDING); cls_rgw_bucket_complete_op(o, op, tag, ver, key, dir_meta, remove_objs, - get_zone().log_data, bilog_flags, _zones_trace); + get_zone().log_data, bilog_flags, &zones_trace); complete_op_data *arg; index_completion_manager->create_completion(obj, op, tag, ver, key, dir_meta, remove_objs, - get_zone().log_data, bilog_flags, _zones_trace, &arg); + get_zone().log_data, bilog_flags, &zones_trace, &arg); librados::AioCompletion *completion = arg->rados_completion; int ret = bs.index_ctx.aio_operate(bs.bucket_obj, arg->rados_completion, &o); completion->release(); /* can't reference arg here, as it might have already been released */ -- 2.39.5