LRU lru; // dentry lru for expiring items from cache
LRU bottom_lru; // dentries that should be trimmed ASAP
protected:
- ceph::unordered_map<vinodeno_t,CInode*> inode_map; // map of inodes by ino
+ ceph::unordered_map<inodeno_t,CInode*> inode_map; // map of head inodes by ino
+ map<vinodeno_t, CInode*> snap_inode_map; // map of snap inodes by ino
CInode *root; // root inode
CInode *myin; // .ceph/mds%d dir
DecayRate decayrate;
+ int num_shadow_inodes;
+
int num_inodes_with_caps;
unsigned max_dir_commit_size;
// inode_map
bool have_inode(vinodeno_t vino) {
- return inode_map.count(vino) ? true:false;
+ if (vino.snapid == CEPH_NOSNAP)
+ return inode_map.count(vino.ino) ? true : false;
+ else
+ return snap_inode_map.count(vino) ? true : false;
}
bool have_inode(inodeno_t ino, snapid_t snap=CEPH_NOSNAP) {
return have_inode(vinodeno_t(ino, snap));
}
CInode* get_inode(vinodeno_t vino) {
- if (have_inode(vino))
- return inode_map[vino];
+ if (vino.snapid == CEPH_NOSNAP) {
+ auto p = inode_map.find(vino.ino);
+ if (p != inode_map.end())
+ return p->second;
+ } else {
+ auto p = snap_inode_map.find(vino);
+ if (p != snap_inode_map.end())
+ return p->second;
+ }
return NULL;
}
CInode* get_inode(inodeno_t ino, snapid_t s=CEPH_NOSNAP) {
friend class C_MDC_Join;
public:
- void replicate_dir(CDir *dir, mds_rank_t to, bufferlist& bl) {
- dirfrag_t df = dir->dirfrag();
- ::encode(df, bl);
- dir->encode_replica(to, bl);
- }
- void replicate_dentry(CDentry *dn, mds_rank_t to, bufferlist& bl) {
- ::encode(dn->name, bl);
- ::encode(dn->last, bl);
- dn->encode_replica(to, bl);
- }
+ void replicate_dir(CDir *dir, mds_rank_t to, bufferlist& bl);
+ void replicate_dentry(CDentry *dn, mds_rank_t to, bufferlist& bl);
void replicate_inode(CInode *in, mds_rank_t to, bufferlist& bl,
- uint64_t features) {
- ::encode(in->inode.ino, bl); // bleh, minor assymetry here
- ::encode(in->last, bl);
- in->encode_replica(to, bl, features);
- }
+ uint64_t features);
CDir* add_replica_dir(bufferlist::iterator& p, CInode *diri, mds_rank_t from, list<MDSInternalContextBase*>& finished);
CDentry *add_replica_dentry(bufferlist::iterator& p, CDir *dir, list<MDSInternalContextBase*>& finished);
CInode *hack_pick_random_inode() {
assert(!inode_map.empty());
int n = rand() % inode_map.size();
- ceph::unordered_map<vinodeno_t,CInode*>::iterator p = inode_map.begin();
+ auto p = inode_map.begin();
while (n--) ++p;
return p->second;
}