From ab44e5971f14b88102921b06edaa671bbb117b5d Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Fri, 10 Apr 2015 13:58:15 +0800 Subject: [PATCH] mds: make sure snap inode's last match existing snapshots MDCache::pick_inode_snap() and snap caps flushing code require this. Signed-off-by: Yan, Zheng --- src/mds/CInode.cc | 12 ++++++++---- src/mds/MDCache.cc | 21 ++++++++++++++++----- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 38ecb1615305f..b5507d3b923a8 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -304,10 +304,14 @@ void CInode::split_need_snapflush(CInode *cowin, CInode *in) { dout(10) << "split_need_snapflush [" << cowin->first << "," << cowin->last << "] for " << *cowin << dendl; for (compact_map >::iterator p = client_need_snapflush.lower_bound(cowin->first); - p != client_need_snapflush.end() && p->first <= cowin->last; - ++p) { - assert(!p->second.empty()); - cowin->auth_pin(this); + p != client_need_snapflush.end() && p->first < in->first; ) { + compact_map >::iterator q = p; + ++p; + assert(!q->second.empty()); + if (cowin->last >= q->first) + cowin->auth_pin(this); + else + client_need_snapflush.erase(q); in->auth_unpin(this); } } diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index f9e5a48e85c33..041c691b3a3ad 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -1482,11 +1482,25 @@ CInode *MDCache::cow_inode(CInode *in, snapid_t last) { assert(last >= in->first); - CInode *oldin = new CInode(this, true, in->first, last); + SnapRealm *realm = in->find_snaprealm(); + const set& snaps = realm->get_snaps(); + + // make sure snap inode's last match existing snapshots. + // MDCache::pick_inode_snap() requires this. + snapid_t last_snap = last; + if (snaps.count(last) == 0) { + set::const_iterator p = snaps.upper_bound(last); + if (p != snaps.begin()) { + --p; + if (*p >= in->first) + last_snap = *p; + } + } + + CInode *oldin = new CInode(this, true, in->first, last_snap); oldin->inode = *in->get_previous_projected_inode(); oldin->symlink = in->symlink; oldin->xattrs = *in->get_previous_projected_xattrs(); - oldin->inode.trim_client_ranges(last); if (in->first < in->oldest_snap) @@ -1496,9 +1510,6 @@ CInode *MDCache::cow_inode(CInode *in, snapid_t last) dout(10) << "cow_inode " << *in << " to " << *oldin << dendl; add_inode(oldin); - - SnapRealm *realm = in->find_snaprealm(); - const set& snaps = realm->get_snaps(); if (in->last != CEPH_NOSNAP) { CInode *head_in = get_inode(in->ino()); -- 2.39.5