bool CInode::encode_inodestat(bufferlist& bl, Session *session,
+ SnapRealm *realm,
snapid_t snapid, bool is_replay)
{
int client = session->inst.name.num();
bool valid = true;
+ // do not issue caps if inode differs from readdir snaprealm
+ bool no_caps = (realm && snaprealm && realm != snaprealm);
+ if (no_caps)
+ dout(20) << "encode_inodestat realm=" << realm << " snaprealm " << snaprealm
+ << " no_caps=" << no_caps << dendl;
+
// pick a version!
inode_t *oi = &inode;
inode_t *pi = get_projected_inode();
e.cap.mseq = 0;
e.cap.realm = 0;
} else {
- if (valid && !cap && is_auth()) {
+ if (!no_caps && valid && !cap && is_auth()) {
// add a new cap
cap = add_client_cap(client, session, &mdcache->client_rdcaps, find_snaprealm());
}
if (is_replay) {
+ assert(cap);
// if this is a replayed request, check for a cap reconnect
ceph_mds_cap_reconnect *rc = mdcache->get_replay_cap_reconnect(pi->ino, client);
if (rc) {
// for giving to clients
- bool encode_inodestat(bufferlist& bl, Session *session, snapid_t snapid=CEPH_NOSNAP, bool is_replay=false);
+ bool encode_inodestat(bufferlist& bl, Session *session, SnapRealm *realm,
+ snapid_t snapid=CEPH_NOSNAP, bool is_replay=false);
void encode_cap_message(MClientCaps *m, Capability *cap);
// snapbl
realm = in->find_snaprealm();
reply->snapbl = realm->get_snap_trace();
- dout(10) << "set_trace_dist snaprealm " << *realm << dendl;
+ dout(10) << "set_trace_dist snaprealm " << *realm << " len=" << reply->snapbl.length() << dendl;
}
- in->encode_inodestat(bl, session, snapid, is_replay);
+ in->encode_inodestat(bl, session, NULL, snapid, is_replay);
dout(20) << "set_trace_dist added snapid " << snapid << " " << *in << dendl;
if (snapid != CEPH_NOSNAP && in == snapdiri) {
// back to the live tree
snapid = CEPH_NOSNAP;
- in->encode_inodestat(bl, session, snapid);
+ in->encode_inodestat(bl, session, NULL, snapid);
numi++;
dout(20) << "set_trace_dist added snapid " << snapid << " " << *in << dendl;
// inode
dout(12) << "including inode " << *in << dendl;
- bool valid = in->encode_inodestat(dnbl, mdr->session, snapid);
+ bool valid = in->encode_inodestat(dnbl, mdr->session, realm, snapid);
assert(valid);
numfiles++;
else
::encode(p->second->get_long_name(), dnbl);
encode_infinite_lease(dnbl);
- diri->encode_inodestat(dnbl, mdr->session, p->first);
+ diri->encode_inodestat(dnbl, mdr->session, realm, p->first);
num++;
}