From b577d8ec02d9fb1fb44009e70a8064335bc92a80 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 4 Aug 2008 14:29:27 -0700 Subject: [PATCH] client: snaprealm reconnect, update fixes --- src/client/Client.cc | 24 +++++++++++++++++++----- src/client/Client.h | 2 +- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index d000b7aa8644b..5bf483d005b53 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -1204,6 +1204,7 @@ void Client::send_reconnect(int mds) if (mds_sessions.count(mds)) { // i have an open session. + hash_set did_snaprealm; for (hash_map::iterator p = inode_map.begin(); p != inode_map.end(); p++) { @@ -1215,13 +1216,19 @@ void Client::send_reconnect(int mds) << dendl; filepath path; in->make_path(path); - dout(10) << " path on " << p->first << " is " << path << dendl; + dout(10) << " path " << path << dendl; in->caps[mds]->seq = 0; // reset seq. m->add_cap(p->first.ino, path.get_path(), // ino in->caps_wanted(), // wanted in->caps[mds]->issued, // issued in->inode.size, in->inode.mtime, in->inode.atime, in->snaprealm->ino); + + if (did_snaprealm.count(in->snaprealm->ino) == 0) { + dout(10) << " snaprealm " << *in->snaprealm << dendl; + m->add_snaprealm(in->snaprealm->ino, in->snaprealm->seq, in->snaprealm->parent); + did_snaprealm.insert(in->snaprealm->ino); + } } if (in->exporting_mds == mds) { dout(10) << " clearing exporting_caps on " << p->first << dendl; @@ -1231,6 +1238,7 @@ void Client::send_reconnect(int mds) } } + // reset my cap seq number mds_sessions[mds].seq = 0; } else { @@ -1650,7 +1658,7 @@ void Client::invalidate_snaprealm_and_children(SnapRealm *realm) } } -void Client::adjust_realm_parent(SnapRealm *realm, inodeno_t parent) +bool Client::adjust_realm_parent(SnapRealm *realm, inodeno_t parent) { if (realm->parent != parent) { dout(10) << "adjust_realm_parent " << *realm @@ -1662,7 +1670,9 @@ void Client::adjust_realm_parent(SnapRealm *realm, inodeno_t parent) } realm->pparent = get_snap_realm(parent); realm->pparent->pchildren.insert(realm); + return true; } + return false; } inodeno_t Client::update_snap_trace(bufferlist& bl, bool flush) @@ -1707,10 +1717,11 @@ inodeno_t Client::update_snap_trace(bufferlist& bl, bool flush) q.push_back(*p); } } + } // _always_ verify parent - adjust_realm_parent(realm, info.parent); + bool invalidate = adjust_realm_parent(realm, info.parent); if (info.seq > realm->seq) { // update @@ -1720,12 +1731,15 @@ inodeno_t Client::update_snap_trace(bufferlist& bl, bool flush) realm->prior_parent_snaps = info.prior_parent_snaps; realm->my_snaps = info.my_snaps; realm->seq = info.seq; - + invalidate = true; + } + if (invalidate) { invalidate_snaprealm_and_children(realm); + dout(15) << "update_snap_trace " << *realm << " self|parent updated" << dendl; dout(15) << " snaps " << realm->get_snaps() << dendl; } else { dout(10) << "update_snap_trace " << *realm << " seq " << info.seq - << " <= " << realm->seq << ", SKIPPING" << dendl; + << " <= " << realm->seq << " and same parent, SKIPPING" << dendl; } put_snap_realm(realm); diff --git a/src/client/Client.h b/src/client/Client.h index 4c7b0407b898a..c0f2230005083 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -639,7 +639,7 @@ protected: delete realm; } } - void adjust_realm_parent(SnapRealm *realm, inodeno_t parent); + bool adjust_realm_parent(SnapRealm *realm, inodeno_t parent); inodeno_t update_snap_trace(bufferlist& bl, bool must_flush=true); inodeno_t _update_snap_trace(vector& trace); void invalidate_snaprealm_and_children(SnapRealm *realm); -- 2.39.5