From 33395c8b5b1842b2b182ac6a79f3c1a6a27761da Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Mon, 6 Jun 2011 09:29:47 -0700 Subject: [PATCH] ReplicatedPG: split get_obs_to_trim from snap_trimmer Factor code for getting next collection/objects to trim into get_obs_to_trim. Signed-off-by: Samuel Just --- src/osd/ReplicatedPG.cc | 56 ++++++++++++++++++++++++++++------------- src/osd/ReplicatedPG.h | 3 +++ 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 8c0b4a3a93c2a..df6cbb17eab00 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -717,16 +717,14 @@ void ReplicatedPG::do_sub_op_reply(MOSDSubOpReply *r) sub_op_modify_reply(r); } - -bool ReplicatedPG::snap_trimmer() +/* Returns head of snap_trimq as snap_to_trim and the relevant objects as + * obs_to_trim */ +bool ReplicatedPG::get_obs_to_trim(snapid_t &snap_to_trim, + coll_t &col_to_trim, + vector &obs_to_trim) { - lock(); - if (!(is_primary() && is_clean() && is_active() && !finalizing_scrub)) { - unlock(); - return true; - } - - dout(10) << "snap_trimmer start, purged_snaps " << info.purged_snaps << dendl; + assert_locked(); + obs_to_trim.clear(); interval_set s; s.intersection_of(snap_trimq, info.purged_snaps); @@ -736,25 +734,47 @@ bool ReplicatedPG::snap_trimmer() snap_trimq.subtract(s); } + dout(10) << "get_obs_to_trim , purged_snaps " << info.purged_snaps << dendl; + + if (snap_trimq.size() == 0) return false; + + snap_to_trim = snap_trimq.range_start(); + col_to_trim = coll_t(info.pgid, snap_to_trim); + + if (!snap_collections.contains(snap_to_trim)) { + return true; + } + + osd->store->collection_list(col_to_trim, obs_to_trim); + + return true; +} + + +bool ReplicatedPG::snap_trimmer() +{ + lock(); + if (!(is_primary() && is_clean() && is_active() && !finalizing_scrub)) { + unlock(); + return true; + } epoch_t current_set_started = info.history.last_epoch_started; + snapid_t sn; + coll_t c; + vector ls; - while (snap_trimq.size() && - current_set_started == info.history.last_epoch_started && - is_active()) { + while (current_set_started == info.history.last_epoch_started && + is_active() && + get_obs_to_trim(sn, c, ls)) { - snapid_t sn = snap_trimq.range_start(); - coll_t c(info.pgid, sn); - if (!snap_collections.contains(sn)) { + if (ls.empty()) { // adjust pg info info.purged_snaps.insert(sn); snap_trimq.erase(sn); dout(10) << "purged_snaps now " << info.purged_snaps << ", snap_trimq now " << snap_trimq << dendl; continue; } - vector ls; - osd->store->collection_list(c, ls); - dout(10) << "snap_trimmer collection " << c << " has " << ls.size() << " items" << dendl; for (vector::iterator p = ls.begin(); p != ls.end(); p++) { diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index cf4229136677d..21f57341b5b2f 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -674,6 +674,9 @@ public: void do_pg_op(MOSDOp *op); void do_sub_op(MOSDSubOp *op); void do_sub_op_reply(MOSDSubOpReply *op); + bool get_obs_to_trim(snapid_t &snap_to_trim, + coll_t &col_to_trim, + vector &obs_to_trim); bool snap_trimmer(); int do_osd_ops(OpContext *ctx, vector& ops, bufferlist& odata); -- 2.39.5