From 7d94d8f311861d37d06697b4cd0ae9dae1f6dcae Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 15 Jul 2008 16:39:41 -0700 Subject: [PATCH] mds: watch dn first,last in metablob replay --- src/TODO | 15 +++++++++------ src/mds/events/EMetaBlob.h | 6 +++--- src/mds/journal.cc | 35 +++++++++++++++++++++++++++++------ 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/TODO b/src/TODO index 861b285de78c5..d0cae5a092de6 100644 --- a/src/TODO +++ b/src/TODO @@ -227,20 +227,16 @@ todo - realms - make better sense of snap_highwater...? - snap creation - - enforce name uniqueness? - async SnapClient for the possibly remote SnapTable - hmm, can we generalize any of AnchorClient? -- mds metadata versioning - - (dir) inode versions.. - /- cdir fetch/store versioned dentries - emetablob.. journaling a versioned update.. + - replay + - fetch may need to adjust loaded dentry first,last? - migrator import/export of versioned dentries, inodes... drop them on export... -- path_traverse handling of .snapshot? - primary file link -> old inode primary dir link -> multiversion inode remote link -> multiversion inode @@ -255,7 +251,14 @@ todo - will snapshots and CAS play nice? - cas object refs should follow same deletion semantics as non-cas objects. +- locker + - dirstat/fragstats + - leases on snapshotted inodes.. cuz the dirstat updates will be lazy.. + - mds server ops + - rename + - link rollback + - rename rollback - when we create a snapshot, - xlock snaplock diff --git a/src/mds/events/EMetaBlob.h b/src/mds/events/EMetaBlob.h index e0a8ff19dfafe..945ecdf3f52f5 100644 --- a/src/mds/events/EMetaBlob.h +++ b/src/mds/events/EMetaBlob.h @@ -99,7 +99,7 @@ public: ::decode(dirty, bl); } void print(ostream& out) { - out << " fullbit dn " << dn << " [" << dnfirst << "," << dnlast << "]" << " dnv " << dnv + out << " fullbit dn " << dn << " [" << dnfirst << "," << dnlast << "] dnv " << dnv << " inode " << inode.ino << " dirty=" << dirty << std::endl; } @@ -140,7 +140,7 @@ public: ::decode(dirty, bl); } void print(ostream& out) { - out << " remotebit dn " << dn << " dnv " << dnv + out << " remotebit dn " << dn << " [" << dnfirst << "," << dnlast << "] dnv " << dnv << " ino " << ino << " dirty=" << dirty << std::endl; } @@ -176,7 +176,7 @@ public: ::decode(dirty, bl); } void print(ostream& out) { - out << " nullbit dn " << dn << " dnv " << dnv + out << " nullbit dn " << dn << " [" << dnfirst << "," << dnlast << "] dnv " << dnv << " dirty=" << dirty << std::endl; } }; diff --git a/src/mds/journal.cc b/src/mds/journal.cc index e1cce8995df7b..606751452769a 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -348,13 +348,20 @@ void EMetaBlob::replay(MDS *mds, LogSegment *logseg) for (list::iterator p = lump.get_dfull().begin(); p != lump.get_dfull().end(); p++) { - CDentry *dn = dir->lookup(p->dn); + CDentry *dn = dir->lookup(p->dn, p->dnlast); + if (dn && dn->first < p->dnfirst) { + dn->last = p->dnfirst-1; + dout(10) << "EMetaBlob.replay versioned " << *dn << dendl; + dn = 0; + } if (!dn) { - dn = dir->add_null_dentry(p->dn); + dn = dir->add_null_dentry(p->dn, p->dnfirst, p->dnlast); dn->set_version(p->dnv); if (p->dirty) dn->_mark_dirty(logseg); dout(10) << "EMetaBlob.replay added " << *dn << dendl; } else { + assert(p->dnfirst == dn->first); + dn->last = p->dnlast; dn->set_version(p->dnv); if (p->dirty) dn->_mark_dirty(logseg); dout(10) << "EMetaBlob.replay had " << *dn << dendl; @@ -407,13 +414,21 @@ void EMetaBlob::replay(MDS *mds, LogSegment *logseg) for (list::iterator p = lump.get_dremote().begin(); p != lump.get_dremote().end(); p++) { - CDentry *dn = dir->lookup(p->dn); + CDentry *dn = dir->lookup(p->dn, p->dnlast); + if (dn && dn->first < p->dnfirst) { + dn->last = p->dnfirst-1; + dn->_mark_dirty(logseg); + dout(10) << "EMetaBlob.replay versioned " << *dn << dendl; + dn = 0; + } if (!dn) { - dn = dir->add_remote_dentry(p->dn, p->ino, p->d_type); + dn = dir->add_remote_dentry(p->dn, p->ino, p->d_type, p->dnfirst, p->dnlast); dn->set_version(p->dnv); if (p->dirty) dn->_mark_dirty(logseg); dout(10) << "EMetaBlob.replay added " << *dn << dendl; } else { + assert(p->dnfirst == dn->first); + dn->last = p->dnlast; if (!dn->is_null()) { dout(10) << "EMetaBlob.replay unlinking " << *dn << dendl; dir->unlink_inode(dn); @@ -429,13 +444,21 @@ void EMetaBlob::replay(MDS *mds, LogSegment *logseg) for (list::iterator p = lump.get_dnull().begin(); p != lump.get_dnull().end(); p++) { - CDentry *dn = dir->lookup(p->dn); + CDentry *dn = dir->lookup(p->dn, p->dnfirst); + if (dn && dn->first < p->dnfirst) { + dn->last = p->dnfirst-1; + dn->_mark_dirty(logseg); + dout(10) << "EMetaBlob.replay versioned " << *dn << dendl; + dn = 0; + } if (!dn) { - dn = dir->add_null_dentry(p->dn); + dn = dir->add_null_dentry(p->dn, p->dnfirst, p->dnlast); dn->set_version(p->dnv); if (p->dirty) dn->_mark_dirty(logseg); dout(10) << "EMetaBlob.replay added " << *dn << dendl; } else { + assert(p->dnfirst == dn->first); + dn->last = p->dnlast; if (!dn->is_null()) { dout(10) << "EMetaBlob.replay unlinking " << *dn << dendl; dir->unlink_inode(dn); -- 2.39.5