]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librgw: fix and unify full-name assembly and hashing
authorMatt Benjamin <mbenjamin@redhat.com>
Fri, 11 Dec 2015 16:39:00 +0000 (11:39 -0500)
committerMatt Benjamin <mbenjamin@redhat.com>
Fri, 12 Feb 2016 17:06:35 +0000 (12:06 -0500)
Signed-off-by: Matt Benjamin <mbenjamin@redhat.com>
src/rgw/rgw_file.h

index 8a55dcd9d622f427c3ac6e753634d491d4335a2b..de20e8c55f464cd8abb0b5baa0d05606f4a7c40f 100644 (file)
@@ -299,28 +299,20 @@ namespace rgw {
       return path;
     }
 
+    inline std::string make_key_name(const char *name) {
+      std::string key_name{full_object_name()};
+      if (key_name.length() > 0)
+       key_name += "/";
+      key_name += name;
+      return key_name;
+    }
+
     fh_key make_fhk(const std::string& name) {
       if (depth <= 1)
        return fh_key(fhk.fh_hk.object, name.c_str());
       else {
-       std::vector<const std::string*> segments;
-       RGWFileHandle* tfh = this;
-       while (tfh && !tfh->is_bucket()) {
-          segments.push_back(&tfh->object_name());
-          tfh = tfh->parent.get();
-       }
-       /* hash path */
-       XXH64_state_t hs;
-       XXH64_reset(&hs, fh_key::seed);
-       bool first = true;
-       for (auto& s : boost::adaptors::reverse(segments)) {
-         if (! first)
-           (void) XXH64_update(&hs, (void*) "/", 1);
-         else
-           first = false;
-         (void) XXH64_update(&hs, s->c_str(), s->size());
-       }
-       return fh_key(fhk.fh_hk.object, XXH64_digest(&hs));
+       std::string key_name = make_key_name(name.c_str());
+       return fh_key(fhk.fh_hk.object, key_name.c_str());
       }
     }
 
@@ -523,9 +515,9 @@ namespace rgw {
 
       using std::get;
 
-      std::string sname(name);
       RGWFileHandle::FHCache::Latch lat;
-      fh_key fhk = parent->make_fhk(sname);
+      std::string key_name{parent->make_key_name(name)};
+      fh_key fhk = parent->make_fhk(key_name);
       LookupFHResult fhr { nullptr, RGWFileHandle::FLAG_NONE };
 
       RGWFileHandle* fh =
@@ -535,7 +527,8 @@ namespace rgw {
       /* LATCHED */
       if (! fh) {
        if (cflags & RGWFileHandle::FLAG_CREATE) {
-         fh = new RGWFileHandle(this, get_inst(), parent, fhk, sname, cflags);
+         fh = new RGWFileHandle(this, get_inst(), parent, fhk, key_name,
+                                cflags);
          intrusive_ptr_add_ref(fh); /* sentinel ref */
          fh_cache.insert_latched(fh, lat,
                                  RGWFileHandle::FHCache::FLAG_NONE);