From 8314c44b8cf06e43d0da017f04be6c3aa820fbb7 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 15 Jul 2008 13:46:40 -0700 Subject: [PATCH] mds: refactor journal_dirty_inode into journal_cow_inode for versioned xattr updates --- src/mds/MDCache.cc | 78 ++++++++++++++++++++++------------------------ src/mds/MDCache.h | 1 + src/mds/Server.cc | 26 ++++++++++------ 3 files changed, 55 insertions(+), 50 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 7fe5aeb35e7c0..588488718c245 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -981,58 +981,56 @@ CInode *MDCache::cow_inode(CInode *in, snapid_t first, snapid_t last) return oldin; } -void MDCache::journal_dirty_inode(EMetaBlob *metablob, CInode *in, snapid_t follows) +void MDCache::journal_cow_inode(EMetaBlob *metablob, CInode *in, snapid_t follows) { - dout(10) << "journal_dirty_inode follows " << follows << " on " << *in << dendl; + dout(10) << "journal_cow_inode follows " << follows << " on " << *in << dendl; CDentry *dn = in->get_projected_parent_dn(); dout(10) << " orig dn " << *dn << dendl; if (follows == CEPH_NOSNAP) follows = in->find_snaprealm()->get_latest_snap(); + + // are we within the current snap? + if (follows < in->first) + return; if (in->is_multiversion()) { // multiversion inode. - if (follows < in->first) { - metablob->add_primary_dentry(dn, true, in, in->get_projected_inode()); - } else { - old_inode_t &old = in->old_inodes[follows]; - old.first = in->first; - if (in->is_projected()) - old.inode = *in->get_previous_projected_inode(); // mkdir/mknod/symlink don't bother to project new inodes - else - old.inode = in->inode; - old.xattrs = in->xattrs; - - in->first = follows+1; - metablob->add_primary_dentry(dn, true, in, in->get_projected_inode()); - - dout(10) << " duped to old_inode [" << old.first << "," << follows << "] " - << *in << dendl; - } + old_inode_t &old = in->old_inodes[follows]; + old.first = in->first; + if (in->is_projected()) + old.inode = *in->get_previous_projected_inode(); + else + old.inode = in->inode; // mkdir/mknod/symlink don't bother to project new inodes + old.xattrs = in->xattrs; + + in->first = follows+1; + + dout(10) << " duped to old_inode [" << old.first << "," << follows << "] " + << *in << dendl; } else { - // are we within the current snap? - if (follows < in->first) { - metablob->add_primary_dentry(dn, true, in, in->get_projected_inode()); - } else { - snapid_t oldfirst = dn->first; - dn->first = follows+1; - - dout(10) << " dn " << *dn << dendl; - CInode *oldin = cow_inode(in, in->first, follows); - CDentry *olddn = dn->dir->add_primary_dentry(dn->name, oldin, oldfirst, follows); - dout(10) << " olddn " << *olddn << dendl; - - metablob->add_primary_dentry(olddn, true); - inode_t *pi; - if (in->is_projected()) - pi = in->get_previous_projected_inode(); // mkdir/mknod/symlink don't bother to project new inodes - else - pi = &in->inode; - metablob->add_primary_dentry(dn, true, in, pi); - } + snapid_t oldfirst = dn->first; + dn->first = follows+1; + + dout(10) << " dn " << *dn << dendl; + CInode *oldin = cow_inode(in, in->first, follows); + CDentry *olddn = dn->dir->add_primary_dentry(dn->name, oldin, oldfirst, follows); + dout(10) << " olddn " << *olddn << dendl; + + metablob->add_primary_dentry(olddn, true); + inode_t *pi; + if (in->is_projected()) + pi = in->get_previous_projected_inode(); + else + pi = &in->inode; // mkdir/mknod/symlink don't bother to project new inodes } -} +} +void MDCache::journal_dirty_inode(EMetaBlob *metablob, CInode *in, snapid_t follows) +{ + journal_cow_inode(metablob, in, follows); + metablob->add_primary_dentry(in->get_projected_parent_dn(), true, in, in->get_projected_inode()); +} diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 22d4d30177e88..41f53e311cbb3 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -469,6 +469,7 @@ public: // journal helpers CInode *pick_inode_snap(CInode *in, snapid_t follows); CInode *cow_inode(CInode *in, snapid_t first, snapid_t last); + 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); // slaves diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 4e4a9616793d8..84b4ea0ec85a1 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -669,7 +669,10 @@ void Server::set_trace_dist(Session *session, MClientReply *reply, CInode *in, C dentry: ::encode(dn->get_name(), bl); - lmask = mds->locker->issue_client_lease(dn, client, bl, now, session); + if (snapid == CEPH_NOSNAP) + lmask = mds->locker->issue_client_lease(dn, client, bl, now, session); + else + encode_empty_lease(bl); numdn++; dout(20) << " trace added " << lmask << " snapid " << snapid << " " << *dn << dendl; @@ -1814,17 +1817,18 @@ void Server::handle_client_setxattr(MDRequest *mdr) pi->version = cur->pre_dirty(); pi->ctime = g_clock.real_now(); - cur->xattrs.erase(name); - cur->xattrs[name] = buffer::create(len); - if (len) - req->get_data().copy(0, len, cur->xattrs[name].c_str()); - // log + wait mdr->ls = mdlog->get_current_segment(); EUpdate *le = new EUpdate(mdlog, "setxattr"); le->metablob.add_client_req(req->get_reqid()); mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); - mdcache->journal_dirty_inode(&le->metablob, cur); + + mdcache->journal_cow_inode(&le->metablob, cur); + cur->xattrs.erase(name); + 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); mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur)); } @@ -1862,15 +1866,17 @@ void Server::handle_client_removexattr(MDRequest *mdr) inode_t *pi = cur->project_inode(); pi->version = cur->pre_dirty(); pi->ctime = g_clock.real_now(); - cur->xattrs.erase(name); // log + wait mdr->ls = mdlog->get_current_segment(); EUpdate *le = new EUpdate(mdlog, "removexattr"); le->metablob.add_client_req(req->get_reqid()); mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false); - mdcache->journal_dirty_inode(&le->metablob, cur); - + + mdcache->journal_cow_inode(&le->metablob, cur); + cur->xattrs.erase(name); + le->metablob.add_primary_dentry(cur->get_parent_dn(), true, cur, pi); + mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur)); } -- 2.39.5