don't journal bare dirfrag when starting scatter. also add debug
code for bare dirfrag modification.
Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
fnode_t *CDir::project_fnode()
{
+ assert(get_version() != 0);
fnode_t *p = new fnode_t;
*p = *get_projected_fnode();
projected_fnode.push_back(p);
if (dir->is_frozen()) {
dout(10) << "finish_scatter_update " << fg << " frozen, marking " << *lock << " stale " << *dir << dendl;
+ } else if (dir->get_version() == 0) {
+ dout(10) << "finish_scatter_update " << fg << " not loaded, marking " << *lock << " stale " << *dir << dendl;
} else {
if (dir_accounted_version != inode_version) {
dout(10) << "finish_scatter_update " << fg << " journaling accounted scatterstat update v" << inode_version << dendl;
if (newi->inode.is_dir()) {
CDir *dir = newi->get_dirfrag(frag_t());
assert(dir);
- dir->mark_dirty(1, mdr->ls);
+ dir->fnode.version--;
+ dir->mark_dirty(dir->fnode.version + 1, mdr->ls);
dir->mark_new(mdr->ls);
}
// ...and that new dir is empty.
CDir *newdir = newi->get_or_open_dirfrag(mds->mdcache, frag_t());
newdir->mark_complete();
- newdir->pre_dirty();
+ newdir->fnode.version = newdir->pre_dirty();
// prepare finisher
mdr->ls = mdlog->get_current_segment();