From ee3ff62ef1a5b80657f66cf9a187cae7c171ab21 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 21 Jul 2008 11:19:41 -0700 Subject: [PATCH] client: flush caps on realm + its children --- src/client/Client.cc | 37 +++++++++++++++++++++++++++++-------- src/client/Client.h | 2 ++ 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 2080638283572..7ccfdda97d1e5 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -1644,12 +1644,40 @@ inodeno_t Client::update_snap_trace(bufferlist& bl) if (info.seq > realm->seq) { dout(10) << "update_snap_trace " << *realm << " seq " << info.seq << " > " << realm->seq << dendl; + + // writeback any dirty caps _before_ updating snap list (i.e. with old snap info) + // flush me + children + list q; + q.push_back(realm); + while (!q.empty()) { + SnapRealm *realm = q.front(); + q.pop_front(); + dout(10) << " flushing caps on " << *realm << dendl; + + for (xlist::iterator p = realm->inodes_with_caps.begin(); !p.end(); ++p) { + Inode *in = *p; + check_caps(in, true); // force writeback of write caps + if (g_conf.client_oc) + _flush(in); + } + + for (set::iterator p = realm->pchildren.begin(); + p != realm->pchildren.end(); + p++) + q.push_back(*p); + } + + + // update realm->created = info.created; if (realm->parent != info.parent) { realm->parent = info.parent; - if (realm->pparent) + if (realm->pparent) { + realm->pparent->pchildren.erase(realm); put_snap_realm(realm->pparent); + } realm->pparent = get_snap_realm(info.parent); + realm->pparent->pchildren.insert(realm); } realm->parent = info.parent; realm->parent_since = info.parent_since; @@ -1657,13 +1685,6 @@ inodeno_t Client::update_snap_trace(bufferlist& bl) realm->my_snaps = info.my_snaps; realm->seq = info.seq; - // writeback any dirty caps _before_ updating snap list (i.e. with old snap info) - for (xlist::iterator p = realm->inodes_with_caps.begin(); !p.end(); ++p) { - Inode *in = *p; - check_caps(in, true); // force writeback of write caps - if (g_conf.client_oc) - _flush(in); - } realm->invalidate_cache(); dout(15) << " snaps " << realm->get_snaps() << dendl; } else { diff --git a/src/client/Client.h b/src/client/Client.h index b6a9f2668ab51..827da2a166196 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -128,6 +128,8 @@ struct SnapRealm { vector my_snaps; SnapRealm *pparent; + set pchildren; + vector cached_snaps; // my_snaps + parent snaps + past_parent_snaps xlist inodes_with_caps; -- 2.39.5