From: Yehuda Sadeh Date: Fri, 23 Jan 2015 02:24:53 +0000 (-0800) Subject: rgw: access appropriate shard on bi_get(), bi_put() X-Git-Tag: v0.93~156^2~16 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=313d6a5a687705372a10edbeb6aabdcb83ae3c08;p=ceph.git rgw: access appropriate shard on bi_get(), bi_put() Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index e9a14e01d9c..092eac6a19c 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -680,6 +680,31 @@ static int read_decode_json(const string& infile, T& t) return 0; } +template +static int read_decode_json(const string& infile, T& t, K *k) +{ + bufferlist bl; + int ret = read_input(infile, bl); + if (ret < 0) { + cerr << "ERROR: failed to read input: " << cpp_strerror(-ret) << std::endl; + return ret; + } + JSONParser p; + ret = p.parse(bl.c_str(), bl.length()); + if (ret < 0) { + cout << "failed to parse JSON" << std::endl; + return ret; + } + + try { + t.decode_json(&p, k); + } catch (JSONDecoder::err& e) { + cout << "failed to decode JSON input: " << e.message << std::endl; + return -EINVAL; + } + return 0; +} + static int parse_date_str(const string& date_str, utime_t& ut) { uint64_t epoch = 0; @@ -2030,12 +2055,16 @@ next: } rgw_cls_bi_entry entry; - ret = read_decode_json(infile, entry); + cls_rgw_obj_key key; + ret = read_decode_json(infile, entry, &key); if (ret < 0) { return 1; } - ret = store->bi_put(bucket, entry); + rgw_obj obj(bucket, key.name); + obj.set_instance(key.instance); + + ret = store->bi_put(bucket, obj, entry); if (ret < 0) { cerr << "ERROR: bi_put(): " << cpp_strerror(-ret) << std::endl; return -ret; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 6c92a09ce71..4aea14b993b 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -7234,30 +7234,32 @@ int RGWRados::bi_get_instance(rgw_obj& obj, rgw_bucket_dir_entry *dirent) int RGWRados::bi_get(rgw_bucket& bucket, rgw_obj& obj, BIIndexType index_type, rgw_cls_bi_entry *entry) { - librados::IoCtx index_ctx; - string oid; - int r = open_bucket_index(bucket, index_ctx, oid); - if (r < 0) - return r; + BucketShard bs(this); + int ret = bs.init(bucket, obj); + if (ret < 0) { + ldout(cct, 5) << "bs.init() returned ret=" << ret << dendl; + return ret; + } cls_rgw_obj_key key(obj.get_index_key_name(), obj.get_instance()); - int ret = cls_rgw_bi_get(index_ctx, oid, index_type, key, entry); + ret = cls_rgw_bi_get(bs.index_ctx, bs.bucket_obj, index_type, key, entry); if (ret < 0) return ret; return 0; } -int RGWRados::bi_put(rgw_bucket& bucket, rgw_cls_bi_entry& entry) +int RGWRados::bi_put(rgw_bucket& bucket, rgw_obj& obj, rgw_cls_bi_entry& entry) { - librados::IoCtx index_ctx; - string oid; - int r = open_bucket_index(bucket, index_ctx, oid); - if (r < 0) - return r; + BucketShard bs(this); + int ret = bs.init(bucket, obj); + if (ret < 0) { + ldout(cct, 5) << "bs.init() returned ret=" << ret << dendl; + return ret; + } - int ret = cls_rgw_bi_put(index_ctx, oid, entry); + ret = cls_rgw_bi_put(bs.index_ctx, bs.bucket_obj, entry); if (ret < 0) return ret; @@ -7266,13 +7268,15 @@ int RGWRados::bi_put(rgw_bucket& bucket, rgw_cls_bi_entry& entry) int RGWRados::bi_list(rgw_bucket& bucket, const string& obj_name, const string& marker, uint32_t max, list *entries, bool *is_truncated) { - librados::IoCtx index_ctx; - string oid; - int r = open_bucket_index(bucket, index_ctx, oid); - if (r < 0) - return r; + rgw_obj obj(bucket, obj_name); + BucketShard bs(this); + int ret = bs.init(bucket, obj); + if (ret < 0) { + ldout(cct, 5) << "bs.init() returned ret=" << ret << dendl; + return ret; + } - int ret = cls_rgw_bi_list(index_ctx, oid, obj_name, marker, max, entries, is_truncated); + ret = cls_rgw_bi_list(bs.index_ctx, bs.bucket_obj, obj_name, marker, max, entries, is_truncated); if (ret < 0) return ret; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 08cbd32cab1..5a8acb6b466 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -1938,7 +1938,7 @@ public: int bi_get_instance(rgw_obj& obj, rgw_bucket_dir_entry *dirent); int bi_get(rgw_bucket& bucket, rgw_obj& obj, BIIndexType index_type, rgw_cls_bi_entry *entry); - int bi_put(rgw_bucket& bucket, rgw_cls_bi_entry& entry); + int bi_put(rgw_bucket& bucket, rgw_obj& obj, rgw_cls_bi_entry& entry); int bi_list(rgw_bucket& bucket, const string& obj_name, const string& marker, uint32_t max, list *entries, bool *is_truncated);