frag_info.nsubdirs++;
else
frag_info.nfiles++;
- } else if (dnl->is_remote())
+ } else if (dnl->is_remote() || dnl->is_referent_remote())
frag_info.nfiles++;
}
bool bottom_lru;
if (dn->get_linkage()->is_primary()) {
bottom_lru = !is_auth() && inode->is_stray();
- } else if (dn->get_linkage()->is_remote()) {
+ } else if (dn->get_linkage()->is_remote() || dn->get_linkage()->is_referent_remote()) { //TODO Is this right for referent remote?
bottom_lru = false;
} else {
bottom_lru = !is_auth();
// move dirty inode rstat to new dirfrag
if (in->is_dirty_rstat())
dirty_rstat_inodes.push_back(&in->dirty_rstat_item);
- } else if (dn->get_linkage()->is_remote()) {
+ } else if (dn->get_linkage()->is_remote() || dn->get_linkage()->is_referent_remote()) {
if (dn->get_linkage()->get_remote_d_type() == DT_DIR)
_fnode->fragstat.nsubdirs++;
else
else
c.nfiles++;
}
- if (dn->is_remote()) {
+ if (dn->is_remote() || dn->is_referent_remote()) {
if (dn->get_remote_d_type() == DT_DIR)
c.nsubdirs++;
else
dn->first = dir_follows+1;
if (realm->has_snaps_in_range(oldfirst, dir_follows)) {
CDir *dir = dn->dir;
- // TODO: What does this mean for referent inode ?? Passing nullptr for now.
+ /* TODO: No need to cow referent inode. So just the remote dentry is prepared,
+ * journalled and added to dirty_cow_dentries list. But when the journal is
+ * replayed. How does this play out ? Test this out.
+ */
+ if (mds->mdsmap->allow_referent_inodes()) {
+ dout(10) << __func__ << " lookout-1 - Adding dentry as remote for journal when referent inode feature is enabled !!! "
+ << " dentry " << *dn << " first " << oldfirst << " last " << dir_follows << dendl;
+ }
CDentry *olddn = dir->add_remote_dentry(dn->get_name(), nullptr, in->ino(), in->d_type(), dn->alternate_name, oldfirst, dir_follows);
dout(10) << " olddn " << *olddn << dendl;
ceph_assert(dir->is_projected());
metablob->add_primary_dentry(olddn, 0, true, false, false, need_snapflush);
mut->add_cow_dentry(olddn);
} else {
- ceph_assert(dnl->is_remote());
- //No need to journal referent inode for cow
+ ceph_assert(dnl->is_remote() || dnl->is_referent_remote());
+ /* TODO: No need to cow referent inode. So just the remote dentry is prepared,
+ * journalled and added to dirty_cow_dentries list. But when the journal is
+ * replayed. How does this play out ? Test this out.
+ */
+ if (mds->mdsmap->allow_referent_inodes()) {
+ dout(10) << __func__ << " lookout-2 - Adding dentry as remote for journal when referent inode feature is enabled !!! "
+ << " dentry " << *dn << " first " << oldfirst << " last " << follows << dendl;
+ }
CDentry *olddn = dir->add_remote_dentry(dn->get_name(), nullptr, dnl->get_remote_ino(), dnl->get_remote_d_type(), dn->alternate_name, oldfirst, follows);
dout(10) << " olddn " << *olddn << dendl;
// do we have inode?
CInode *in = dnl->get_inode();
if (!in) {
- ceph_assert(dnl->is_remote());
+ ceph_assert(dnl->is_remote() || dnl->is_referent_remote());
// do i have it?
in = get_inode(dnl->get_remote_ino());
if (in) {
if (dnl->is_primary())
return dnl->inode;
- ceph_assert(dnl->is_remote());
+ ceph_assert(dnl->is_remote() || dnl->is_referent_remote());
CInode *in = get_inode(dnl->get_remote_ino());
if (in) {
- dout(7) << "get_dentry_inode linking in remote in " << *in << dendl;
- dn->link_remote(dnl, in);
+ CInode *ref_in = dnl->get_referent_inode();
+ if (dnl->is_referent_remote())
+ ceph_assert(ref_in);
+ if (ref_in) {
+ dout(7) << __func__ << " linking in referent remote in " << *in << "referent " << *ref_in << dendl;
+ dn->link_remote(dnl, in, ref_in);
+ } else {
+ dout(7) << __func__ << " linking in remote in " << *in << dendl;
+ dn->link_remote(dnl, in);
+ }
return in;
} else {
dout(10) << "get_dentry_inode on remote dn, opening inode for " << *dn << dendl;
{
if (r < 0) {
CDentry::linkage_t *dnl = dn->get_projected_linkage();
- if (dnl->is_remote() && dnl->get_remote_ino() == ino) {
+ if ((dnl->is_remote() || dnl->is_referent_remote()) && dnl->get_remote_ino() == ino) {
dout(0) << "open_remote_dentry_finish bad remote dentry " << *dn << dendl;
dn->state_set(CDentry::STATE_BADREMOTEINO);
frag_info.nsubdirs++;
else
frag_info.nfiles++;
- } else if (dnl->is_remote())
+ } else if (dnl->is_remote() || dnl->is_referent_remote())
frag_info.nfiles++;
}