using namespace std;
+#include "common/ceph_json.h"
+
#include "common/config.h"
#include "common/ceph_argparse.h"
#include "common/Formatter.h"
OPT_GC_LIST,
OPT_GC_PROCESS,
OPT_ZONE_INFO,
+ OPT_ZONE_SET,
OPT_CAPS_ADD,
OPT_CAPS_RM,
};
} else if (strcmp(prev_cmd, "zone") == 0) {
if (strcmp(cmd, "info") == 0)
return OPT_ZONE_INFO;
+ if (strcmp(cmd, "set") == 0)
+ return OPT_ZONE_SET;
} else if (strcmp(prev_cmd, "gc") == 0) {
if (strcmp(cmd, "list") == 0)
return OPT_GC_LIST;
obj.bucket = bucket;
int max = 1000;
- ret = rgw_get_obj(store, NULL, store->params.domain_root, bucket.name, bl, NULL);
+ ret = rgw_get_obj(store, NULL, store->zone.domain_root, bucket.name, bl, NULL);
bufferlist::iterator iter = bl.begin();
try {
return rgw_obj::translate_raw_obj_to_obj_in_ns(obj, ns);
}
+static int read_input(const string& infile, bufferlist& bl)
+{
+ int fd = 0;
+ if (infile.size()) {
+ fd = open(infile.c_str(), O_RDONLY);
+ if (fd < 0) {
+ int err = -errno;
+ cerr << "error reading input file " << infile << std::endl;
+ return err;
+ }
+ }
+
+#define READ_CHUNK 8196
+ int r;
+
+ do {
+ char buf[READ_CHUNK];
+
+ r = read(fd, buf, READ_CHUNK);
+ if (r < 0) {
+ int err = -errno;
+ cerr << "error while reading input" << std::endl;
+ return err;
+ }
+ bl.append(buf, r);
+ } while (r > 0);
+
+ if (infile.size()) {
+ close(fd);
+ }
+
+ return 0;
+}
+
+template <class T>
+static int read_decode_json(const string& infile, T& t)
+{
+ 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);
+ } catch (JSONDecoder::err& e) {
+ cout << "failed to decode JSON input: " << e.message << std::endl;
+ return -EINVAL;
+ }
+ return 0;
+}
+
class StoreDestructor {
RGWRados *store;
public:
map<string, bool> categories;
string caps;
int check_objects = false;
+ string infile;
std::string val;
std::ostringstream errs;
// do nothing
} else if (ceph_argparse_witharg(args, i, &val, "--caps", (char*)NULL)) {
caps = val;
+ } else if (ceph_argparse_witharg(args, i, &val, "-i", "--infile", (char*)NULL)) {
+ infile = val;
} else {
++i;
}
}
if (opt_cmd == OPT_ZONE_INFO) {
- store->params.dump(formatter);
+ store->zone.dump(formatter);
+ formatter->flush(cout);
+ }
+
+ if (opt_cmd == OPT_ZONE_SET) {
+ RGWZoneParams zone;
+ zone.init_default();
+ int ret = read_decode_json(infile, zone);
+ if (ret < 0) {
+ return 1;
+ }
+
+ ret = zone.store_info(g_ceph_context, store);
+ if (ret < 0) {
+ cerr << "ERROR: couldn't store zone info: " << cpp_strerror(-ret) << std::endl;
+ return 1;
+ }
+
+ zone.dump(formatter);
formatter->flush(cout);
}
dst_bucket = src_bucket;
dst_obj = src_obj;
} else {
- dst_bucket = T::params.domain_root;
+ dst_bucket = T::zone.domain_root;
dst_obj = src_bucket.name;
}
}
string oid = render_log_object_name(s->cct->_conf->rgw_log_object_name, &bdt,
s->bucket.bucket_id, entry.bucket);
- rgw_obj obj(store->params.log_pool, oid);
+ rgw_obj obj(store->zone.log_pool, oid);
ret = store->append_async(obj, bl.length(), bl);
if (ret == -ENOENT) {
- ret = store->create_pool(store->params.log_pool);
+ ret = store->create_pool(store->zone.log_pool);
if (ret < 0)
goto done;
// retry
int rgw_log_intent(RGWRados *store, rgw_obj& obj, RGWIntentEvent intent, const utime_t& timestamp, bool utc)
{
- rgw_bucket intent_log_bucket(store->params.intent_log_pool);
+ rgw_bucket intent_log_bucket(store->zone.intent_log_pool);
rgw_intent_log_entry entry;
entry.obj = obj;
bufferlist aclbl;
bool existed;
int r;
- rgw_obj obj(store->params.domain_root, s->bucket_name_str);
+ rgw_obj obj(store->zone.domain_root, s->bucket_name_str);
ret = get_params();
if (ret < 0)
#include <stdlib.h>
#include <sys/types.h>
+#include "common/ceph_json.h"
+
#include "common/errno.h"
#include "common/Formatter.h"
#include "common/Throttle.h"
#define RGW_USAGE_OBJ_PREFIX "usage."
-#define RGW_DEFAULT_zone_ROOT_POOL ".rgw.root"
+#define RGW_DEFAULT_ZONE_ROOT_POOL ".rgw.root"
#define dout_subsys ceph_subsys_rgw
-void RGWRadosParams::init_default()
+void RGWZoneParams::init_default()
{
domain_root = ".rgw";
control_pool = ".rgw.control";
user_uid_pool = ".users.uid";
}
-void RGWRadosParams::dump(Formatter *f) const
+void RGWZoneParams::dump(Formatter *f) const
{
f->open_object_section("zone");
f->dump_string("domain_root", domain_root.pool);
f->close_section();
}
-int RGWRadosParams::init(CephContext *cct, RGWRados *store)
+static void decode_json(const char *field, rgw_bucket& bucket, JSONObj *obj)
+{
+ string pool;
+ JSONDecoder::decode_json(field, pool, obj);
+ if (pool[0] != '.') {
+ pool = string(".") + pool;
+ }
+ bucket = rgw_bucket(pool.c_str());
+}
+
+void RGWZoneParams::decode_json(JSONObj *obj)
+{
+ ::decode_json("domain_root", domain_root, obj);
+ ::decode_json("control_pool", control_pool, obj);
+ ::decode_json("gc_pool", gc_pool, obj);
+ ::decode_json("log_pool", log_pool, obj);
+ ::decode_json("intent_log_pool", intent_log_pool, obj);
+ ::decode_json("usage_log_pool", usage_log_pool, obj);
+ ::decode_json("user_keys_pool", user_keys_pool, obj);
+ ::decode_json("user_email_pool", user_email_pool, obj);
+ ::decode_json("user_swift_pool", user_swift_pool, obj);
+ ::decode_json("user_uid_pool ", user_uid_pool, obj);
+}
+
+int RGWZoneParams::init(CephContext *cct, RGWRados *store)
{
string pool_name = cct->_conf->rgw_zone_root_pool;
if (pool_name.empty())
- pool_name = RGW_DEFAULT_zone_ROOT_POOL;
+ pool_name = RGW_DEFAULT_ZONE_ROOT_POOL;
rgw_bucket pool(pool_name.c_str());
bufferlist bl;
return 0;
}
+int RGWZoneParams::store_info(CephContext *cct, RGWRados *store)
+{
+ string pool_name = cct->_conf->rgw_zone_root_pool;
+ if (pool_name.empty())
+ pool_name = RGW_DEFAULT_ZONE_ROOT_POOL;
+
+ rgw_bucket pool(pool_name.c_str());
+
+ bufferlist bl;
+ ::encode(*this, bl);
+ int ret = rgw_put_system_obj(store, pool, zone_info_oid, bl.c_str(), bl.length(), false, NULL);
+
+ return ret;
+}
+
void RGWObjManifest::append(RGWObjManifest& m)
{
map<uint64_t, RGWObjManifestPart>::iterator iter;
if (obj.object.size()) {
return &objs_state[obj];
} else {
- rgw_obj new_obj(store->params.domain_root, obj.bucket.name);
+ rgw_obj new_obj(store->zone.domain_root, obj.bucket.name);
return &objs_state[new_obj];
}
}
if (obj.object.size()) {
objs_state[obj].is_atomic = true;
} else {
- rgw_obj new_obj(store->params.domain_root, obj.bucket.name);
+ rgw_obj new_obj(store->zone.domain_root, obj.bucket.name);
objs_state[new_obj].is_atomic = true;
}
}
if (obj.object.size()) {
objs_state[obj].prefetch_data = true;
} else {
- rgw_obj new_obj(store->params.domain_root, obj.bucket.name);
+ rgw_obj new_obj(store->zone.domain_root, obj.bucket.name);
objs_state[new_obj].prefetch_data = true;
}
}
if (ret < 0)
return ret;
- params.init(cct, this);
+ zone.init(cct, this);
ret = open_root_pool_ctx();
if (ret < 0)
*/
int RGWRados::open_root_pool_ctx()
{
- const string& pool = params.domain_root.name;
+ const string& pool = zone.domain_root.name;
const char *pool_str = pool.c_str();
int r = rados->ioctx_create(pool_str, root_pool_ctx);
if (r == -ENOENT) {
int RGWRados::open_gc_pool_ctx()
{
- const char *gc_pool = params.gc_pool.name.c_str();
+ const char *gc_pool = zone.gc_pool.name.c_str();
int r = rados->ioctx_create(gc_pool, gc_pool_ctx);
if (r == -ENOENT) {
r = rados->pool_create(gc_pool);
int RGWRados::init_watch()
{
- const char *control_pool = params.control_pool.name.c_str();
+ const char *control_pool = zone.control_pool.name.c_str();
int r = rados->ioctx_create(control_pool, control_pool_ctx);
if (r == -ENOENT) {
r = rados->pool_create(control_pool);
int RGWRados::log_list_init(const string& prefix, RGWAccessHandle *handle)
{
log_list_state *state = new log_list_state;
- const char *log_pool = params.log_pool.name.c_str();
+ const char *log_pool = zone.log_pool.name.c_str();
int r = rados->ioctx_create(log_pool, state->io_ctx);
if (r < 0) {
delete state;
int RGWRados::log_remove(const string& name)
{
librados::IoCtx io_ctx;
- const char *log_pool = params.log_pool.name.c_str();
+ const char *log_pool = zone.log_pool.name.c_str();
int r = rados->ioctx_create(log_pool, io_ctx);
if (r < 0)
return r;
int RGWRados::log_show_init(const string& name, RGWAccessHandle *handle)
{
log_show_state *state = new log_show_state;
- const char *log_pool = params.log_pool.name.c_str();
+ const char *log_pool = zone.log_pool.name.c_str();
int r = rados->ioctx_create(log_pool, state->io_ctx);
if (r < 0) {
delete state;
uint32_t nop = 0;
::encode(nop, bl);
- const string& pool = params.domain_root.name;
+ const string& pool = zone.domain_root.name;
const char *pool_str = pool.c_str();
librados::IoCtx id_io_ctx;
r = rados->ioctx_create(pool_str, id_io_ctx);
bufferlist bl;
::encode(info, bl);
- int ret = rgw_put_system_obj(this, params.domain_root, info.bucket.name, bl.c_str(), bl.length(), exclusive, pattrs);
+ int ret = rgw_put_system_obj(this, zone.domain_root, info.bucket.name, bl.c_str(), bl.length(), exclusive, pattrs);
if (ret < 0)
return ret;
string pool_name;
bool write_map = false;
- rgw_obj obj(params.domain_root, avail_pools);
+ rgw_obj obj(zone.domain_root, avail_pools);
- int ret = rgw_get_obj(this, NULL, params.domain_root, avail_pools, map_bl);
+ int ret = rgw_get_obj(this, NULL, zone.domain_root, avail_pools, map_bl);
if (ret < 0) {
goto read_omap;
}
{
bufferlist header;
map<string, bufferlist> m;
- rgw_obj obj(params.domain_root, avail_pools);
+ rgw_obj obj(zone.domain_root, avail_pools);
int ret = omap_get_all(obj, header, m);
if (ret < 0)
return ret;
if (ret < 0) // DNE, or something
return ret;
- rgw_obj obj(params.domain_root, avail_pools);
+ rgw_obj obj(zone.domain_root, avail_pools);
bufferlist empty_bl;
ret = omap_set(obj, new_pool, empty_bl);
int RGWRados::remove_bucket_placement(std::string& old_pool)
{
- rgw_obj obj(params.domain_root, avail_pools);
+ rgw_obj obj(zone.domain_root, avail_pools);
int ret = omap_del(obj, old_pool);
// don't care about return value
bufferlist header;
map<string, bufferlist> m;
- rgw_obj obj(params.domain_root, avail_pools);
+ rgw_obj obj(zone.domain_root, avail_pools);
int ret = omap_get_all(obj, header, m);
if (ret < 0)
return ret;
}
} while (is_truncated);
- rgw_obj obj(params.domain_root, bucket.name);
+ rgw_obj obj(zone.domain_root, bucket.name);
r = delete_obj(NULL, obj);
if (r < 0)
return r;
if (actual_obj.size() == 0) {
actual_obj = bucket.name;
- actual_bucket = params.domain_root;
+ actual_bucket = zone.domain_root;
}
int r = open_bucket_ctx(actual_bucket, io_ctx);
if (actual_obj.size() == 0) {
actual_obj = bucket.name;
- actual_bucket = params.domain_root;
+ actual_bucket = zone.domain_root;
}
int r = open_bucket_ctx(actual_bucket, io_ctx);
if (actual_obj.size() == 0) {
actual_obj = bucket.name;
- actual_bucket = params.domain_root;
+ actual_bucket = zone.domain_root;
}
int r = open_bucket_ctx(actual_bucket, io_ctx);
{
bufferlist bl;
- int ret = rgw_get_obj(this, ctx, params.domain_root, bucket_name, bl, pattrs);
+ int ret = rgw_get_obj(this, ctx, zone.domain_root, bucket_name, bl, pattrs);
if (ret < 0) {
if (ret != -ENOENT)
return ret;
::encode(info, bl);
- int ret = rgw_put_system_obj(this, params.domain_root, bucket_name, bl.c_str(), bl.length(), exclusive, pattrs);
+ int ret = rgw_put_system_obj(this, zone.domain_root, bucket_name, bl.c_str(), bl.length(), exclusive, pattrs);
return ret;
}
{
librados::IoCtx io_ctx;
- const char *usage_log_pool = params.usage_log_pool.name.c_str();
+ const char *usage_log_pool = zone.usage_log_pool.name.c_str();
int r = rados->ioctx_create(usage_log_pool, io_ctx);
if (r == -ENOENT) {
rgw_bucket pool(usage_log_pool);
*is_truncated = false;
- const char *usage_log_pool = params.usage_log_pool.name.c_str();
+ const char *usage_log_pool = zone.usage_log_pool.name.c_str();
int r = rados->ioctx_create(usage_log_pool, io_ctx);
if (r < 0)
return r;
{
librados::IoCtx io_ctx;
- const char *usage_log_pool = params.usage_log_pool.name.c_str();
+ const char *usage_log_pool = zone.usage_log_pool.name.c_str();
int r = rados->ioctx_create(usage_log_pool, io_ctx);
if (r < 0)
return r;
bool is_truncated;
IntentLogNameFilter filter(date.c_str(), &tm);
RGWPoolIterCtx iter_ctx;
- int r = pool_iterate_begin(params.intent_log_pool, iter_ctx);
+ int r = pool_iterate_begin(zone.intent_log_pool, iter_ctx);
if (r < 0) {
cerr << "failed to list objects" << std::endl;
return r;
}
vector<RGWObjEnt>::iterator iter;
for (iter = objs.begin(); iter != objs.end(); ++iter) {
- process_intent_log(params.intent_log_pool, (*iter).name, epoch, I_DEL_OBJ | I_DEL_DIR, true);
+ process_intent_log(zone.intent_log_pool, (*iter).name, epoch, I_DEL_OBJ | I_DEL_DIR, true);
}
} while (is_truncated);
librados::ObjectIterator iter;
};
-struct RGWRadosParams {
+struct RGWZoneParams {
rgw_bucket domain_root;
rgw_bucket control_pool;
rgw_bucket gc_pool;
int init(CephContext *cct, RGWRados *store);
void init_default();
+ int store_info(CephContext *cct, RGWRados *store);
void encode(bufferlist& bl) const {
ENCODE_START(1, 1, bl);
DECODE_FINISH(bl);
}
void dump(Formatter *f) const;
+ void decode_json(JSONObj *obj);
};
-WRITE_CLASS_ENCODER(RGWRadosParams);
+WRITE_CLASS_ENCODER(RGWZoneParams);
class RGWRados
{
cct(NULL), rados(NULL),
pools_initialized(false) {}
- RGWRadosParams params;
+ RGWZoneParams zone;
virtual ~RGWRados() {
if (rados) {
::encode(ui, data_bl);
::encode(info, data_bl);
- ret = rgw_put_system_obj(store, store->params.user_uid_pool, info.user_id, data_bl.c_str(), data_bl.length(), exclusive);
+ ret = rgw_put_system_obj(store, store->zone.user_uid_pool, info.user_id, data_bl.c_str(), data_bl.length(), exclusive);
if (ret < 0)
return ret;
if (info.user_email.size()) {
if (!old_info ||
old_info->user_email.compare(info.user_email) != 0) { /* only if new index changed */
- ret = rgw_put_system_obj(store, store->params.user_email_pool, info.user_email, link_bl.c_str(), link_bl.length(), exclusive);
+ ret = rgw_put_system_obj(store, store->zone.user_email_pool, info.user_email, link_bl.c_str(), link_bl.length(), exclusive);
if (ret < 0)
return ret;
}
if (old_info && old_info->access_keys.count(iter->first) != 0)
continue;
- ret = rgw_put_system_obj(store, store->params.user_keys_pool, k.id, link_bl.c_str(), link_bl.length(), exclusive);
+ ret = rgw_put_system_obj(store, store->zone.user_keys_pool, k.id, link_bl.c_str(), link_bl.length(), exclusive);
if (ret < 0)
return ret;
}
if (old_info && old_info->swift_keys.count(siter->first) != 0)
continue;
- ret = rgw_put_system_obj(store, store->params.user_swift_pool, k.id, link_bl.c_str(), link_bl.length(), exclusive);
+ ret = rgw_put_system_obj(store, store->zone.user_swift_pool, k.id, link_bl.c_str(), link_bl.length(), exclusive);
if (ret < 0)
return ret;
}
bufferlist bl;
RGWUID user_id;
- int ret = rgw_get_obj(store, NULL, store->params.user_uid_pool, uid, bl);
+ int ret = rgw_get_obj(store, NULL, store->zone.user_uid_pool, uid, bl);
if (ret < 0)
return ret;
*/
int rgw_get_user_info_by_email(RGWRados *store, string& email, RGWUserInfo& info)
{
- return rgw_get_user_info_from_index(store, email, store->params.user_email_pool, info);
+ return rgw_get_user_info_from_index(store, email, store->zone.user_email_pool, info);
}
/**
*/
extern int rgw_get_user_info_by_swift(RGWRados *store, string& swift_name, RGWUserInfo& info)
{
- return rgw_get_user_info_from_index(store, swift_name, store->params.user_swift_pool, info);
+ return rgw_get_user_info_from_index(store, swift_name, store->zone.user_swift_pool, info);
}
/**
*/
extern int rgw_get_user_info_by_access_key(RGWRados *store, string& access_key, RGWUserInfo& info)
{
- return rgw_get_user_info_from_index(store, access_key, store->params.user_keys_pool, info);
+ return rgw_get_user_info_from_index(store, access_key, store->zone.user_keys_pool, info);
}
static void get_buckets_obj(string& user_id, string& buckets_obj_id)
static int rgw_read_buckets_from_attr(RGWRados *store, string& user_id, RGWUserBuckets& buckets)
{
bufferlist bl;
- rgw_obj obj(store->params.user_uid_pool, user_id);
+ rgw_obj obj(store->zone.user_uid_pool, user_id);
int ret = store->get_attr(NULL, obj, RGW_ATTR_BUCKETS, bl);
if (ret)
return ret;
string buckets_obj_id;
get_buckets_obj(user_id, buckets_obj_id);
bufferlist bl;
- rgw_obj obj(store->params.user_uid_pool, buckets_obj_id);
+ rgw_obj obj(store->zone.user_uid_pool, buckets_obj_id);
bufferlist header;
map<string,bufferlist> m;
bufferlist bl;
buckets.encode(bl);
- rgw_obj obj(store->params.user_uid_pool, user_id);
+ rgw_obj obj(store->zone.user_uid_pool, user_id);
int ret = store->set_attr(NULL, obj, RGW_ATTR_BUCKETS, bl);
string buckets_obj_id;
get_buckets_obj(user_id, buckets_obj_id);
- rgw_obj obj(store->params.user_uid_pool, buckets_obj_id);
+ rgw_obj obj(store->zone.user_uid_pool, buckets_obj_id);
ret = store->omap_set(obj, bucket_name, bl);
if (ret < 0) {
ldout(store->ctx(), 0) << "ERROR: error adding bucket to directory: "
string buckets_obj_id;
get_buckets_obj(user_id, buckets_obj_id);
- rgw_obj obj(store->params.user_uid_pool, buckets_obj_id);
+ rgw_obj obj(store->zone.user_uid_pool, buckets_obj_id);
ret = store->omap_del(obj, bucket.name);
if (ret < 0) {
ldout(store->ctx(), 0) << "ERROR: error removing bucket from directory: "
int rgw_remove_key_index(RGWRados *store, RGWAccessKey& access_key)
{
- rgw_obj obj(store->params.user_keys_pool, access_key.id);
+ rgw_obj obj(store->zone.user_keys_pool, access_key.id);
int ret = store->delete_obj(NULL, obj);
return ret;
}
int rgw_remove_uid_index(RGWRados *store, string& uid)
{
- rgw_obj obj(store->params.user_uid_pool, uid);
+ rgw_obj obj(store->zone.user_uid_pool, uid);
int ret = store->delete_obj(NULL, obj);
return ret;
}
int rgw_remove_email_index(RGWRados *store, string& email)
{
- rgw_obj obj(store->params.user_email_pool, email);
+ rgw_obj obj(store->zone.user_email_pool, email);
int ret = store->delete_obj(NULL, obj);
return ret;
}
int rgw_remove_swift_name_index(RGWRados *store, string& swift_name)
{
- rgw_obj obj(store->params.user_swift_pool, swift_name);
+ rgw_obj obj(store->zone.user_swift_pool, swift_name);
int ret = store->delete_obj(NULL, obj);
return ret;
}
}
}
- rgw_obj email_obj(store->params.user_email_pool, info.user_email);
+ rgw_obj email_obj(store->zone.user_email_pool, info.user_email);
ldout(store->ctx(), 10) << "removing email index: " << info.user_email << dendl;
ret = store->delete_obj(NULL, email_obj);
if (ret < 0 && ret != -ENOENT) {
string buckets_obj_id;
get_buckets_obj(info.user_id, buckets_obj_id);
- rgw_obj uid_bucks(store->params.user_uid_pool, buckets_obj_id);
+ rgw_obj uid_bucks(store->zone.user_uid_pool, buckets_obj_id);
ldout(store->ctx(), 10) << "removing user buckets index" << dendl;
ret = store->delete_obj(NULL, uid_bucks);
if (ret < 0 && ret != -ENOENT) {
return ret;
}
- rgw_obj uid_obj(store->params.user_uid_pool, info.user_id);
+ rgw_obj uid_obj(store->zone.user_uid_pool, info.user_id);
ldout(store->ctx(), 10) << "removing user index: " << info.user_id << dendl;
ret = store->delete_obj(NULL, uid_obj);
if (ret < 0 && ret != -ENOENT) {