int bucket_stats(rgw_bucket& bucket, Formatter *formatter)
{
RGWBucketInfo bucket_info;
- int r = store->get_bucket_info(NULL, bucket.name, bucket_info);
+ int r = store->get_bucket_info(NULL, bucket.name, bucket_info, NULL);
if (r < 0)
return r;
{
if (!bucket_name.empty()) {
RGWBucketInfo bucket_info;
- int r = store->get_bucket_info(NULL, bucket_name, bucket_info);
+ int r = store->get_bucket_info(NULL, bucket_name, bucket_info, NULL);
if (r < 0) {
cerr << "could not get bucket info for bucket=" << bucket_name << std::endl;
return r;
return ret;
}
+int rgw_bucket_store_info(RGWRados *store, string& bucket_name, bufferlist& bl, bool exclusive,
+ map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker) {
+ return store->meta_mgr->put_entry(bucket_meta_handler, bucket_name, bl, exclusive, objv_tracker, pattrs);
+}
+
+
int RGWBucket::create_bucket(string bucket_str, string& user_id, string& display_name)
{
RGWAccessControlPolicy policy, old_policy;
policy.create_default(user_id, display_name);
policy.encode(aclbl);
- ret = store->get_bucket_info(NULL, bucket_str, bucket_info);
+ RGWObjVersionTracker objv_tracker;
+
+ ret = store->get_bucket_info(NULL, bucket_str, bucket_info, &objv_tracker);
if (ret < 0)
return ret;
rgw_bucket& bucket = bucket_ent.bucket;
RGWBucketInfo bucket_info;
- int r = store->get_bucket_info(NULL, bucket.name, bucket_info);
+ RGWObjVersionTracker objv_tracker;
+ int r = store->get_bucket_info(NULL, bucket.name, bucket_info, &objv_tracker);
if (r < 0) {
ldout(store->ctx(), 0) << "could not get bucket info for bucket=" << bucket << dendl;
continue;
return -EINVAL;
if (!bucket_name.empty()) {
- int r = store->get_bucket_info(NULL, bucket_name, bucket_info);
+ RGWObjVersionTracker objv_tracker;
+ int r = store->get_bucket_info(NULL, bucket_name, bucket_info, &objv_tracker);
if (r < 0) {
ldout(store->ctx(), 0) << "could not get bucket info for bucket=" << bucket_name << dendl;
return r;
rgw_bucket bucket;
map<RGWObjCategory, RGWBucketStats> stats;
- int r = store->get_bucket_info(NULL, bucket_name, bucket_info);
+ RGWObjVersionTracker objv_tracker;
+ int r = store->get_bucket_info(NULL, bucket_name, bucket_info, &objv_tracker);
if (r < 0)
return r;
class RGWBucketMetadataHandler : public RGWMetadataHandler {
- int init_bucket(RGWRados *store, string& bucket_name, rgw_bucket& bucket) {
+ int init_bucket(RGWRados *store, string& bucket_name, rgw_bucket& bucket, RGWObjVersionTracker *objv_tracker) {
RGWBucketInfo bucket_info;
- int r = store->get_bucket_info(NULL, bucket_name, bucket_info);
+ int r = store->get_bucket_info(NULL, bucket_name, bucket_info, objv_tracker);
if (r < 0) {
cerr << "could not get bucket info for bucket=" << bucket_name << std::endl;
return r;
RGWObjVersionTracker objv_tracker;
-
- int ret = store->get_bucket_info(NULL, entry, bci.info, &bci.attrs);
+ int ret = store->get_bucket_info(NULL, entry, bci.info, &objv_tracker, &bci.attrs);
if (ret < 0)
return ret;
decode_json_obj(bci, obj);
- int ret = store->put_bucket_info(entry, bci.info, false, &bci.attrs);
+ int ret = store->put_bucket_info(entry, bci.info, false, &objv_tracker, &bci.attrs);
if (ret < 0)
return ret;
int remove(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker) {
#warning FIXME: use objv_tracker
rgw_bucket bucket;
- int r = init_bucket(store, entry, bucket);
+ int r = init_bucket(store, entry, bucket, &objv_tracker);
if (r < 0) {
cerr << "could not init bucket=" << entry << std::endl;
return r;
// define as static when RGWBucket implementation compete
extern void rgw_get_buckets_obj(string& user_id, string& buckets_obj_id);
+extern int rgw_bucket_store_info(RGWRados *store, string& bucket_name, bufferlist& bl, bool exclusive,
+ map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker);
/**
* Store a list of the user's buckets, with associated functinos.
if (r)
return 1;
+ rgw_user_init(store->meta_mgr);
+ rgw_bucket_init(store->meta_mgr);
rgw_log_usage_init(g_ceph_context, store);
RGWREST rest;
/* object exists, but policy is broken */
RGWBucketInfo info;
RGWUserInfo uinfo;
- int r = store->get_bucket_info(ctx, obj.bucket.name, info);
+ RGWObjVersionTracker objv_tracker;
+ int r = store->get_bucket_info(ctx, obj.bucket.name, info, &objv_tracker);
if (r < 0)
goto done;
r = rgw_get_user_info_by_uid(store, info.owner, uinfo);
RGWBucketInfo bucket_info;
if (s->bucket_name_str.size()) {
- ret = store->get_bucket_info(s->obj_ctx, s->bucket_name_str, bucket_info);
+ RGWObjVersionTracker objv_tracker;
+ ret = store->get_bucket_info(s->obj_ctx, s->bucket_name_str, bucket_info, &objv_tracker);
if (ret < 0) {
ldout(s->cct, 0) << "NOTICE: couldn't get bucket from bucket_name (name=" << s->bucket_name_str << ")" << dendl;
return ret;
if (bucket_name.compare(s->bucket.name) != 0) {
RGWBucketInfo bucket_info;
- int r = store->get_bucket_info(NULL, bucket_name, bucket_info);
+ RGWObjVersionTracker objv_tracker;
+ int r = store->get_bucket_info(NULL, bucket_name, bucket_info, &objv_tracker);
if (r < 0) {
ldout(s->cct, 0) << "could not get bucket info for bucket=" << bucket_name << dendl;
return r;
*/
RGWBucketInfo info;
map<string, bufferlist> attrs;
- int r = store->get_bucket_info(NULL, s->bucket.name, info, &attrs);
+ RGWObjVersionTracker objv_tracker;
+ int r = store->get_bucket_info(NULL, s->bucket.name, info, &objv_tracker, &attrs);
if (r < 0) {
ldout(s->cct, 0) << "ERROR: get_bucket_info on bucket=" << s->bucket.name << " returned err=" << r << " after create_bucket returned -EEXIST" << dendl;
ret = r;
/* get buckets info (source and dest) */
- ret = store->get_bucket_info(s->obj_ctx, src_bucket_name, src_bucket_info);
+ ret = store->get_bucket_info(s->obj_ctx, src_bucket_name, src_bucket_info, NULL);
if (ret < 0)
return ret;
if (src_bucket_name.compare(dest_bucket_name) == 0) {
dest_bucket_info = src_bucket_info;
} else {
- ret = store->get_bucket_info(s->obj_ctx, dest_bucket_name, dest_bucket_info);
+ ret = store->get_bucket_info(s->obj_ctx, dest_bucket_name, dest_bucket_info, NULL);
if (ret < 0)
return ret;
}
* returns 0 on success, -ERR# otherwise.
*/
int RGWRados::create_bucket(string& owner, rgw_bucket& bucket,
- map<std::string, bufferlist>& attrs,
+ map<std::string, bufferlist>& attrs,
bool exclusive)
{
int ret = 0;
if (r < 0 && r != -EEXIST)
return r;
+ RGWObjVersionTracker objv_tracker;
RGWBucketInfo info;
info.bucket = bucket;
info.owner = owner;
- ret = store_bucket_info(info, &attrs, exclusive);
+ ret = put_bucket_info(bucket.name, info, exclusive, &objv_tracker, &attrs);
if (ret == -EEXIST) {
index_ctx.remove(dir_oid);
}
return ret;
}
-int RGWRados::store_bucket_info(RGWBucketInfo& info, map<string, bufferlist> *pattrs, bool exclusive)
-{
- bufferlist bl;
- ::encode(info, bl);
-
- int ret = rgw_put_system_obj(this, zone.domain_root, info.bucket.name, bl.c_str(), bl.length(), exclusive, NULL, pattrs);
- if (ret < 0)
- return ret;
-
- ldout(cct, 20) << "store_bucket_info: bucket=" << info.bucket << " owner " << info.owner << dendl;
- return 0;
-}
-
-
int RGWRados::select_bucket_placement(string& bucket_name, rgw_bucket& bucket)
{
bufferlist map_bl;
{
RGWBucketInfo info;
map<string, bufferlist> attrs;
- int r = get_bucket_info(NULL, bucket.name, info, &attrs);
+ RGWObjVersionTracker objv_tracker;
+ int r = get_bucket_info(NULL, bucket.name, info, &objv_tracker, &attrs);
if (r < 0) {
ldout(cct, 0) << "NOTICE: get_bucket_info on bucket=" << bucket.name << " returned err=" << r << dendl;
return r;
info.owner = owner.get_id();
- r = put_bucket_info(bucket.name, info, false, &attrs);
+ r = put_bucket_info(bucket.name, info, false, &objv_tracker, &attrs);
if (r < 0) {
ldout(cct, 0) << "NOTICE: put_bucket_info on bucket=" << bucket.name << " returned err=" << r << dendl;
return r;
ldout(cct, 20) << "disabling bucket name=" << bucket.name << dendl;
RGWBucketInfo info;
+ RGWObjVersionTracker objv_tracker;
map<string, bufferlist> attrs;
- int r = get_bucket_info(NULL, bucket.name, info, &attrs);
+ int r = get_bucket_info(NULL, bucket.name, info, &objv_tracker, &attrs);
if (r < 0) {
ldout(cct, 0) << "NOTICE: get_bucket_info on bucket=" << bucket.name << " returned err=" << r << ", skipping bucket" << dendl;
ret = r;
info.flags |= BUCKET_SUSPENDED;
}
- r = put_bucket_info(bucket.name, info, false, &attrs);
+ r = put_bucket_info(bucket.name, info, false, &objv_tracker, &attrs);
if (r < 0) {
ldout(cct, 0) << "NOTICE: put_bucket_info on bucket=" << bucket.name << " returned err=" << r << ", skipping bucket" << dendl;
ret = r;
int RGWRados::bucket_suspended(rgw_bucket& bucket, bool *suspended)
{
RGWBucketInfo bucket_info;
- int ret = get_bucket_info(NULL, bucket.name, bucket_info);
+ int ret = get_bucket_info(NULL, bucket.name, bucket_info, NULL);
if (ret < 0) {
return ret;
}
return 0;
}
-int RGWRados::get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, map<string, bufferlist> *pattrs)
+int RGWRados::get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs)
{
bufferlist bl;
- int ret = rgw_get_system_obj(this, ctx, zone.domain_root, bucket_name, bl, NULL, pattrs);
+ int ret = rgw_get_system_obj(this, ctx, zone.domain_root, bucket_name, bl, objv_tracker, pattrs);
if (ret < 0) {
if (ret != -ENOENT)
return ret;
return 0;
}
-int RGWRados::put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exclusive, map<string, bufferlist> *pattrs)
+int RGWRados::put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exclusive, RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs)
{
bufferlist bl;
::encode(info, bl);
- int ret = rgw_put_system_obj(this, zone.domain_root, bucket_name, bl.c_str(), bl.length(), exclusive, NULL, pattrs);
+ int ret = rgw_bucket_store_info(this, info.bucket.name, bl, exclusive, pattrs, objv_tracker);
return ret;
}
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);
+ int store_bucket_info(RGWBucketInfo& info, map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker, bool exclusive);
protected:
CephContext *cct;
int decode_policy(bufferlist& bl, ACLOwner *owner);
int get_bucket_stats(rgw_bucket& bucket, uint64_t *bucket_ver, uint64_t *master_ver, map<RGWObjCategory, RGWBucketStats>& stats);
- virtual int get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, map<string, bufferlist> *pattrs = NULL);
- virtual int put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exclusive, map<string, bufferlist> *pattrs);
+ virtual int get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs = NULL);
+ virtual int put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exclusive, RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs);
int cls_rgw_init_index(librados::IoCtx& io_ctx, librados::ObjectWriteOperation& op, string& oid);
int cls_obj_prepare_op(rgw_bucket& bucket, RGWModifyOp op, string& tag,