From: Yehuda Sadeh Date: Wed, 21 Mar 2012 00:18:18 +0000 (-0700) Subject: rgw: keep pool placement info also in cacheable location X-Git-Tag: v0.45~62 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4760536fe573c702bac8fb1d51213d76059e32dc;p=ceph.git rgw: keep pool placement info also in cacheable location Mirror the pools placement info, so that we can cache it. Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 0ed44aea34b1..3308f6341bff 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -868,12 +868,33 @@ int RGWRados::store_bucket_info(RGWBucketInfo& info, map *pa int RGWRados::select_bucket_placement(string& bucket_name, rgw_bucket& bucket) { - bufferlist header; + bufferlist map_bl; map 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 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 v; - map::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::iterator miter; + if (m.size() > 1) { + vector 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 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; } diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 98f54d5985f1..0243a2835643 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -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 *pattrs, bool exclusive);