]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: keep pool placement info also in cacheable location
authorYehuda Sadeh <yehuda@hq.newdream.net>
Wed, 21 Mar 2012 00:18:18 +0000 (17:18 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Wed, 21 Mar 2012 00:20:03 +0000 (17:20 -0700)
Mirror the pools placement info, so that we can cache it.

Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index 0ed44aea34b1f61e10c98dc2a51e4952ec445d8c..3308f6341bff59ee7742701193b33b22d3e0a89a 100644 (file)
@@ -868,12 +868,33 @@ int RGWRados::store_bucket_info(RGWBucketInfo& info, map<string, bufferlist> *pa
 
 int RGWRados::select_bucket_placement(string& bucket_name, rgw_bucket& bucket)
 {
-  bufferlist header;
+  bufferlist map_bl;
   map<string, bufferlist> m;
   string pool_name;
+  bool write_map = false;
 
   rgw_obj obj(pi_buckets_rados, avail_pools);
-  int ret = omap_get_all(obj, header, m);
+
+  int ret = rgw_get_obj(NULL, pi_buckets_rados, avail_pools, map_bl);
+  if (ret < 0) {
+    goto read_omap;
+  }
+
+  try {
+    bufferlist::iterator iter = map_bl.begin();
+    ::decode(m, iter);
+  } catch (buffer::error& err) {
+    ldout(cct, 0) << "ERROR: couldn't decode avail_pools" << dendl;
+  }
+
+read_omap:
+  if (!m.size()) {
+    bufferlist header;
+    ret = omap_get_all(obj, header, m);
+
+    write_map = true;
+  }
+
   if (ret < 0 || !m.size()) {
     vector<string> names;
     names.push_back(default_storage_pool);
@@ -888,19 +909,33 @@ int RGWRados::select_bucket_placement(string& bucket_name, rgw_bucket& bucket)
     m[default_storage_pool] = bl;
   }
 
-  vector<string> v;
-  map<string, bufferlist>::iterator miter;
-  for (miter = m.begin(); miter != m.end(); ++miter) {
-    v.push_back(miter->first);
+  if (write_map) {
+    bufferlist new_bl;
+    ::encode(m, new_bl);
+    ret = put_obj_data(NULL, obj, new_bl.c_str(), -1, new_bl.length(), false);
+    if (ret < 0) {
+      ldout(cct, 0) << "WARNING: could not save avail pools map info ret=" << ret << dendl;
+    }
   }
 
-  uint32_t r;
-  ret = get_random_bytes((char *)&r, sizeof(r));
-  if (ret < 0)
-    return ret;
+  map<string, bufferlist>::iterator miter;
+  if (m.size() > 1) {
+    vector<string> v;
+    for (miter = m.begin(); miter != m.end(); ++miter) {
+      v.push_back(miter->first);
+    }
+
+    uint32_t r;
+    ret = get_random_bytes((char *)&r, sizeof(r));
+    if (ret < 0)
+      return ret;
 
-  int i = r % v.size();
-  pool_name = v[i];
+    int i = r % v.size();
+    pool_name = v[i];
+  } else {
+    miter = m.begin();
+    pool_name = miter->first;
+  }
   bucket.pool = pool_name;
   bucket.name = bucket_name;
 
@@ -908,6 +943,25 @@ int RGWRados::select_bucket_placement(string& bucket_name, rgw_bucket& bucket)
 
 }
 
+int RGWRados::update_placement_map()
+{
+  bufferlist header;
+  map<string, bufferlist> m;
+  rgw_obj obj(pi_buckets_rados, avail_pools);
+  int ret = omap_get_all(obj, header, m);
+  if (ret < 0)
+    return ret;
+
+  bufferlist new_bl;
+  ::encode(m, new_bl);
+  ret = put_obj_data(NULL, obj, new_bl.c_str(), -1, new_bl.length(), false);
+  if (ret < 0) {
+    ldout(cct, 0) << "WARNING: could not save avail pools map info ret=" << ret << dendl;
+  }
+
+  return ret;
+}
+
 int RGWRados::add_bucket_placement(std::string& new_pool)
 {
   int ret = rados->pool_lookup(new_pool.c_str());
@@ -917,6 +971,10 @@ int RGWRados::add_bucket_placement(std::string& new_pool)
   rgw_obj obj(pi_buckets_rados, avail_pools);
   bufferlist empty_bl;
   ret = omap_set(obj, new_pool, empty_bl);
+
+  // don't care about return value
+  update_placement_map();
+
   return ret;
 }
 
@@ -924,6 +982,10 @@ int RGWRados::remove_bucket_placement(std::string& old_pool)
 {
   rgw_obj obj(pi_buckets_rados, avail_pools);
   int ret = omap_del(obj, old_pool);
+
+  // don't care about return value
+  update_placement_map();
+
   return ret;
 }
 
index 98f54d5985f1d230d240210cb6f8e99c58c9ebb9..0243a2835643e1efd7bb5132c198a7a6db1db26f 100644 (file)
@@ -233,6 +233,7 @@ class RGWRados
   int delete_obj_impl(void *ctx, rgw_obj& src_obj, bool sync);
   int complete_atomic_overwrite(RGWRadosCtx *rctx, RGWObjState *state, rgw_obj& obj);
 
+  int update_placement_map();
   int select_bucket_placement(std::string& bucket_name, rgw_bucket& bucket);
   int store_bucket_info(RGWBucketInfo& info, map<string, bufferlist> *pattrs, bool exclusive);