- leases on snapshotted inodes.. cuz the dirstat updates will be lazy..
- mds server ops
- - rename
- link rollback
- rename rollback
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));
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);
}
}
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));
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,
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;
* 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.
if (follows == CEPH_NOSNAP || follows == 0)
follows = in->find_snaprealm()->get_latest_snap();
- //else
- //write_to_clone = true;
// already cloned?
if (follows < in->first)
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;
} 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);
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());
}
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));
}
// 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<int> &slaves) {
dn = dir->add_null_dentry(dname);
dn->mark_new();
dout(10) << "prepare_null_dentry added " << *dn << dendl;
-
return dn;
}
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));
}
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));
}
}
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(),
// 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;
// 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);
}
}
// 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?
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);
}
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);
}