From 7ad7233e846992f030f3d5011ad8c21cd03db471 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 29 May 2008 14:19:55 -0700 Subject: [PATCH] mds: link rollback works. nested anchor, replay fixups. --- src/client/SyntheticClient.cc | 5 +++-- src/mds/CInode.cc | 5 ++++- src/mds/CInode.h | 1 + src/mds/MDCache.cc | 8 ++++++-- src/mds/Server.cc | 17 +++++++++++------ src/mds/Server.h | 4 ++-- src/mds/events/ESlaveUpdate.h | 2 +- src/mds/journal.cc | 9 +++++++-- 8 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/client/SyntheticClient.cc b/src/client/SyntheticClient.cc index d4ec5c57f9187..877eee795b193 100644 --- a/src/client/SyntheticClient.cc +++ b/src/client/SyntheticClient.cc @@ -2860,9 +2860,10 @@ int SyntheticClient::thrash_links(const char *basedir, int dirs, int files, int srand(0); if (1) { + bool renames = false; // thrash renames too? for (int k=0; kmknod(src.c_str(), 0755); - client->rename(src.c_str(), dst.c_str()); + if (renames) client->rename(src.c_str(), dst.c_str()); break; case 1: client->mknod(src.c_str(), 0755); diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 42cfc6c9e184e..b5ef31a4c1a26 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -73,6 +73,9 @@ ostream& operator<<(ostream& out, CInode& in) if (in.is_freezing_inode()) out << " FREEZING=" << in.auth_pin_freeze_allowance; if (in.is_frozen_inode()) out << " FROZEN"; + if (in.get_nested_anchors()) + out << " na=" << in.get_nested_anchors(); + if (in.inode.is_dir()) { out << " ds=" << in.inode.dirstat.size() << "=" << in.inode.dirstat.nfiles << "+" << in.inode.dirstat.nsubdirs; @@ -596,7 +599,7 @@ void CInode::decode_lock_state(int type, bufferlist& bl) { bool was_anchored = inode.anchored; ::decode(inode.anchored, p); - if (was_anchored != inode.anchored) + if (parent && was_anchored != inode.anchored) parent->adjust_nested_anchors((int)inode.anchored - (int)was_anchored); } break; diff --git a/src/mds/CInode.h b/src/mds/CInode.h index dd71aa9b83581..e6bc6143d58d9 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -508,6 +508,7 @@ public: void auth_unpin(); void adjust_nested_anchors(int by); + int get_nested_anchors() { return nested_anchors; } // -- freeze -- bool is_freezing_inode() { return state_test(STATE_FREEZING); } diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index aab167b3f8c55..cf82ad3a5dd55 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -1411,9 +1411,9 @@ void MDCache::handle_resolve_ack(MMDSResolveAck *ack) // perform rollback (and journal a rollback entry) // note: this will hold up the resolve a bit, until the rollback entries journal. if (uncommitted_slave_updates[from][*p]->origop == ESlaveUpdate::LINK) - mds->server->do_link_rollback(uncommitted_slave_updates[from][*p]->rollback, 0); + mds->server->do_link_rollback(uncommitted_slave_updates[from][*p]->rollback, from, 0); else if (uncommitted_slave_updates[from][*p]->origop == ESlaveUpdate::RENAME) - mds->server->do_rename_rollback(uncommitted_slave_updates[from][*p]->rollback, 0); + mds->server->do_rename_rollback(uncommitted_slave_updates[from][*p]->rollback, from, 0); else assert(0); @@ -2446,6 +2446,8 @@ void MDCache::handle_cache_rejoin_ack(MMDSCacheRejoin *ack) ++p) { CInode *in = get_inode(p->inode.ino); if (!in) continue; + if (in->parent && in->inode.anchored != p->inode.anchored) + in->parent->adjust_nested_anchors( (int)p->inode.anchored - (int)in->inode.anchored ); in->inode = p->inode; in->symlink = p->symlink; in->dirfragtree = p->dirfragtree; @@ -2522,6 +2524,8 @@ void MDCache::handle_cache_rejoin_full(MMDSCacheRejoin *full) set::iterator q = rejoin_undef_inodes.find(in); if (q != rejoin_undef_inodes.end()) { CInode *in = *q; + if (in->parent && in->inode.anchored != p->inode.anchored) + in->parent->adjust_nested_anchors( (int)p->inode.anchored - (int)in->inode.anchored ); in->inode = p->inode; in->symlink = p->symlink; in->dirfragtree = p->dirfragtree; diff --git a/src/mds/Server.cc b/src/mds/Server.cc index de49b3a94cc71..6c756c77a536e 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -2303,6 +2303,8 @@ void Server::_link_remote(MDRequest *mdr, CDentry *dn, CInode *targeti) } dout(10) << " targeti auth has prepared nlink++" << dendl; + assert(0); // test hack: verify that remote slave can do a live rollback. + // go. // predirty dentry dn->pre_dirty(); @@ -2475,7 +2477,7 @@ void Server::_commit_slave_link(MDRequest *mdr, int r, CInode *targeti) mdlog->submit_entry(le); mds->mdcache->request_finish(mdr); } else { - do_link_rollback(mdr->more()->rollback_bl, mdr); + do_link_rollback(mdr->more()->rollback_bl, mdr->slave_to_mds, mdr); } } @@ -2489,7 +2491,7 @@ struct C_MDS_LoggedLinkRollback : public Context { } }; -void Server::do_link_rollback(bufferlist &rbl, MDRequest *mdr) +void Server::do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr) { link_rollback rollback; bufferlist::iterator p = rbl.begin(); @@ -2528,7 +2530,7 @@ void Server::do_link_rollback(bufferlist &rbl, MDRequest *mdr) else pi->nlink++; - ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_link_rollback", rollback.reqid, -1, + ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_link_rollback", rollback.reqid, master, ESlaveUpdate::OP_ROLLBACK, ESlaveUpdate::LINK); le->commit.add_dir_context(parent); le->commit.add_dir(parent, true); @@ -3229,6 +3231,9 @@ void Server::handle_client_rename(MDRequest *mdr) _rename_prepare_witness(mdr, last, srcdn, destdn, straydn); return; } + + // test hack: bail after slave does prepare, so we can verify it's _live_ rollback. + //if (!mdr->more()->slaves.empty()) assert(0); // -- prepare anchor updates -- if (!linkmerge || srcdn->is_primary()) { @@ -3879,7 +3884,7 @@ void Server::_commit_slave_rename(MDRequest *mdr, int r, } else { // abort - do_rename_rollback(mdr->more()->rollback_bl, mdr); + do_rename_rollback(mdr->more()->rollback_bl, mdr->slave_to_mds, mdr); // rollback export. readjust subtree map, if it was a dir. assert(0); // write me @@ -3890,13 +3895,13 @@ void Server::_commit_slave_rename(MDRequest *mdr, int r, mds->mdcache->request_finish(mdr); } -void Server::do_rename_rollback(bufferlist &rbl, MDRequest *mdr) +void Server::do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr) { rename_rollback rollback; bufferlist::iterator p = rbl.begin(); ::decode(rollback, p); - ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_rename_abort", rollback.reqid, -1, + ESlaveUpdate *le = new ESlaveUpdate(mdlog, "slave_rename_abort", rollback.reqid, master, ESlaveUpdate::OP_ROLLBACK, ESlaveUpdate::RENAME); diff --git a/src/mds/Server.h b/src/mds/Server.h index cd9d2c484ab2e..f9ae0241ffbcd 100644 --- a/src/mds/Server.h +++ b/src/mds/Server.h @@ -143,7 +143,7 @@ public: void _logged_slave_link(MDRequest *mdr, CInode *targeti); void _commit_slave_link(MDRequest *mdr, int r, CInode *targeti); void handle_slave_link_prep_ack(MDRequest *mdr, MMDSSlaveRequest *m); - void do_link_rollback(bufferlist &rbl, MDRequest *mdr); + void do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr); void _do_link_rollback_finish(Mutation *mut, MDRequest *mdr); // unlink @@ -178,7 +178,7 @@ public: void handle_slave_rename_prep_ack(MDRequest *mdr, MMDSSlaveRequest *m); void _logged_slave_rename(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn); void _commit_slave_rename(MDRequest *mdr, int r, CDentry *srcdn, CDentry *destdn, CDentry *straydn); - void do_rename_rollback(bufferlist &rbl, MDRequest *mdr); + void do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr); }; diff --git a/src/mds/events/ESlaveUpdate.h b/src/mds/events/ESlaveUpdate.h index c854fa3e8b833..6600a6cb2d3b8 100644 --- a/src/mds/events/ESlaveUpdate.h +++ b/src/mds/events/ESlaveUpdate.h @@ -132,7 +132,7 @@ public: void print(ostream& out) { if (type.length()) out << type << " "; - out << " " << op; + out << " " << (int)op; if (origop == LINK) out << " link"; if (origop == RENAME) out << " rename"; out << " " << reqid; diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 3c923c3bae243..72359895dd617 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -346,12 +346,16 @@ void EMetaBlob::replay(MDS *mds, LogSegment *logseg) dout(10) << "EMetaBlob.replay unlinking " << *in << dendl; in->get_parent_dn()->get_dir()->unlink_inode(in->get_parent_dn()); } + if (in->get_parent_dn() && in->inode.anchored != p->inode.anchored) + in->get_parent_dn()->adjust_nested_anchors( (int)p->inode.anchored - (int)in->inode.anchored ); in->inode = p->inode; in->dirfragtree = p->dirfragtree; in->xattrs = p->xattrs; if (in->inode.is_symlink()) in->symlink = p->symlink; if (p->dirty) in->_mark_dirty(logseg); if (dn->get_inode() != in) { + if (!dn->is_null()) // note: might be remote. as with stray reintegration. + dir->unlink_inode(dn); dir->link_primary_inode(dn, in); dout(10) << "EMetaBlob.replay linked " << *in << dendl; } else { @@ -460,7 +464,8 @@ void EMetaBlob::replay(MDS *mds, LogSegment *logseg) for (list::iterator p = client_reqs.begin(); p != client_reqs.end(); ++p) - mds->sessionmap.add_completed_request(*p); + if (p->name.is_client()) + mds->sessionmap.add_completed_request(*p); // update segment @@ -487,7 +492,7 @@ void ESession::replay(MDS *mds) } else { dout(10) << "ESession.replay sessionmap " << mds->sessionmap.version - << " < " << cmapv << dendl; + << " < " << cmapv << " " << (open ? "open":"close") << dendl; mds->sessionmap.projected = ++mds->sessionmap.version; assert(mds->sessionmap.version == cmapv); if (open) { -- 2.39.5