return store->meta_mgr->put_entry(bucket_meta_handler, bucket_name, bl, exclusive, objv_tracker, mtime, pattrs);
}
-int rgw_bucket_instance_store_info(RGWRados *store, string& oid, bufferlist& bl, bool exclusive,
+int rgw_bucket_instance_store_info(RGWRados *store, string& entry, bufferlist& bl, bool exclusive,
map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker,
time_t mtime) {
- return store->meta_mgr->put_entry(bucket_instance_meta_handler, oid, bl, exclusive, objv_tracker, mtime, pattrs);
+ return store->meta_mgr->put_entry(bucket_instance_meta_handler, entry, bl, exclusive, objv_tracker, mtime, pattrs);
+}
+
+int rgw_bucket_instance_remove_entry(RGWRados *store, string& entry, RGWObjVersionTracker *objv_tracker) {
+ return store->meta_mgr->remove_entry(bucket_instance_meta_handler, entry, objv_tracker);
}
#warning removed RGWBucket::create_bucket(), clean this up when ready
time_t orig_mtime;
- int ret = store->get_bucket_entrypoint_info(NULL, entry, be, &objv_tracker, &orig_mtime);
+ int ret = store->get_bucket_entrypoint_info(NULL, entry, old_be, &objv_tracker, &orig_mtime);
if (ret < 0 && ret != -ENOENT)
return ret;
- ret = store->put_bucket_entrypoint_info(entry, old_be, false, mtime);
+ ret = store->put_bucket_entrypoint_info(entry, be, false, mtime);
if (ret < 0)
return ret;
-#warning need to link bucket here
-#if 0
- ret = rgw_add_bucket(store, bci.info.owner, bci.info.bucket, bci.info.creation_time);
- if (ret < 0)
- return ret;
-#endif
+ /* link bucket */
+ ret = rgw_add_bucket(store, be.owner, be.bucket, be.creation_time);
return 0;
}
public:
string get_type() { return "bucket.instance"; }
- int get(RGWRados *store, string& entry, RGWMetadataObject **obj) {
+ int get(RGWRados *store, string& oid, RGWMetadataObject **obj) {
RGWBucketCompleteInfo bci;
time_t mtime;
- int ret = store->get_bucket_instance_info(NULL, entry, bci.info, &mtime, &bci.attrs);
+ int ret = store->get_bucket_instance_info(NULL, oid, bci.info, &mtime, &bci.attrs);
if (ret < 0)
return ret;
return 0;
}
- int put(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker, time_t mtime, JSONObj *obj) {
+ int put(RGWRados *store, string& oid, RGWObjVersionTracker& objv_tracker, time_t mtime, JSONObj *obj) {
RGWBucketCompleteInfo bci, old_bci;
decode_json_obj(bci, obj);
old_bci.info.objv_tracker = objv_tracker;
- int ret = store->get_bucket_instance_info(NULL, entry, old_bci.info, &orig_mtime, &old_bci.attrs);
+ int ret = store->get_bucket_instance_info(NULL, oid, old_bci.info, &orig_mtime, &old_bci.attrs);
if (ret < 0 && ret != -ENOENT)
return ret;
if (ret == -ENOENT || old_bci.info.bucket.bucket_id != bci.info.bucket.bucket_id) {
/* a new bucket, we need to select a new bucket placement for it */
rgw_bucket bucket;
- ret = store->set_bucket_location_by_rule(bci.info.placement_rule, entry, bucket);
+ ret = store->set_bucket_location_by_rule(bci.info.placement_rule, oid, bucket);
if (ret < 0) {
ldout(store->ctx(), 0) << "ERROR: select_bucket_placement() returned " << ret << dendl;
return ret;
bci.info.objv_tracker = old_bci.info.objv_tracker;
}
- ret = store->put_bucket_instance_info(entry, bci.info, false, mtime, &bci.attrs);
+ ret = store->put_bucket_instance_info(oid, bci.info, false, mtime, &bci.attrs);
if (ret < 0)
return ret;
};
int remove(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker) {
- rgw_bucket bucket;
- int r = init_bucket(store, entry, bucket, &objv_tracker);
- if (r < 0) {
- cerr << "could not init bucket=" << entry << std::endl;
- return r;
- }
+ RGWBucketInfo info;
- return store->delete_bucket(bucket, objv_tracker);
+ int ret = store->get_bucket_instance_info(NULL, entry, info, NULL, NULL);
+ if (ret < 0 && ret != -ENOENT)
+ return ret;
+
+ return rgw_bucket_instance_remove_entry(store, entry, &info.objv_tracker);
}
void get_pool_and_oid(RGWRados *store, string& key, rgw_bucket& bucket, string& oid) {
- oid = key;
+ oid = RGW_BUCKET_INSTANCE_MD_PREFIX + key;
bucket = store->zone.domain_root;
}
map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker,
time_t mtime);
+extern int rgw_bucket_instance_remove_entry(RGWRados *store, string& entry, RGWObjVersionTracker *objv_tracker);
+
extern int rgw_bucket_delete_bucket_obj(RGWRados *store, string& bucket_name, RGWObjVersionTracker& objv_tracker);
/**
{
rgw_bucket bucket;
string owner;
+ time_t creation_time;
bool has_bucket_info;
RGWBucketInfo old_bucket_info;
- RGWBucketEntryPoint() : has_bucket_info(false) {}
+ RGWBucketEntryPoint() : creation_time(0), has_bucket_info(false) {}
void encode(bufferlist& bl) const {
ENCODE_START(8, 8, bl);
::encode(bucket, bl);
::encode(owner, bl);
+ uint64_t ctime = (uint64_t)creation_time;
+ ::encode(ctime, bl);
ENCODE_FINISH(bl);
}
void decode(bufferlist::iterator& bl) {
has_bucket_info = false;
::decode(bucket, bl);
::decode(owner, bl);
+ uint64_t ctime;
+ ::decode(ctime, bl);
+ creation_time = (uint64_t)ctime;
DECODE_FINISH(bl);
}
void RGWBucketEntryPoint::dump(Formatter *f) const
{
encode_json("bucket", bucket, f);
+ encode_json("owner", owner, f);
+ encode_json("creation_time", creation_time, f);
encode_json("has_bucket_info", has_bucket_info, f);
if (has_bucket_info) {
encode_json("old_bucket_info", old_bucket_info, f);
void RGWBucketEntryPoint::decode_json(JSONObj *obj) {
JSONDecoder::decode_json("bucket", bucket, obj);
+ JSONDecoder::decode_json("owner", owner, obj);
+ JSONDecoder::decode_json("creation_time", creation_time, obj);
JSONDecoder::decode_json("has_bucket_info", has_bucket_info, obj);
if (has_bucket_info) {
JSONDecoder::decode_json("old_bucket_info", old_bucket_info, obj);
case MDLOG_STATUS_COMPLETE:
s = "complete";
break;
+ case MDLOG_STATUS_ABORT:
+ s = "abort";
+ break;
default:
s = "unknown";
break;
}
int RGWMetadataManager::post_modify(string& section, string& key, RGWMetadataLogData& log_data,
- RGWObjVersionTracker *objv_tracker)
+ RGWObjVersionTracker *objv_tracker, int ret)
{
- log_data.status = MDLOG_STATUS_COMPLETE;
+ if (ret >= 0)
+ log_data.status = MDLOG_STATUS_COMPLETE;
+ else
+ log_data.status = MDLOG_STATUS_ABORT;
bufferlist logbl;
::encode(log_data, logbl);
- int ret = md_log->add_entry(store, section, key, logbl);
+ int r = md_log->add_entry(store, section, key, logbl);
if (ret < 0)
return ret;
+ if (r < 0)
+ return r;
+
return 0;
}
ret = rgw_put_system_obj(store, bucket, oid,
bl.c_str(), bl.length(), exclusive,
objv_tracker, mtime, pattrs);
- if (ret < 0)
- return ret;
+ /* cascading ret into post_modify() */
- ret = post_modify(section, key, log_data, objv_tracker);
+ ret = post_modify(section, key, log_data, objv_tracker, ret);
if (ret < 0)
return ret;
rgw_obj obj(bucket, oid);
ret = store->delete_obj(NULL, obj);
- if (ret < 0)
- return ret;
+ /* cascading ret into post_modify() */
- ret = post_modify(section, key, log_data, objv_tracker);
+ ret = post_modify(section, key, log_data, objv_tracker, ret);
if (ret < 0)
return ret;
return ret;
ret = store->set_attrs(NULL, obj, attrs, rmattrs, objv_tracker);
- if (ret < 0)
- return ret;
+ /* cascading ret into post_modify() */
- ret = post_modify(section, key, log_data, objv_tracker);
+ ret = post_modify(section, key, log_data, objv_tracker, ret);
if (ret < 0)
return ret;
MDLOG_STATUS_SETATTRS,
MDLOG_STATUS_REMOVE,
MDLOG_STATUS_COMPLETE,
+ MDLOG_STATUS_ABORT,
};
class RGWMetadataObject {
RGWMetadataLogData& log_data, RGWObjVersionTracker *objv_tracker,
RGWMDLogStatus op_type);
int post_modify(string& section, string& key, RGWMetadataLogData& log_data,
- RGWObjVersionTracker *objv_tracker);
+ RGWObjVersionTracker *objv_tracker, int ret);
public:
RGWMetadataManager(CephContext *_cct, RGWRados *_store);
info.creation_time = creation_time;
ret = put_bucket_info(bucket.name, info, exclusive, 0, &attrs, true);
if (ret == -EEXIST) {
+ /* remove bucket meta instance */
+ string entry;
+ get_bucket_instance_entry(bucket, entry);
+ r = rgw_bucket_instance_remove_entry(this, entry, &info.objv_tracker);
+ if (r < 0)
+ return r;
+
+ /* remove bucket index */
librados::IoCtx index_ctx; // context for new bucket
int r = open_bucket_index_ctx(bucket, index_ctx);
if (r < 0)
return 0;
}
+void RGWRados::get_bucket_instance_entry(rgw_bucket& bucket, string& entry)
+{
+ entry = bucket.name + ":" + bucket.bucket_id;
+}
+
void RGWRados::get_bucket_meta_oid(rgw_bucket& bucket, string& oid)
{
- oid = RGW_BUCKET_INSTANCE_MD_PREFIX + bucket.name + ":" + bucket.bucket_id;
+ string entry;
+ get_bucket_instance_entry(bucket, entry);
+ oid = RGW_BUCKET_INSTANCE_MD_PREFIX + entry;
}
int RGWRados::get_bucket_instance_info(void *ctx, string& entry, RGWBucketInfo& info,
bufferlist epbl;
::encode(entry_point, epbl);
RGWObjVersionTracker ot;
+ ot.generate_new_write_ver(cct);
return rgw_bucket_store_info(this, bucket_name, epbl, exclusive, NULL, &ot, mtime);
}
::encode(info, bl);
- string oid;
- get_bucket_meta_oid(info.bucket, oid);
- return rgw_bucket_instance_store_info(this, oid, bl, exclusive, pattrs, &info.objv_tracker, mtime);
+ string key;
+ get_bucket_instance_entry(info.bucket, key); /* when we go through meta api, we don't use oid directly */
+ return rgw_bucket_instance_store_info(this, key, bl, exclusive, pattrs, &info.objv_tracker, mtime);
}
int RGWRados::put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exclusive,
RGWBucketEntryPoint entry_point;
entry_point.bucket = info.bucket;
entry_point.owner = info.owner;
+ entry_point.creation_time = info.creation_time;
ret = put_bucket_entrypoint_info(info.bucket.name, entry_point, exclusive, mtime);
- if (exclusive && ret == -EEXIST) {
- string oid;
- get_bucket_meta_oid(info.bucket, oid);
- rgw_obj obj(zone.domain_root, oid);
- int r = delete_obj(NULL, obj);
- if (r < 0) {
- ldout(cct, 0) << "ERROR: failed removing object " << obj << " when trying to clean up" << dendl;
- }
- }
+ if (ret < 0)
+ return ret;
- return ret;
+ return 0;
}
int RGWRados::omap_get_vals(rgw_obj& obj, bufferlist& header, const string& marker, uint64_t count, std::map<string, bufferlist>& m)
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);
+ void get_bucket_instance_entry(rgw_bucket& bucket, string& entry);
void get_bucket_meta_oid(rgw_bucket& bucket, string& oid);
int put_bucket_entrypoint_info(string& bucket_name, RGWBucketEntryPoint& entry_point, bool exclusive, time_t mtime);