From 56c8e126a607a51a7e12e9732a112a9d453cfcee Mon Sep 17 00:00:00 2001 From: Yunchuan Wen Date: Fri, 15 Jun 2018 13:59:30 +0800 Subject: [PATCH] osd: update clone_overlap even the clone have been evicted the clone_overlap is difference of range between head and clones. if the clone have been evicted, the clone_overlap is still exist in the snapset, so we should update the clone_overlap to make it sense. Signed-off-by: Yunchuan Wen --- src/osd/PrimaryLogPG.cc | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 03b974274f1..775ed0c589b 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -8075,18 +8075,21 @@ void PrimaryLogPG::make_writeable(OpContext *ctx) // update most recent clone_overlap and usage stats if (ctx->new_snapset.clones.size() > 0) { + // the clone_overlap is difference of range between head and clones. // we need to check whether the most recent clone exists, if it's - // been evicted, it's not included in the stats + // been evicted, it's not included in the stats, but the clone_overlap + // is still exist in the snapset, so we should update the + // clone_overlap to make it sense. hobject_t last_clone_oid = soid; last_clone_oid.snap = ctx->new_snapset.clone_overlap.rbegin()->first; + interval_set &newest_overlap = + ctx->new_snapset.clone_overlap.rbegin()->second; + ctx->modified_ranges.intersection_of(newest_overlap); if (is_present_clone(last_clone_oid)) { - interval_set &newest_overlap = - ctx->new_snapset.clone_overlap.rbegin()->second; - ctx->modified_ranges.intersection_of(newest_overlap); // modified_ranges is still in use by the clone ctx->delta_stats.num_bytes += ctx->modified_ranges.size(); - newest_overlap.subtract(ctx->modified_ranges); } + newest_overlap.subtract(ctx->modified_ranges); } if (snapc.seq > ctx->new_snapset.seq) {