]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw_file: include tenant in hashes of object
authorMatt Benjamin <mbenjamin@redhat.com>
Wed, 5 Jun 2019 11:25:35 +0000 (07:25 -0400)
committerNathan Cutler <ncutler@suse.com>
Wed, 24 Jul 2019 14:39:08 +0000 (16:39 +0200)
Because bucket names are taken as object names in the top
of an export.  Make hashing by tenant general to avoid disjoint
hashing of bucket.

Fixes: http://tracker.ceph.com/issues/40118
Signed-off-by: Matt Benjamin <mbenjamin@redhat.com>
(cherry picked from commit 8e0fd5fbfa7c770f6b668e79b772179946027bce)

src/rgw/rgw_file.cc
src/rgw/rgw_file.h

index b1341675af39ba63c8d63789c482286ef1792bd4..b2e20c4c4980ce69fdc53348e6652c4601c0874c 100644 (file)
@@ -983,13 +983,13 @@ namespace rgw {
 
   fh_key RGWFileHandle::make_fhk(const std::string& name)
   {
-    if (depth <= 1) {
-      std::string tenanted_name =
-       get_fs()->get_user()->user_id.to_str() + ":" + name;
-      return fh_key(fhk.fh_hk.object, tenanted_name.c_str());
+    std::string tenant = get_fs()->get_user()->user_id.to_str();
+    if (depth == 0) {
+      /* S3 bucket -- assert mount-at-bucket case reaches here */
+      return fh_key(name, name, tenant);
     } else {
       std::string key_name = make_key_name(name.c_str());
-      return fh_key(fhk.fh_hk.bucket, key_name.c_str());
+      return fh_key(fhk.fh_hk.bucket, key_name.c_str(), tenant);
     }
   }
 
index d60fe03acc9dbaba614619c3ebe20ee784c3fcb7..025854c681479f0c4a668462c9f45658832f8dac 100644 (file)
@@ -109,18 +109,20 @@ namespace rgw {
       fh_hk.object = ok;
     }
 
-    fh_key(const uint64_t bk, const char *_o)
+    fh_key(const uint64_t bk, const char *_o, const std::string& _t)
       : version(0) {
       fh_hk.bucket = bk;
-      fh_hk.object = XXH64(_o, ::strlen(_o), seed);
+      std::string to = _t + ":" + _o;
+      fh_hk.object = XXH64(to.c_str(), to.length(), seed);
     }
 
     fh_key(const std::string& _b, const std::string& _o,
           const std::string& _t /* tenant */)
       : version(0) {
       std::string tb = _t + ":" + _b;
-      fh_hk.bucket = XXH64(tb.c_str(), _o.length(), seed);
-      fh_hk.object = XXH64(_o.c_str(), _o.length(), seed);
+      std::string to = _t + ":" + _o;
+      fh_hk.bucket = XXH64(tb.c_str(), tb.length(), seed);
+      fh_hk.object = XXH64(to.c_str(), to.length(), seed);
     }
 
     void encode(buffer::list& bl) const {