]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: make dentry hash a dir layout property
authorSage Weil <sage@newdream.net>
Mon, 25 Oct 2010 23:46:01 +0000 (16:46 -0700)
committerSage Weil <sage@newdream.net>
Tue, 16 Nov 2010 18:01:05 +0000 (10:01 -0800)
Signed-off-by: Sage Weil <sage@newdream.net>
13 files changed:
src/config.cc
src/config.h
src/include/ceph_fs.h
src/include/types.h
src/mds/Anchor.h
src/mds/CDentry.cc
src/mds/CDentry.h
src/mds/CDir.cc
src/mds/CInode.cc
src/mds/CInode.h
src/mds/MDCache.cc
src/mds/Server.cc
src/mds/mdstypes.h

index 44d7d6060cde0fdaedd2fe6f7972ebdb6537695a..ec5f13edd5da7937800689299fb34ee5924dca41 100644 (file)
@@ -96,6 +96,7 @@ std::map<entity_name_t,float> g_fake_kill_after;
 md_config_t g_conf;
 bool g_daemon = false;
 
+
 #include <stdlib.h>
 #include <string.h>
 
@@ -440,6 +441,7 @@ static struct config_option config_optionsp[] = {
        OPTION(mds_early_reply, 0, OPT_BOOL, true),
        OPTION(mds_short_reply_trace, 0, OPT_BOOL, true),
        OPTION(mds_use_tmap, 0, OPT_BOOL, true),        // use trivialmap for dir updates
+       OPTION(mds_default_dir_hash, 0, OPT_INT, CEPH_STR_HASH_RJENKINS),
        OPTION(mds_log, 0, OPT_BOOL, true),
        OPTION(mds_log_unsafe, 0, OPT_BOOL, false),      // only wait for log sync, when it's mostly safe to do so
        OPTION(mds_log_skip_corrupt_events, 0, OPT_BOOL, false),
index 447365406cdb6a881e942104cd8d5b61604fff89..6382c95f838498fa245bb4045fe3fe04fdea1248 100644 (file)
@@ -261,6 +261,8 @@ struct md_config_t {
 
   bool mds_use_tmap;
 
+  int mds_default_dir_hash;
+
   bool mds_log;
   bool mds_log_unsafe;
   bool mds_log_skip_corrupt_events;
index 83953f77dde7378201a0adb316f19f16f6f60ca3..20186b4989e421f49c96777a180d51fdc843f570 100644 (file)
@@ -58,10 +58,10 @@ struct ceph_file_layout {
        __le32 fl_stripe_count;    /* over this many objects */
        __le32 fl_object_size;     /* until objects are this big, then move to
                                      new objects */
-       __le32 fl_cas_hash;        /* 0 = none; 1 = sha256 */
+       __le32 fl_cas_hash;        /* UNUSED.  0 = none; 1 = sha256 */
 
        /* pg -> disk layout */
-       __le32 fl_object_stripe_unit;  /* for per-object parity, if any */
+       __le32 fl_object_stripe_unit;  /* UNUSED.  for per-object parity, if any */
 
        /* object -> pg layout */
        __le32 fl_pg_preferred; /* preferred primary for pg (-1 for none) */
@@ -72,6 +72,12 @@ struct ceph_file_layout {
 
 int ceph_file_layout_is_valid(const struct ceph_file_layout *layout);
 
+struct ceph_dir_layout {
+       __u8   dl_dir_hash;   /* see ceph_hash.h for ids */
+       __u8   dl_unused1;
+       __u16  dl_unused2;
+       __u32  dl_unused3;
+} __attribute__ ((packed));
 
 /* crypto algorithms */
 #define CEPH_CRYPTO_NONE 0x0
index 4855f645848ad02ff9912a10346b5d6c635330ec..b04d348985a47daf041b0ea33ba213e5dcdabff2 100644 (file)
@@ -211,6 +211,7 @@ struct ltstr
 
 WRITE_RAW_ENCODER(ceph_fsid)
 WRITE_RAW_ENCODER(ceph_file_layout)
+WRITE_RAW_ENCODER(ceph_dir_layout)
 WRITE_RAW_ENCODER(ceph_pg_pool)
 WRITE_RAW_ENCODER(ceph_mds_session_head)
 WRITE_RAW_ENCODER(ceph_mds_request_head)
index 813701d1e44ae16fc32bc421ce1427f911367847..52e71f9ea68aa441a99730a9a7d009a2978adacc 100644 (file)
@@ -40,10 +40,6 @@ public:
   Anchor() : dn_hash(0), nref(0), updated(0) {}
   Anchor(inodeno_t i, inodeno_t di, __u32 hash, int nr, version_t u) :
     ino(i), dirino(di), dn_hash(hash), nref(nr), updated(u) { }
-  Anchor(inodeno_t i, inodeno_t di, const string &dname, int nr, version_t u) :
-    ino(i), dirino(di),
-    dn_hash(ceph_str_hash_linux(dname.data(), dname.length())),
-    nref(nr), updated(u) { }
   
   void encode(bufferlist &bl) const {
     __u8 struct_v = 1;
index 8c87d97dc79d2de74ea68a47329eaf6153d5ce7a..99c9cec240972d06d4554aa4126e2a540fa67fb5 100644 (file)
@@ -262,7 +262,7 @@ void CDentry::make_anchor_trace(vector<Anchor>& trace, CInode *in)
     dir->inode->make_anchor_trace(trace);
 
   // add this inode (in my dirfrag) to the end
-  trace.push_back(Anchor(in->ino(), dir->ino(), name, 0, 0));
+  trace.push_back(Anchor(in->ino(), dir->ino(), get_hash(), 0, 0));
   dout(10) << "make_anchor_trace added " << trace.back() << dendl;
 }
 
index 9143e394a1ed75f4851297d2777c7a74ffe9305a..ca3f2f97649d2703b2b359fd8f767dfed0f0aa01 100644 (file)
@@ -96,6 +96,7 @@ public:
 
 public:
   string name;
+  __u32 hash;
   snapid_t first, last;
 
   dentry_key_t key() { 
@@ -163,9 +164,9 @@ public:
 
  public:
   // cons
-  CDentry(const string& n, 
+  CDentry(const string& n, __u32 h,
          snapid_t f, snapid_t l) :
-    name(n),
+    name(n), hash(h),
     first(f), last(l),
     dir(0),
     version(0), projected_version(0),
@@ -176,9 +177,9 @@ public:
     g_num_dn++;
     g_num_dna++;
   }
-  CDentry(const string& n, inodeno_t ino, unsigned char dt,
+  CDentry(const string& n, __u32 h, inodeno_t ino, unsigned char dt,
          snapid_t f, snapid_t l) :
-    name(n),
+    name(n), hash(h),
     first(f), last(l),
     dir(0),
     version(0), projected_version(0),
@@ -200,6 +201,8 @@ public:
   CDir *get_dir() const { return dir; }
   const string& get_name() const { return name; }
 
+  __u32 get_hash() const { return hash; }
+
   /*
   CInode *get_inode() const { return linkage.inode; }
   inodeno_t get_remote_ino() { return linkage.remote_ino; }
index 7203ee92407e6a85333dfd411e0775ff756771d0..27ed87acff0b641b00a29808c81918e03b7da72f 100644 (file)
@@ -229,7 +229,7 @@ CDentry* CDir::add_null_dentry(const string& dname,
   assert(lookup_exact_snap(dname, last) == 0);
    
   // create dentry
-  CDentry* dn = new CDentry(dname, first, last);
+  CDentry* dn = new CDentry(dname, inode->hash_dentry_name(dname), first, last);
   if (is_auth()) 
     dn->state_set(CDentry::STATE_AUTH);
   cache->lru.lru_insert_mid(dn);
@@ -265,7 +265,7 @@ CDentry* CDir::add_primary_dentry(const string& dname, CInode *in,
   assert(lookup_exact_snap(dname, last) == 0);
   
   // create dentry
-  CDentry* dn = new CDentry(dname, first, last);
+  CDentry* dn = new CDentry(dname, inode->hash_dentry_name(dname), first, last);
   if (is_auth()) 
     dn->state_set(CDentry::STATE_AUTH);
   cache->lru.lru_insert_mid(dn);
@@ -303,9 +303,9 @@ CDentry* CDir::add_remote_dentry(const string& dname, inodeno_t ino, unsigned ch
 {
   // foreign
   assert(lookup_exact_snap(dname, last) == 0);
-  
+
   // create dentry
-  CDentry* dn = new CDentry(dname, ino, d_type, first, last);
+  CDentry* dn = new CDentry(dname, inode->hash_dentry_name(dname), ino, d_type, first, last);
   if (is_auth()) 
     dn->state_set(CDentry::STATE_AUTH);
   cache->lru.lru_insert_mid(dn);
index de9f2ae6001b127e96b922a4b043bd4d1eab3cb2..6909e22bc59bc0047ef10dca2b90d80879c52e1f 100644 (file)
@@ -420,12 +420,20 @@ void CInode::pop_projected_snaprealm(sr_t *next_snaprealm)
 
 // dirfrags
 
+__u32 CInode::hash_dentry_name(const string &dn)
+{
+  int which = inode.dir_layout.dl_dir_hash;
+  if (!which)
+    which = CEPH_STR_HASH_LINUX;
+  return ceph_str_hash(which, dn.data(), dn.length());
+}
+
 frag_t CInode::pick_dirfrag(const string& dn)
 {
   if (dirfragtree.empty())
     return frag_t();          // avoid the string hash if we can.
 
-  __u32 h = ceph_str_hash_linux(dn.data(), dn.length());
+  __u32 h = hash_dentry_name(dn);
   return dirfragtree[h];
 }
 
index 71098250e085f25270bdbfc142663ed8f2dae7e9..c6f7ad9d1969d1b9abc66917b5e5ff32d737bb20 100644 (file)
@@ -358,6 +358,7 @@ private:
   int stickydir_ref;
 
 public:
+  __u32 hash_dentry_name(const string &dn);
   frag_t pick_dirfrag(const string &dn);
   bool has_dirfrags() { return !dirfrags.empty(); }
   CDir* get_dirfrag(frag_t fg) {
index 4e4a420c141381708973211659793998386f19f4..db106a700e14edfcfc6463f5657d61a93a284369 100644 (file)
@@ -6845,7 +6845,7 @@ void MDCache::anchor_create(MDRequest *mdr, CInode *in, Context *onfinish)
   in->make_anchor_trace(trace);
   if (!trace.size()) {
     assert(MDS_INO_IS_BASE(in->ino()));
-    trace.push_back(Anchor(in->ino(), in->ino(), "", 0, 0));
+    trace.push_back(Anchor(in->ino(), in->ino(), 0, 0, 0));
   }
   
   // do it
index 03c7d1b6f6199cebb53fcf99880a4bcf4be01894..539122386b0ef06a1c2d2b6dd4d4a90ea4e110cb 100644 (file)
@@ -1652,6 +1652,11 @@ CInode* Server::prepare_new_inode(MDRequest *mdr, CDir *dir, inodeno_t useino, u
 
   in->inode.version = 1;
   in->inode.nlink = 1;   // FIXME
+
+  memset(&in->inode.dir_layout, 0, sizeof(in->inode.dir_layout));
+  if (in->inode.is_dir())
+    in->inode.dir_layout.dl_dir_hash = g_conf.mds_default_dir_hash;
+
   if (layout)
     in->inode.layout = *layout;
   else if (in->inode.is_dir())
index 7014b11b19869b8f169808612fdeaba5865bc132..253f84642c52a988373e48866fa3715b779d19ab 100644 (file)
@@ -917,6 +917,7 @@ struct inode_t {
   bool       anchored;          // auth only?
 
   // file (data access)
+  ceph_dir_layout  dir_layout;    // [dir only]
   ceph_file_layout layout;
   uint64_t   size;        // on directory, # dentries
   uint32_t   truncate_seq;
@@ -994,7 +995,7 @@ struct inode_t {
   }
 
   void encode(bufferlist &bl) const {
-    __u8 v = 3;
+    __u8 v = 4;
     ::encode(v, bl);
 
     ::encode(ino, bl);
@@ -1008,6 +1009,7 @@ struct inode_t {
     ::encode(nlink, bl);
     ::encode(anchored, bl);
 
+    ::encode(dir_layout, bl);
     ::encode(layout, bl);
     ::encode(size, bl);
     ::encode(truncate_seq, bl);
@@ -1042,6 +1044,10 @@ struct inode_t {
     ::decode(nlink, p);
     ::decode(anchored, p);
 
+    if (v >= 4)
+      ::decode(dir_layout, p);
+    else
+      memset(&dir_layout, 0, sizeof(dir_layout));
     ::decode(layout, p);
     ::decode(size, p);
     ::decode(truncate_seq, p);