From: Matt Benjamin Date: Wed, 5 Jun 2019 11:25:35 +0000 (-0400) Subject: rgw_file: include tenant in hashes of object X-Git-Tag: v14.2.3~142^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=38dcbb87f71ddf88a3e1037a9089d968aaabaaca;p=ceph.git rgw_file: include tenant in hashes of object 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 (cherry picked from commit 8e0fd5fbfa7c770f6b668e79b772179946027bce) --- diff --git a/src/rgw/rgw_file.cc b/src/rgw/rgw_file.cc index 3883955cc48..00c197d07ff 100644 --- a/src/rgw/rgw_file.cc +++ b/src/rgw/rgw_file.cc @@ -1109,13 +1109,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); } } diff --git a/src/rgw/rgw_file.h b/src/rgw/rgw_file.h index 4b812b2dde8..bb5e617c6d1 100644 --- a/src/rgw/rgw_file.h +++ b/src/rgw/rgw_file.h @@ -111,18 +111,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 {