if (!op.size())
return 0;
+ // remove replication-trace attr to be able to re-replicate an object when metadata changes
bufferlist bl;
+ const string replication_trace = RGW_ATTR_OBJ_REPLICATION_TRACE;
+ bool removed_attr{false};
+ r = state->get_attr(replication_trace, bl);
+ if (r < 0) {
+ ldpp_dout(dpp, 10) << "ERROR: cannot remove attr " << replication_trace.c_str() << dendl;
+ } else {
+ op.rmxattr(replication_trace.c_str());
+ removed_attr = true;
+ }
+
+ bl.clear();
+
RGWRados::Bucket bop(this, bucket_info);
RGWRados::Bucket::UpdateIndex index_op(&bop, obj);
}
}
+ if (removed_attr) {
+ state->attrset.erase(replication_trace);
+ }
+
for (iter = attrs.begin(); iter != attrs.end(); ++iter) {
state->attrset[iter->first] = iter->second;
}
/* Temporarily set target */
state.obj = target;
set_atomic(true);
- state.attrset[attr_name] = attr_val;
- r = set_obj_attrs(dpp, &state.attrset, nullptr, y, flags);
+
+ Attrs mattr;
+ mattr[attr_name] = attr_val;
+ r = set_obj_attrs(dpp, &mattr, nullptr, y, flags);
/* Restore target */
state.obj = save;
before_set_acl = bucket2.get_acl(k)
assert(len(before_set_acl.acl.grants) == 1)
- #set object acl on primary and wait for sync.
- bucket.set_canned_acl('public-read', key_name=k)
- log.debug('set acl=%s', bucket.name)
+ #set object acl on secondary and wait for sync.
+ bucket2.set_canned_acl('public-read', key_name=k)
+ log.debug('set acl=%s', bucket2.name)
zonegroup_data_checkpoint(zonegroup_conns)
- zonegroup_bucket_checkpoint(zonegroup_conns, bucket.name)
+ zonegroup_bucket_checkpoint(zonegroup_conns, bucket2.name)
- #check object secondary after setacl
- bucket2 = get_bucket(secondary, bucket.name)
+ #check object on primary after setacl
+ bucket2 = get_bucket(primary, bucket.name)
after_set_acl = bucket2.get_acl(k)
assert(len(after_set_acl.acl.grants) == 2) # read grant added on AllUsers