From 485fa04fe8df2f69b217a2c8eaade1663972e5de Mon Sep 17 00:00:00 2001 From: "Adam C. Emerson" Date: Mon, 26 Apr 2021 18:45:09 -0400 Subject: [PATCH] rgw: Trim bilog with generation From the REST interface and radosgw-admin. Assume Generation 0 if none provided and error if it doesn't exist. Signed-off-by: Adam C. Emerson --- src/rgw/rgw_admin.cc | 16 +++++----------- src/rgw/rgw_reshard.cc | 1 + src/rgw/rgw_rest_log.cc | 37 ++++++++++++++++++++----------------- src/rgw/rgw_trim_bilog.cc | 24 ++++++++++++++++++++++++ src/rgw/rgw_trim_bilog.h | 5 +++++ 5 files changed, 55 insertions(+), 28 deletions(-) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 14511b0ff6d..baba80ada3e 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -9336,18 +9336,12 @@ next: return -ret; } - const auto& logs = bucket->get_info().layout.logs; - auto log_layout = std::reference_wrapper{logs.back()}; - if (gen) { - auto i = std::find_if(logs.begin(), logs.end(), rgw::matches_gen(*gen)); - if (i == logs.end()) { - cerr << "ERROR: no log layout with gen=" << *gen << std::endl; - return ENOENT; - } - log_layout = *i; + if (!gen) { + gen = 0; } - - ret = static_cast(store)->svc()->bilog_rados->log_trim(dpp(), bucket->get_info(), log_layout, shard_id, start_marker, end_marker); + ret = bilog_trim(dpp(), static_cast(store), + bucket->get_info(), *gen, + shard_id, start_marker, end_marker); if (ret < 0) { cerr << "ERROR: trim_bi_log_entries(): " << cpp_strerror(-ret) << std::endl; return -ret; diff --git a/src/rgw/rgw_reshard.cc b/src/rgw/rgw_reshard.cc index 672b4b9c8e2..e4aacb44b6e 100644 --- a/src/rgw/rgw_reshard.cc +++ b/src/rgw/rgw_reshard.cc @@ -11,6 +11,7 @@ #include "rgw_sal_rados.h" #include "cls/rgw/cls_rgw_client.h" #include "cls/lock/cls_lock_client.h" +#include "services/svc_bilog_rados.h" #include "common/errno.h" #include "common/ceph_json.h" diff --git a/src/rgw/rgw_rest_log.cc b/src/rgw/rgw_rest_log.cc index 7f3302de8c8..764a1420dbb 100644 --- a/src/rgw/rgw_rest_log.cc +++ b/src/rgw/rgw_rest_log.cc @@ -576,11 +576,13 @@ void RGWOp_BILog_Info::send_response() { } void RGWOp_BILog_Delete::execute(optional_yield y) { + bool gen_specified = false; string tenant_name = s->info.args.get("tenant"), bucket_name = s->info.args.get("bucket"), start_marker = s->info.args.get("start-marker"), end_marker = s->info.args.get("end-marker"), - bucket_instance = s->info.args.get("bucket-instance"); + bucket_instance = s->info.args.get("bucket-instance"), + gen_str = s->info.args.get("generation", &gen_specified); std::unique_ptr bucket; rgw_bucket b(rgw_bucket_key(tenant_name, bucket_name)); @@ -588,11 +590,22 @@ void RGWOp_BILog_Delete::execute(optional_yield y) { op_ret = 0; if ((bucket_name.empty() && bucket_instance.empty()) || end_marker.empty()) { - ldpp_dout(this, 5) << "ERROR: one of bucket and bucket instance, and also end-marker is mandatory" << dendl; + ldpp_dout(this, 5) << "ERROR: one of bucket or bucket instance, and also end-marker is mandatory" << dendl; op_ret = -EINVAL; return; } + string err; + uint64_t gen = 0; + if (gen_specified) { + gen = strict_strtoll(gen_str.c_str(), 10, &err); + if (!err.empty()) { + ldpp_dout(s, 5) << "Error parsing generation param " << gen_str << dendl; + op_ret = -EINVAL; + return; + } + } + int shard_id; string bn; op_ret = rgw_bucket_parse_bucket_instance(bucket_instance, &bn, &bucket_instance, &shard_id); @@ -610,23 +623,13 @@ void RGWOp_BILog_Delete::execute(optional_yield y) { return; } - const auto& logs = bucket->get_info().layout.logs; - auto log_layout = std::reference_wrapper{logs.back()}; - auto gen = logs.back().gen; // TODO: remove this once gen is passed here - if (gen) { - auto i = std::find_if(logs.begin(), logs.end(), rgw::matches_gen(gen)); - if (i == logs.end()) { - ldpp_dout(s, 5) << "ERROR: no log layout with gen=" << gen << dendl; - op_ret = -ENOENT; - return; - } - log_layout = *i; - } - - op_ret = static_cast(store)->svc()->bilog_rados->log_trim(s, bucket->get_info(), log_layout, shard_id, start_marker, end_marker); + op_ret = bilog_trim(this, static_cast(store), + bucket->get_info(), gen, shard_id, + start_marker, end_marker); if (op_ret < 0) { - ldpp_dout(this, 5) << "ERROR: trim_bi_log_entries() " << dendl; + ldpp_dout(s, 5) << "bilog_trim failed with op_ret=" << op_ret << dendl; } + return; } diff --git a/src/rgw/rgw_trim_bilog.cc b/src/rgw/rgw_trim_bilog.cc index f589904815c..7cf1b686b57 100644 --- a/src/rgw/rgw_trim_bilog.cc +++ b/src/rgw/rgw_trim_bilog.cc @@ -34,6 +34,7 @@ #include "services/svc_zone.h" #include "services/svc_meta.h" +#include "services/svc_bilog_rados.h" #include #include "include/ceph_assert.h" @@ -1286,3 +1287,26 @@ std::ostream& BucketTrimManager::gen_prefix(std::ostream& out) const } } // namespace rgw + +int bilog_trim(const DoutPrefixProvider* p, rgw::sal::RadosStore* store, + RGWBucketInfo& bucket_info, uint64_t gen, int shard_id, + std::string_view start_marker, std::string_view end_marker) +{ + auto& logs = bucket_info.layout.logs; + auto log = std::find_if(logs.begin(), logs.end(), rgw::matches_gen(gen)); + if (log == logs.end()) { + ldpp_dout(p, 5) << __PRETTY_FUNCTION__ << ":" << __LINE__ + << "ERROR: no log layout with gen=" << gen << dendl; + return -ENOENT; + } + + auto log_layout = *log; + + auto r = static_cast(store)->svc()->bilog_rados + ->log_trim(p, bucket_info, log_layout, shard_id, start_marker, end_marker); + if (r < 0) { + ldpp_dout(p, 5) << __PRETTY_FUNCTION__ << ":" << __LINE__ + << "ERROR: bilog_rados->log_trim returned r=" << r << dendl; + } + return r; +} diff --git a/src/rgw/rgw_trim_bilog.h b/src/rgw/rgw_trim_bilog.h index 28652c95ba1..f4432eec9fa 100644 --- a/src/rgw/rgw_trim_bilog.h +++ b/src/rgw/rgw_trim_bilog.h @@ -24,6 +24,7 @@ #include "include/encoding.h" #include "common/ceph_time.h" #include "common/dout.h" +#include "rgw/rgw_common.h" class RGWCoroutine; class RGWHTTPManager; @@ -116,4 +117,8 @@ struct BucketTrimStatus { WRITE_CLASS_ENCODER(rgw::BucketTrimStatus); +int bilog_trim(const DoutPrefixProvider* p, rgw::sal::RadosStore* store, + RGWBucketInfo& bucket_info, uint64_t gen, int shard_id, + std::string_view start_marker, std::string_view end_marker); + #endif // RGW_SYNC_LOG_TRIM_H -- 2.39.5