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);
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;
}
+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());
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;
}
{
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;
}