From 65fd29981863f6f5b695ad7e1749e6a43cd79957 Mon Sep 17 00:00:00 2001 From: Thomas Lamprecht Date: Thu, 17 Apr 2025 15:14:17 +0200 Subject: [PATCH] import source of Ceph Squid 19.2.2 release Signed-off-by: Thomas Lamprecht --- ceph/CMakeLists.txt | 2 +- ceph/ceph.spec | 6 ++-- ceph/changelog.upstream | 6 ++++ ceph/qa/workunits/rgw/test_rgw_orphan_list.sh | 31 +++++++++++++++++++ ceph/src/.git_version | 4 +-- ceph/src/rgw/driver/dbstore/common/dbstore.h | 2 +- .../rgw/driver/rados/rgw_putobj_processor.cc | 3 +- .../rgw/driver/rados/rgw_putobj_processor.h | 3 +- ceph/src/rgw/driver/rados/rgw_rados.cc | 21 ++++++------- ceph/src/rgw/driver/rados/rgw_rados.h | 10 +++--- ceph/src/rgw/rgw_sal.cc | 1 - ceph/src/rgw/rgw_sal.h | 1 - 12 files changed, 63 insertions(+), 27 deletions(-) diff --git a/ceph/CMakeLists.txt b/ceph/CMakeLists.txt index fbca3df54..d3a19771f 100644 --- a/ceph/CMakeLists.txt +++ b/ceph/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.16) project(ceph - VERSION 19.2.1 + VERSION 19.2.2 LANGUAGES CXX C ASM) foreach(policy CMP0127 CMP0135) diff --git a/ceph/ceph.spec b/ceph/ceph.spec index 5f20d0aba..9b2b96f50 100644 --- a/ceph/ceph.spec +++ b/ceph/ceph.spec @@ -181,7 +181,7 @@ # main package definition ################################################################################# Name: ceph -Version: 19.2.1 +Version: 19.2.2 Release: 0%{?dist} %if 0%{?fedora} || 0%{?rhel} Epoch: 2 @@ -197,7 +197,7 @@ License: LGPL-2.1 and LGPL-3.0 and CC-BY-SA-3.0 and GPL-2.0 and BSL-1.0 and BSD- Group: System/Filesystems %endif URL: http://ceph.com/ -Source0: %{?_remote_tarball_prefix}ceph-19.2.1.tar.bz2 +Source0: %{?_remote_tarball_prefix}ceph-19.2.2.tar.bz2 %if 0%{?suse_version} # _insert_obs_source_lines_here ExclusiveArch: x86_64 aarch64 ppc64le s390x riscv64 @@ -1334,7 +1334,7 @@ This package provides a Ceph hardware monitoring agent. # common ################################################################################# %prep -%autosetup -p1 -n ceph-19.2.1 +%autosetup -p1 -n ceph-19.2.2 %build # Disable lto on systems that do not support symver attribute diff --git a/ceph/changelog.upstream b/ceph/changelog.upstream index dcf57c249..ecde9e6ac 100644 --- a/ceph/changelog.upstream +++ b/ceph/changelog.upstream @@ -1,3 +1,9 @@ +ceph (19.2.2-1) stable; urgency=medium + + * New upstream release + + -- Ceph Release Team Tue, 08 Apr 2025 21:08:35 +0000 + ceph (19.2.1-1) stable; urgency=medium * New upstream release diff --git a/ceph/qa/workunits/rgw/test_rgw_orphan_list.sh b/ceph/qa/workunits/rgw/test_rgw_orphan_list.sh index 00d8ed646..c66718a56 100755 --- a/ceph/qa/workunits/rgw/test_rgw_orphan_list.sh +++ b/ceph/qa/workunits/rgw/test_rgw_orphan_list.sh @@ -460,6 +460,37 @@ done mys3cmd rb --recursive s3://$d_bkt mys3cmd rb --recursive s3://$o_bkt +############################################################ +# copy a multipart object to itself +# run gc process after the copy, then try to get the object + +o_bkt="orig-mp-bkt-8" + +mys3cmd mb s3://$o_bkt + +mp_obj="multipart-obj-1" +mys3cmd put -q $huge_obj s3://${o_bkt}/$mp_obj + +mys3cmd cp --mime-type="text/plain" s3://${o_bkt}/$mp_obj s3://${o_bkt}/$mp_obj + +##################################################################### +# FORCE GARBAGE COLLECTION +sleep 6 # since for testing age at which gc can happen is 5 secs +radosgw-admin gc process --include-all +##################################################################### + +mp_obj_retrieved="multipart-obj-1-retrieved" +mys3cmd get s3://${o_bkt}/$mp_obj $mp_obj_retrieved --force + +if [ -f $mp_obj_retrieved ]; then + rm -f $mp_obj_retrieved +else + echo "ERROR: failed to get the object after copying to itself" + exit 1 +fi + +mys3cmd rb --recursive s3://$o_bkt + ##################################################################### # FORCE GARBAGE COLLECTION sleep 6 # since for testing age at which gc can happen is 5 secs diff --git a/ceph/src/.git_version b/ceph/src/.git_version index 4c1f0f929..7331fda04 100644 --- a/ceph/src/.git_version +++ b/ceph/src/.git_version @@ -1,2 +1,2 @@ -58a7fab8be0a062d730ad7da874972fd3fba59fb -19.2.1 +0eceb0defba60152a8182f7bd87d164b639885b8 +19.2.2 diff --git a/ceph/src/rgw/driver/dbstore/common/dbstore.h b/ceph/src/rgw/driver/dbstore/common/dbstore.h index 3f8191f5a..d0cada338 100644 --- a/ceph/src/rgw/driver/dbstore/common/dbstore.h +++ b/ceph/src/rgw/driver/dbstore/common/dbstore.h @@ -517,7 +517,7 @@ class DBOp { * * - RGWObjState. Below are omitted from that struct * as they seem in-memory variables - * * is_atomic, has_atts, exists, prefetch_data, keep_tail, + * * is_atomic, has_atts, exists, prefetch_data, * - RGWObjManifest * * Extra field added "IsMultipart" to flag multipart uploads, diff --git a/ceph/src/rgw/driver/rados/rgw_putobj_processor.cc b/ceph/src/rgw/driver/rados/rgw_putobj_processor.cc index 5716ad311..bbfb5f564 100644 --- a/ceph/src/rgw/driver/rados/rgw_putobj_processor.cc +++ b/ceph/src/rgw/driver/rados/rgw_putobj_processor.cc @@ -675,7 +675,7 @@ int AppendObjectProcessor::prepare(optional_yield y) tail_placement_rule.storage_class = RGW_STORAGE_CLASS_STANDARD; } manifest.set_prefix(cur_manifest->get_prefix()); - astate->keep_tail = true; + keep_tail = true; } manifest.set_multipart_part_rule(store->ctx()->_conf->rgw_obj_stripe_size, cur_part_num); @@ -742,6 +742,7 @@ int AppendObjectProcessor::complete(size_t accounted_size, const string &etag, c obj_op.meta.user_data = user_data; obj_op.meta.zones_trace = zones_trace; obj_op.meta.modify_tail = true; + obj_op.meta.keep_tail = keep_tail; obj_op.meta.appendable = true; //Add the append part number bufferlist cur_part_num_bl; diff --git a/ceph/src/rgw/driver/rados/rgw_putobj_processor.h b/ceph/src/rgw/driver/rados/rgw_putobj_processor.h index 655428f83..1b5e145f0 100644 --- a/ceph/src/rgw/driver/rados/rgw_putobj_processor.h +++ b/ceph/src/rgw/driver/rados/rgw_putobj_processor.h @@ -257,6 +257,7 @@ class MultipartObjectProcessor : public ManifestObjectProcessor { uint64_t *cur_accounted_size; std::string cur_etag; const std::string unique_tag; + bool keep_tail; RGWObjManifest *cur_manifest; @@ -274,7 +275,7 @@ class MultipartObjectProcessor : public ManifestObjectProcessor { : ManifestObjectProcessor(aio, store, bucket_info, ptail_placement_rule, owner, obj_ctx, _head_obj, dpp, y, trace), position(position), cur_size(0), cur_accounted_size(cur_accounted_size), - unique_tag(unique_tag), cur_manifest(nullptr) + unique_tag(unique_tag), keep_tail(false), cur_manifest(nullptr) {} int prepare(optional_yield y) override; int complete(size_t accounted_size, const std::string& etag, diff --git a/ceph/src/rgw/driver/rados/rgw_rados.cc b/ceph/src/rgw/driver/rados/rgw_rados.cc index c06edafc0..96b3ab423 100644 --- a/ceph/src/rgw/driver/rados/rgw_rados.cc +++ b/ceph/src/rgw/driver/rados/rgw_rados.cc @@ -3119,8 +3119,8 @@ int RGWRados::swift_versioning_restore(RGWObjectCtx& obj_ctx, int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_size, map& attrs, - bool assume_noent, bool modify_tail, - void *_index_op, const req_context& rctx, + bool assume_noent, void *_index_op, + const req_context& rctx, jspan_context& trace, bool log_op) { RGWRados::Bucket::UpdateIndex *index_op = static_cast(_index_op); @@ -3164,7 +3164,7 @@ int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_si if (!ptag && !index_op->get_optag()->empty()) { ptag = index_op->get_optag(); } - r = target->prepare_atomic_modification(rctx.dpp, op, reset_obj, ptag, meta.if_match, meta.if_nomatch, false, modify_tail, rctx.y); + r = target->prepare_atomic_modification(rctx.dpp, op, reset_obj, ptag, meta.if_match, meta.if_nomatch, false, meta.modify_tail, rctx.y); if (r < 0) return r; @@ -3307,7 +3307,7 @@ int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_si poolid = ioctx.get_id(); - r = target->complete_atomic_modification(rctx.dpp, rctx.y); + r = target->complete_atomic_modification(rctx.dpp, meta.keep_tail, rctx.y); if (r < 0) { ldpp_dout(rctx.dpp, 0) << "ERROR: complete_atomic_modification returned r=" << r << dendl; } @@ -3420,13 +3420,13 @@ int RGWRados::Object::Write::write_meta(uint64_t size, uint64_t accounted_size, bool assume_noent = (meta.if_match == NULL && meta.if_nomatch == NULL); int r; if (assume_noent) { - r = _do_write_meta(size, accounted_size, attrs, assume_noent, meta.modify_tail, (void *)&index_op, rctx, trace, log_op); + r = _do_write_meta(size, accounted_size, attrs, assume_noent, (void *)&index_op, rctx, trace, log_op); if (r == -EEXIST) { assume_noent = false; } } if (!assume_noent) { - r = _do_write_meta(size, accounted_size, attrs, assume_noent, meta.modify_tail, (void *)&index_op, rctx, trace, log_op); + r = _do_write_meta(size, accounted_size, attrs, assume_noent, (void *)&index_op, rctx, trace, log_op); } return r; } @@ -4945,8 +4945,6 @@ int RGWRados::copy_obj(RGWObjectCtx& src_obj_ctx, pmanifest = &manifest; } else { pmanifest = amanifest; - /* don't send the object's tail for garbage collection */ - astate->keep_tail = true; } if (copy_first) { @@ -4971,6 +4969,7 @@ int RGWRados::copy_obj(RGWObjectCtx& src_obj_ctx, write_op.meta.olh_epoch = olh_epoch; write_op.meta.delete_at = delete_at; write_op.meta.modify_tail = !copy_itself; + write_op.meta.keep_tail = copy_itself; ret = write_op.write_meta(obj_size, astate->accounted_size, attrs, rctx, trace); if (ret < 0) { @@ -5359,9 +5358,9 @@ int RGWRados::bucket_suspended(const DoutPrefixProvider *dpp, rgw_bucket& bucket return 0; } -int RGWRados::Object::complete_atomic_modification(const DoutPrefixProvider *dpp, optional_yield y) +int RGWRados::Object::complete_atomic_modification(const DoutPrefixProvider *dpp, bool keep_tail, optional_yield y) { - if ((!manifest)|| state->keep_tail) + if ((!manifest) || keep_tail) return 0; cls_rgw_obj_chain chain; @@ -5913,7 +5912,7 @@ int RGWRados::Object::Delete::delete_obj(optional_yield y, const DoutPrefixProvi } r = index_op.complete_del(dpp, poolid, epoch, state->mtime, params.remove_objs, y, log_op); - int ret = target->complete_atomic_modification(dpp, y); + int ret = target->complete_atomic_modification(dpp, false, y); if (ret < 0) { ldpp_dout(dpp, 0) << "ERROR: complete_atomic_modification returned ret=" << ret << dendl; } diff --git a/ceph/src/rgw/driver/rados/rgw_rados.h b/ceph/src/rgw/driver/rados/rgw_rados.h index b61f78492..3eaac1dda 100644 --- a/ceph/src/rgw/driver/rados/rgw_rados.h +++ b/ceph/src/rgw/driver/rados/rgw_rados.h @@ -692,7 +692,7 @@ public: int prepare_atomic_modification(const DoutPrefixProvider *dpp, librados::ObjectWriteOperation& op, bool reset_obj, const std::string *ptag, const char *ifmatch, const char *ifnomatch, bool removal_op, bool modify_tail, optional_yield y); - int complete_atomic_modification(const DoutPrefixProvider *dpp, optional_yield y); + int complete_atomic_modification(const DoutPrefixProvider *dpp, bool keep_tail, optional_yield y); public: Object(RGWRados *_store, const RGWBucketInfo& _bucket_info, RGWObjectCtx& _ctx, const rgw_obj& _obj) : store(_store), bucket_info(_bucket_info), @@ -810,22 +810,22 @@ public: const std::string *user_data; rgw_zone_set *zones_trace; bool modify_tail; + bool keep_tail; bool completeMultipart; bool appendable; MetaParams() : mtime(NULL), rmattrs(NULL), data(NULL), manifest(NULL), ptag(NULL), remove_objs(NULL), category(RGWObjCategory::Main), flags(0), if_match(NULL), if_nomatch(NULL), canceled(false), user_data(nullptr), zones_trace(nullptr), - modify_tail(false), completeMultipart(false), appendable(false) {} + modify_tail(false), keep_tail(false), completeMultipart(false), appendable(false) {} } meta; explicit Write(RGWRados::Object *_target) : target(_target) {} int _do_write_meta(uint64_t size, uint64_t accounted_size, std::map& attrs, - bool modify_tail, bool assume_noent, - void *index_op, const req_context& rctx, - jspan_context& trace, + bool assume_noent, void *index_op, + const req_context& rctx, jspan_context& trace, bool log_op = true); int write_meta(uint64_t size, uint64_t accounted_size, std::map& attrs, diff --git a/ceph/src/rgw/rgw_sal.cc b/ceph/src/rgw/rgw_sal.cc index d9dd1bde6..260cb94a2 100644 --- a/ceph/src/rgw/rgw_sal.cc +++ b/ceph/src/rgw/rgw_sal.cc @@ -93,7 +93,6 @@ RGWObjState::RGWObjState(const RGWObjState& rhs) : obj (rhs.obj) { data = rhs.data; } prefetch_data = rhs.prefetch_data; - keep_tail = rhs.keep_tail; is_olh = rhs.is_olh; objv_tracker = rhs.objv_tracker; pg_ver = rhs.pg_ver; diff --git a/ceph/src/rgw/rgw_sal.h b/ceph/src/rgw/rgw_sal.h index 6aa055bca..9fbaabad8 100644 --- a/ceph/src/rgw/rgw_sal.h +++ b/ceph/src/rgw/rgw_sal.h @@ -101,7 +101,6 @@ struct RGWObjState { bool has_data{false}; bufferlist data; bool prefetch_data{false}; - bool keep_tail{false}; bool is_olh{false}; bufferlist olh_tag; uint64_t pg_ver{false};