From 6472f2c7505a66055fda57110f617bd88b94567b Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 18 Aug 2008 18:11:25 -0700 Subject: [PATCH] osd: track clone overlap (instead of diff) in snapset --- src/osd/ReplicatedPG.cc | 18 ++++++++++-------- src/osd/osd_types.h | 12 ++++++------ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 2ee0bc6e84706..23caeccc0acf3 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -502,17 +502,17 @@ bool ReplicatedPG::snap_trimmer() break; if (p == snapset.clones.begin()) { // newest clone. - snapset.head_diffs.union_of(snapset.clone_diffs[last]); + snapset.head_overlap.intersection_of(snapset.clone_overlap[last]); } else { // older clone vector::iterator n = p; n++; if (n != snapset.clones.end()) // not oldest clone. - snapset.clone_diffs[*n].union_of(snapset.clone_diffs[*p]); + snapset.clone_overlap[*n].intersection_of(snapset.clone_overlap[*p]); } snapset.clones.erase(p); - snapset.clone_diffs.erase(last); + snapset.clone_overlap.erase(last); dout(10) << coid << " new head " << head << " snapset " << snapset << dendl; @@ -869,7 +869,7 @@ void ReplicatedPG::prepare_transaction(ObjectStore::Transaction& t, osd_reqid_t } snapset.clones.push_back(coid.oid.snap); - snapset.clone_diffs[coid.oid.snap].swap(snapset.head_diffs); + snapset.clone_overlap[coid.oid.snap].swap(snapset.head_overlap); at_version.version++; } @@ -940,7 +940,8 @@ void ReplicatedPG::prepare_transaction(ObjectStore::Transaction& t, osd_reqid_t snapset.head_exists = true; interval_set<__u64> ch; ch.insert(offset, length); - snapset.head_diffs.union_of(ch); + ch.union_of(snapset.head_overlap); + snapset.head_overlap.subtract(ch); } break; @@ -950,7 +951,8 @@ void ReplicatedPG::prepare_transaction(ObjectStore::Transaction& t, osd_reqid_t if (inc_lock) t.setattr(info.pgid.to_coll(), poid, "inc_lock", &inc_lock, sizeof(inc_lock)); interval_set<__u64> ch; ch.insert(offset, length); - snapset.head_diffs.union_of(ch); + ch.union_of(snapset.head_overlap); + snapset.head_overlap.subtract(ch); } break; @@ -960,14 +962,14 @@ void ReplicatedPG::prepare_transaction(ObjectStore::Transaction& t, osd_reqid_t if (inc_lock) t.setattr(info.pgid.to_coll(), poid, "inc_lock", &inc_lock, sizeof(inc_lock)); interval_set<__u64> keep; keep.insert(0, length); - snapset.head_diffs.intersection_of(keep); + snapset.head_overlap.union_of(keep); } break; case CEPH_OSD_OP_DELETE: { // delete t.remove(info.pgid.to_coll(), poid); - snapset.head_diffs.clear(); + snapset.head_overlap.clear(); } break; diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 9fcd69e403e11..8aeff77b57c14 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -441,8 +441,8 @@ struct SnapSet { bool head_exists; vector snaps; vector clones; - interval_set<__u64> head_diffs; // subset of data that is "new" - map > clone_diffs; // diff to previous + interval_set<__u64> head_overlap; // subset of data that is "shared" + map > clone_overlap; // overlap w/ previous SnapSet() : head_exists(false) {} @@ -451,16 +451,16 @@ struct SnapSet { ::encode(head_exists, bl); ::encode(snaps, bl); ::encode(clones, bl); - ::encode(head_diffs, bl); - ::encode(clone_diffs, bl); + ::encode(head_overlap, bl); + ::encode(clone_overlap, bl); } void decode(bufferlist::iterator& bl) { ::decode(seq, bl); ::decode(head_exists, bl); ::decode(snaps, bl); ::decode(clones, bl); - ::decode(head_diffs, bl); - ::decode(clone_diffs, bl); + ::decode(head_overlap, bl); + ::decode(clone_overlap, bl); } }; WRITE_CLASS_ENCODER(SnapSet) -- 2.39.5