X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ceph%2Fsrc%2Fmds%2FMDCache.h;h=8fd8472e378e8798de4d8d26c4a747ce15d7dd9b;hb=b32b81446b3b05102be0267e79203f59329c1d97;hp=61a170bf6fd57b60baae3a613b89c0a9770afdce;hpb=215dd7151453fae88e6f968c975b6ce309d42dcf;p=ceph.git diff --git a/ceph/src/mds/MDCache.h b/ceph/src/mds/MDCache.h index 61a170bf6..8fd8472e3 100644 --- a/ceph/src/mds/MDCache.h +++ b/ceph/src/mds/MDCache.h @@ -123,7 +123,8 @@ class MDCache { LRU lru; // dentry lru for expiring items from cache LRU bottom_lru; // dentries that should be trimmed ASAP protected: - ceph::unordered_map inode_map; // map of inodes by ino + ceph::unordered_map inode_map; // map of head inodes by ino + map snap_inode_map; // map of snap inodes by ino CInode *root; // root inode CInode *myin; // .ceph/mds%d dir @@ -201,6 +202,8 @@ public: DecayRate decayrate; + int num_shadow_inodes; + int num_inodes_with_caps; unsigned max_dir_commit_size; @@ -762,14 +765,24 @@ public: // 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) { @@ -1035,22 +1048,10 @@ protected: 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& finished); CDentry *add_replica_dentry(bufferlist::iterator& p, CDir *dir, list& finished); @@ -1181,7 +1182,7 @@ public: CInode *hack_pick_random_inode() { assert(!inode_map.empty()); int n = rand() % inode_map.size(); - ceph::unordered_map::iterator p = inode_map.begin(); + auto p = inode_map.begin(); while (n--) ++p; return p->second; }