@@ -3127,8 +3127,8 @@ int RGWRados::swift_versioning_restore(RGWObjectCtx& obj_ctx,
31273127
31283128int RGWRados::Object::Write::_do_write_meta (uint64_t size, uint64_t accounted_size,
31293129 map<string, bufferlist>& attrs,
3130- bool assume_noent, bool modify_tail ,
3131- void *_index_op, const req_context& rctx,
3130+ bool assume_noent, void *_index_op ,
3131+ const req_context& rctx,
31323132 jspan_context& trace, bool log_op)
31333133{
31343134 RGWRados::Bucket::UpdateIndex *index_op = static_cast <RGWRados::Bucket::UpdateIndex *>(_index_op);
@@ -3172,7 +3172,7 @@ int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_si
31723172 if (!ptag && !index_op->get_optag ()->empty ()) {
31733173 ptag = index_op->get_optag ();
31743174 }
3175- r = target->prepare_atomic_modification (rctx.dpp , op, reset_obj, ptag, meta.if_match , meta.if_nomatch , false , modify_tail, rctx.y );
3175+ r = target->prepare_atomic_modification (rctx.dpp , op, reset_obj, ptag, meta.if_match , meta.if_nomatch , false , meta. modify_tail , rctx.y );
31763176 if (r < 0 )
31773177 return r;
31783178
@@ -3339,7 +3339,7 @@ int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_si
33393339
33403340 poolid = ioctx.get_id ();
33413341
3342- r = target->complete_atomic_modification (rctx.dpp , rctx.y );
3342+ r = target->complete_atomic_modification (rctx.dpp , meta. keep_tail , rctx.y );
33433343 if (r < 0 ) {
33443344 ldpp_dout (rctx.dpp , 0 ) << " ERROR: complete_atomic_modification returned r=" << r << dendl;
33453345 }
@@ -3457,13 +3457,13 @@ int RGWRados::Object::Write::write_meta(uint64_t size, uint64_t accounted_size,
34573457 bool assume_noent = (meta.if_match == NULL && meta.if_nomatch == NULL );
34583458 int r;
34593459 if (assume_noent) {
3460- r = _do_write_meta (size, accounted_size, attrs, assume_noent, meta. modify_tail , (void *)&index_op, rctx, trace, log_op);
3460+ r = _do_write_meta (size, accounted_size, attrs, assume_noent, (void *)&index_op, rctx, trace, log_op);
34613461 if (r == -EEXIST) {
34623462 assume_noent = false ;
34633463 }
34643464 }
34653465 if (!assume_noent) {
3466- r = _do_write_meta (size, accounted_size, attrs, assume_noent, meta. modify_tail , (void *)&index_op, rctx, trace, log_op);
3466+ r = _do_write_meta (size, accounted_size, attrs, assume_noent, (void *)&index_op, rctx, trace, log_op);
34673467 }
34683468 return r;
34693469}
@@ -5037,6 +5037,7 @@ int RGWRados::copy_obj(RGWObjectCtx& src_obj_ctx,
50375037 write_op.meta .olh_epoch = olh_epoch;
50385038 write_op.meta .delete_at = delete_at;
50395039 write_op.meta .modify_tail = !copy_itself;
5040+ write_op.meta .keep_tail = copy_itself;
50405041
50415042 ret = write_op.write_meta (obj_size, astate->accounted_size , attrs, rctx, trace);
50425043 if (ret < 0 ) {
@@ -5659,9 +5660,9 @@ int RGWRados::bucket_suspended(const DoutPrefixProvider *dpp, rgw_bucket& bucket
56595660 return 0 ;
56605661}
56615662
5662- int RGWRados::Object::complete_atomic_modification (const DoutPrefixProvider *dpp, optional_yield y)
5663+ int RGWRados::Object::complete_atomic_modification (const DoutPrefixProvider *dpp, bool keep_tail, optional_yield y)
56635664{
5664- if ((!manifest)|| state->keep_tail )
5665+ if ((!manifest) || state->keep_tail || keep_tail)
56655666 return 0 ;
56665667
56675668 cls_rgw_obj_chain chain;
@@ -6238,7 +6239,7 @@ int RGWRados::Object::Delete::delete_obj(optional_yield y, const DoutPrefixProvi
62386239 }
62396240 r = index_op.complete_del (dpp, poolid, epoch, state->mtime , params.remove_objs , y, log_op);
62406241
6241- int ret = target->complete_atomic_modification (dpp, y);
6242+ int ret = target->complete_atomic_modification (dpp, false , y);
62426243 if (ret < 0 ) {
62436244 ldpp_dout (dpp, 0 ) << " ERROR: complete_atomic_modification returned ret=" << ret << dendl;
62446245 }
0 commit comments