]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: access appropriate shard on bi_get(), bi_put()
authorYehuda Sadeh <yehuda@redhat.com>
Fri, 23 Jan 2015 02:24:53 +0000 (18:24 -0800)
committerYehuda Sadeh <yehuda@redhat.com>
Fri, 23 Jan 2015 19:29:26 +0000 (11:29 -0800)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_admin.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index e9a14e01d9c12f366d8295767f3852e9d8ea1f64..092eac6a19cdb7928110d3561edaaaad637ed5ca 100644 (file)
@@ -680,6 +680,31 @@ static int read_decode_json(const string& infile, T& t)
   return 0;
 }
     
+template <class T, class K>
+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;
index 6c92a09ce71ef43899c13cc80586de550f4e4e81..4aea14b993bf9ecea931d77fa8764875128609c9 100644 (file)
@@ -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<rgw_cls_bi_entry> *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;
 
index 08cbd32cab13011bb5b2dc113116f476d5d5ad0c..5a8acb6b466b8cd1b9773907bc0661f72fca225d 100644 (file)
@@ -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<rgw_cls_bi_entry> *entries, bool *is_truncated);