From 8079f4df4da09a6bc8d065a6a272be2d451b6db5 Mon Sep 17 00:00:00 2001 From: Matt Benjamin Date: Fri, 4 Sep 2020 15:02:42 -0400 Subject: [PATCH] rgwlc: fix (post-parallel) non-current expiration Object mtime had been lifted correctly into LCOpRule for DMExpiration and, apparently, NonCurrentTransition, but not for NonCurrentExpiration. Some additional debug statements added at level 20. Fixes: https://tracker.ceph.com/issues/47308 Signed-off-by: Matt Benjamin --- src/rgw/rgw_lc.cc | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/rgw/rgw_lc.cc b/src/rgw/rgw_lc.cc index 87e8d6bd5d86a..f176e8e8141f3 100644 --- a/src/rgw/rgw_lc.cc +++ b/src/rgw/rgw_lc.cc @@ -352,12 +352,19 @@ static bool obj_has_expired(CephContext *cct, ceph::real_time mtime, int days, cmp = days*cct->_conf->rgw_lc_debug_interval; base_time = ceph_clock_now(); } - timediff = base_time - ceph::real_clock::to_time_t(mtime); + auto tt_mtime = ceph::real_clock::to_time_t(mtime); + timediff = base_time - tt_mtime; if (expire_time) { *expire_time = mtime + make_timespan(cmp); } - ldout(cct, 20) << __func__ << "(): mtime=" << mtime << " days=" << days << " base_time=" << base_time << " timediff=" << timediff << " cmp=" << cmp << dendl; + + ldout(cct, 20) << __func__ << __func__ + << "(): mtime=" << mtime << " days=" << days + << " base_time=" << base_time << " timediff=" << timediff + << " cmp=" << cmp + << " is_expired=" << (timediff >= cmp) + << dendl; return (timediff >= cmp); } @@ -530,7 +537,7 @@ struct lc_op_ctx { op_env env; rgw_bucket_dir_entry o; boost::optional next_key_name; - ceph::real_time dm_effective_mtime; + ceph::real_time effective_mtime; rgw::sal::RGWRadosStore *store; RGWBucketInfo& bucket_info; @@ -544,9 +551,10 @@ struct lc_op_ctx { lc_op_ctx(op_env& env, rgw_bucket_dir_entry& o, boost::optional next_key_name, - ceph::real_time dem, + ceph::real_time effective_mtime, const DoutPrefixProvider *dpp, WorkQ* wq) : cct(env.store->ctx()), env(env), o(o), next_key_name(next_key_name), + effective_mtime(effective_mtime), store(env.store), bucket_info(env.bucket_info), op(env.op), ol(env.ol), obj(env.bucket_info.bucket, o.key), rctx(env.store), dpp(dpp), wq(wq) {} @@ -631,7 +639,7 @@ class LCOpRule { op_env env; boost::optional next_key_name; - ceph::real_time dm_effective_mtime; + ceph::real_time effective_mtime; std::vector > filters; // n.b., sharing ovhd std::vector > actions; @@ -643,6 +651,10 @@ public: return next_key_name; } + std::vector>& get_actions() { + return actions; + } + void build(); void update(); int process(rgw_bucket_dir_entry& o, const DoutPrefixProvider *dpp, @@ -1101,10 +1113,8 @@ public: class LCOpAction_NonCurrentExpiration : public LCOpAction { protected: - ceph::real_time mtime; public: LCOpAction_NonCurrentExpiration(op_env& env) - : mtime(env.ol.get_prev_obj().meta.mtime) {} bool check(lc_op_ctx& oc, ceph::real_time *exp_time) override { @@ -1117,11 +1127,13 @@ public: } int expiration = oc.op.noncur_expiration; - bool is_expired = obj_has_expired(oc.cct, mtime, expiration, exp_time); + bool is_expired = obj_has_expired(oc.cct, oc.effective_mtime, expiration, + exp_time); ldout(oc.cct, 20) << __func__ << "(): key=" << o.key << ": is_expired=" << is_expired << " " << oc.wq->thr_name() << dendl; + return is_expired && pass_object_lock_check(oc.store->getRados(), oc.bucket_info, oc.obj, oc.rctx); @@ -1311,7 +1323,7 @@ protected: } ceph::real_time get_effective_mtime(lc_op_ctx& oc) override { - return oc.dm_effective_mtime; + return oc.effective_mtime; } public: LCOpAction_NonCurrentTransition(op_env& env, @@ -1360,14 +1372,14 @@ void LCOpRule::build() void LCOpRule::update() { next_key_name = env.ol.next_key_name(); - dm_effective_mtime = env.ol.get_prev_obj().meta.mtime; + effective_mtime = env.ol.get_prev_obj().meta.mtime; } int LCOpRule::process(rgw_bucket_dir_entry& o, const DoutPrefixProvider *dpp, WorkQ* wq) { - lc_op_ctx ctx(env, o, next_key_name, dm_effective_mtime, dpp, wq); + lc_op_ctx ctx(env, o, next_key_name, effective_mtime, dpp, wq); shared_ptr *selected = nullptr; // n.b., req'd by sharing real_time exp; -- 2.39.5