From 67122c5c79416cc1cea3fde0274f8cc32379b3ce Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 18 Jul 2008 12:37:02 -0700 Subject: [PATCH] mds: basic rename, more journal_dirty_inode --- src/TODO | 1 - src/mds/Locker.cc | 6 ++---- src/mds/MDCache.cc | 32 ++++++++++---------------------- src/mds/MDCache.h | 4 ++-- src/mds/Server.cc | 42 +++++++++++++++++++++++------------------- 5 files changed, 37 insertions(+), 48 deletions(-) diff --git a/src/TODO b/src/TODO index 59cb1af913734..5b29743a8dee3 100644 --- a/src/TODO +++ b/src/TODO @@ -256,7 +256,6 @@ todo - leases on snapshotted inodes.. cuz the dirstat updates will be lazy.. - mds server ops - - rename - link rollback - rename rollback diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 4fa234ab84bfa..835387db6dca5 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -886,7 +886,7 @@ bool Locker::check_inode_max_size(CInode *in, bool forceupdate, __u64 new_size) predirty_nested(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY); else le->metablob.add_dir_context(in->get_parent_dir()); - le->metablob.add_primary_dentry(in->parent, true, 0, pi); + mdcache->journal_dirty_inode(&le->metablob, in); le->add_ino(in->ino()); mut->ls->open_files.push_back(&in->xlist_open_file); mds->mdlog->submit_entry(le, new C_Locker_FileUpdate_finish(this, in, mut, true)); @@ -1500,8 +1500,6 @@ void Locker::predirty_nested(Mutation *mut, EMetaBlob *blob, else if (cur->snaprealm) realm = cur->snaprealm; mds->mdcache->journal_dirty_inode(blob, cur); - //inode_t *pi = cur->get_projected_inode(); - //blob->add_primary_dentry(cur->get_projected_parent_dn(), true, 0, pi); } } @@ -2433,7 +2431,7 @@ void Locker::scatter_writebehind(ScatterLock *lock) EUpdate *le = new EUpdate(mds->mdlog, "scatter_writebehind"); predirty_nested(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY, false); - le->metablob.add_primary_dentry(in->get_parent_dn(), true, 0, pi); + mdcache->journal_dirty_inode(&le->metablob, in); mds->mdlog->submit_entry(le); mds->mdlog->wait_for_sync(new C_Locker_ScatterWB(this, lock, mut)); diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 130dfb917d584..0eaf627d3fdc8 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -504,7 +504,7 @@ void MDCache::try_subtree_merge_at(CDir *dir) EUpdate *le = new EUpdate(mds->mdlog, "subtree merge writebehind"); le->metablob.add_dir_context(in->get_parent_dn()->get_dir()); - le->metablob.add_primary_dentry(in->get_parent_dn(), true, 0, pi); + journal_dirty_inode(&le->metablob, in); mds->mdlog->submit_entry(le); mds->mdlog->wait_for_sync(new C_MDC_SubtreeMergeWB(this, in, @@ -962,15 +962,12 @@ CInode *MDCache::pick_inode_snap(CInode *in, snapid_t follows) return in; } -CInode *MDCache::cow_inode(CInode *in, snapid_t last, bool write_to_clone) +CInode *MDCache::cow_inode(CInode *in, snapid_t last) { assert(last >= in->first); CInode *oldin = new CInode(this); - if (write_to_clone) - oldin->inode = *in->get_projected_inode(); - else - oldin->inode = *in->get_previous_projected_inode(); + oldin->inode = *in->get_previous_projected_inode(); oldin->symlink = in->symlink; oldin->xattrs = in->xattrs; @@ -1018,7 +1015,6 @@ void MDCache::journal_cow_dentry(EMetaBlob *metablob, CDentry *dn, snapid_t foll * normally, we write to the head, and make a clone of ther previous * dentry+inode state. unless the follow snapid specified. */ - bool write_to_clone = false; if (dn->is_primary() && dn->inode->is_multiversion()) { // multiversion inode. @@ -1026,8 +1022,6 @@ void MDCache::journal_cow_dentry(EMetaBlob *metablob, CDentry *dn, snapid_t foll if (follows == CEPH_NOSNAP || follows == 0) follows = in->find_snaprealm()->get_latest_snap(); - //else - //write_to_clone = true; // already cloned? if (follows < in->first) @@ -1035,10 +1029,7 @@ void MDCache::journal_cow_dentry(EMetaBlob *metablob, CDentry *dn, snapid_t foll old_inode_t &old = in->old_inodes[follows]; old.first = in->first; - if (write_to_clone) - old.inode = *in->get_projected_inode(); - else - old.inode = *in->get_previous_projected_inode(); + old.inode = *in->get_previous_projected_inode(); old.xattrs = in->xattrs; in->first = follows+1; @@ -1048,22 +1039,19 @@ void MDCache::journal_cow_dentry(EMetaBlob *metablob, CDentry *dn, snapid_t foll } else { if (follows == CEPH_NOSNAP) follows = dn->dir->inode->find_snaprealm()->get_latest_snap(); - //else - //write_to_clone = true; // already cloned? if (follows < dn->first) return; - - snapid_t oldfirst = dn->first; - + // update dn.first before adding old dentry to cdir's map + snapid_t oldfirst = dn->first; dn->first = follows+1; dout(10) << " dn " << *dn << dendl; if (dn->is_primary()) { assert(oldfirst == dn->inode->first); - CInode *oldin = cow_inode(dn->inode, follows, write_to_clone); + CInode *oldin = cow_inode(dn->inode, follows); CDentry *olddn = dn->dir->add_primary_dentry(dn->name, oldin, oldfirst, follows); dout(10) << " olddn " << *olddn << dendl; metablob->add_primary_dentry(olddn, true); @@ -1085,11 +1073,11 @@ void MDCache::journal_cow_inode(EMetaBlob *metablob, CInode *in, snapid_t follow journal_cow_dentry(metablob, dn, follows); } -void MDCache::journal_dirty_inode(EMetaBlob *metablob, CInode *in, snapid_t follows) +inode_t *MDCache::journal_dirty_inode(EMetaBlob *metablob, CInode *in, snapid_t follows) { CDentry *dn = in->get_projected_parent_dn(); journal_cow_dentry(metablob, dn, follows); - metablob->add_primary_dentry(dn, true, in, in->get_projected_inode()); + return metablob->add_primary_dentry(dn, true, in, in->get_projected_inode()); } @@ -5265,7 +5253,7 @@ void MDCache::_anchor_prepared(CInode *in, version_t atid, bool add) mut->ls = mds->mdlog->get_current_segment(); EUpdate *le = new EUpdate(mds->mdlog, add ? "anchor_create":"anchor_destroy"); mds->locker->predirty_nested(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY); - le->metablob.add_primary_dentry(in->parent, true, 0, pi); + journal_dirty_inode(&le->metablob, in); le->metablob.add_table_transaction(TABLE_ANCHOR, atid); mds->mdlog->submit_entry(le, new C_MDC_AnchorLogged(this, in, atid, mut)); } diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 783300756431b..a4d42b861679c 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -472,10 +472,10 @@ public: // journal helpers CInode *pick_inode_snap(CInode *in, snapid_t follows); - CInode *cow_inode(CInode *in, snapid_t last, bool write_to_clone=false); + CInode *cow_inode(CInode *in, snapid_t last); void journal_cow_dentry(EMetaBlob *metablob, CDentry *dn, snapid_t follows=CEPH_NOSNAP); void journal_cow_inode(EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP); - void journal_dirty_inode(EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP); + inode_t *journal_dirty_inode(EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP); // slaves void add_uncommitted_master(metareqid_t reqid, LogSegment *ls, set &slaves) { diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 4de3e8e4a5d26..984a9ef4b7cba 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -1254,7 +1254,6 @@ CDentry* Server::prepare_null_dentry(MDRequest *mdr, CDir *dir, const string& dn dn = dir->add_null_dentry(dname); dn->mark_new(); dout(10) << "prepare_null_dentry added " << *dn << dendl; - return dn; } @@ -1822,7 +1821,7 @@ void Server::handle_client_setxattr(MDRequest *mdr) cur->xattrs[name] = buffer::create(len); if (len) req->get_data().copy(0, len, cur->xattrs[name].c_str()); - le->metablob.add_primary_dentry(cur->get_parent_dn(), true, cur, pi); + le->metablob.add_primary_dentry(cur->get_projected_parent_dn(), true, cur, pi); mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur)); } @@ -1868,7 +1867,7 @@ void Server::handle_client_removexattr(MDRequest *mdr) mdcache->journal_cow_inode(&le->metablob, cur); cur->xattrs.erase(name); - le->metablob.add_primary_dentry(cur->get_parent_dn(), true, cur, pi); + le->metablob.add_primary_dentry(cur->get_projected_parent_dn(), true, cur, pi); mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur)); } @@ -2407,8 +2406,6 @@ void Server::_link_remote(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti } if (inc) { - snapid_t dnfollows = dn->dir->inode->find_snaprealm()->get_latest_snap(); - dn->first = dnfollows + 1; dn->pre_dirty(); mds->locker->predirty_nested(mdr, &le->metablob, targeti, dn->dir, PREDIRTY_DIR, 1); le->metablob.add_remote_dentry(dn, true, targeti->ino(), @@ -3016,20 +3013,12 @@ bool Server::_dir_is_nonempty(MDRequest *mdr, CInode *in) // does the frag _look_ empty? if (dir->get_num_head_items()) { - dout(10) << "dir_is_nonempty still " << dir->get_num_head_items() << " cached items in frag " << *dir << dendl; + dout(10) << "dir_is_nonempty still " << dir->get_num_head_items() + << " cached items in frag " << *dir << dendl; reply_request(mdr, -ENOTEMPTY); return true; } - // dir looks empty but incomplete? - /* actually, screw this, it's cheaper to just rely on dirstat! - if (dir->is_auth() && !dir->is_complete()) { - dout(7) << "dir_is_nonempty fetching incomplete dir " << *dir << dendl; - dir->fetch(new C_MDS_RetryRequest(mdcache, mdr)); - return true; - } - */ - // not dir auth? if (!dir->is_auth()) { dout(10) << "dir_is_nonempty non-auth dirfrag for " << *dir << dendl; @@ -3621,10 +3610,11 @@ void Server::_rename_prepare(MDRequest *mdr, // add it all to the metablob // target inode if (!linkmerge) { - if (destdn->is_primary()) + if (destdn->is_primary()) { tji = metablob->add_primary_dentry(straydn, true, destdn->inode, tpi); - else if (destdn->is_remote()) { + } else if (destdn->is_remote()) { metablob->add_dir_context(destdn->inode->get_parent_dir()); + mdcache->journal_cow_dentry(metablob, destdn->inode->parent); tji = metablob->add_primary_dentry(destdn->inode->parent, true, destdn->inode, tpi); } } @@ -3632,16 +3622,30 @@ void Server::_rename_prepare(MDRequest *mdr, // dest if (srcdn->is_remote()) { if (!linkmerge) { + if (!destdn->is_null()) + mdcache->journal_cow_dentry(metablob, destdn); + else + destdn->first = destdn->dir->inode->find_snaprealm()->get_latest_snap()+1; metablob->add_remote_dentry(destdn, true, srcdn->get_remote_ino(), srcdn->get_remote_d_type()); + mdcache->journal_cow_dentry(metablob, srcdn->inode->get_parent_dn()); ji = metablob->add_primary_dentry(srcdn->inode->get_parent_dn(), true, srcdn->inode, pi); } else { + if (!destdn->is_null()) + mdcache->journal_cow_dentry(metablob, destdn); + else + destdn->first = destdn->dir->inode->find_snaprealm()->get_latest_snap()+1; metablob->add_primary_dentry(destdn, true, destdn->inode, pi); } } else if (srcdn->is_primary()) { + if (!destdn->is_null()) + mdcache->journal_cow_dentry(metablob, destdn); + else + destdn->first = destdn->dir->inode->find_snaprealm()->get_latest_snap()+1; ji = metablob->add_primary_dentry(destdn, true, srcdn->inode, pi); } // src + mdcache->journal_cow_dentry(metablob, srcdn); metablob->add_null_dentry(srcdn, true); // new subtree? @@ -4414,7 +4418,7 @@ void Server::handle_client_truncate(MDRequest *mdr) pi->version = pdv; pi->size = le64_to_cpu(req->head.args.truncate.length); mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); - le->metablob.add_primary_dentry(cur->parent, true, 0, pi); + mdcache->journal_dirty_inode(&le->metablob, cur); mdlog->submit_entry(le, fin); } @@ -4612,7 +4616,7 @@ void Server::handle_client_opent(MDRequest *mdr) pi->version = pdv; pi->size = 0; mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); - le->metablob.add_primary_dentry(cur->parent, true, 0, pi); + mdcache->journal_dirty_inode(&le->metablob, cur); mdlog->submit_entry(le, fin); } -- 2.39.5