}
}
- ret = store->delete_bucket(bucket);
+ RGWObjVersionTracker objv_tracker;
+
+ ret = store->delete_bucket(bucket, objv_tracker);
if (ret < 0) {
lderr(store->ctx()) << "ERROR: could not remove bucket " << bucket.name << dendl;
return ret;
return ret;
}
-int rgw_bucket_delete_bucket_obj(RGWRados *store, string& bucket_name)
+int rgw_bucket_delete_bucket_obj(RGWRados *store, string& bucket_name, RGWObjVersionTracker& objv_tracker)
{
- RGWObjVersionTracker objv_tracker;
return store->meta_mgr->remove_entry(bucket_meta_handler, bucket_name, &objv_tracker);
}
return r;
}
- return store->delete_bucket(bucket);
+ return store->delete_bucket(bucket, objv_tracker);
}
void get_pool_and_oid(RGWRados *store, string& key, rgw_bucket& bucket, string& oid) {
extern int rgw_bucket_store_info(RGWRados *store, string& bucket_name, bufferlist& bl, bool exclusive,
map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker);
-extern int rgw_bucket_delete_bucket_obj(RGWRados *store, string& bucket_name);
+extern int rgw_bucket_delete_bucket_obj(RGWRados *store, string& bucket_name, RGWObjVersionTracker& objv_tracker);
/**
* Store a list of the user's buckets, with associated functinos.
return 0;
}
+template<class T>
+static int forward_request(struct req_state *s, RGWRados *store, bufferlist& in_data, const char *name, T& obj)
+{
+ ldout(s->cct, 0) << "sending create_bucket request to master region" << dendl;
+ bufferlist response;
+#define MAX_REST_RESPONSE (128 * 1024) // we expect a very small response
+ int ret = store->rest_conn->forward(s->user.user_id, s->info, MAX_REST_RESPONSE, &in_data, &response);
+ if (ret < 0)
+ return ret;
+
+ ldout(s->cct, 20) << "response: " << response.c_str() << dendl;
+ JSONParser jp;
+ ret = jp.parse(response.c_str(), response.length());
+ if (ret < 0) {
+ ldout(s->cct, 0) << "failed parsing response from master region" << dendl;
+ return ret;
+ }
+ JSONDecoder::decode_json(name, obj, &jp);
+
+ return 0;
+}
+
void RGWCreateBucket::execute()
{
RGWAccessControlPolicy old_policy(s->cct);
}
if (!store->region.is_master) {
- ldout(s->cct, 0) << "sending create_bucket request to master region" << dendl;
- bufferlist response;
-#define MAX_REST_RESPONSE (128 * 1024) // we expect a very small response
- ret = store->rest_conn->forward(s->user.user_id, s->info, MAX_REST_RESPONSE, &in_data, &response);
+ ret = forward_request(s, store, in_data, "object_ver", objv);
if (ret < 0)
return;
- ldout(s->cct, 20) << "response: " << response.c_str() << dendl;
- JSONParser jp;
- ret = jp.parse(response.c_str(), response.length());
- if (ret < 0) {
- ldout(s->cct, 0) << "failed parsing response from master region" << dendl;
- return;
- }
- JSONDecoder::decode_json("object_ver", objv, &jp);
- pobjv = &objv;
-
ldout(s->cct, 20) << "parsed: objv.tag=" << objv.tag << " objv.ver=" << objv.ver << dendl;
}
{
ret = -EINVAL;
- if (s->bucket_name) {
- ret = store->delete_bucket(s->bucket);
+ if (!s->bucket_name)
+ return;
- if (ret == 0) {
- ret = rgw_remove_user_bucket_info(store, s->user.user_id, s->bucket);
- if (ret < 0) {
- ldout(s->cct, 0) << "WARNING: failed to remove bucket: ret=" << ret << dendl;
- }
+ if (!store->region.is_master) {
+ bufferlist in_data;
+ ret = forward_request(s, store, in_data, "object_ver", objv_tracker.read_version);
+ if (ret < 0) {
+ return;
+ }
+ }
+
+ ret = store->delete_bucket(s->bucket, objv_tracker);
+
+ if (ret == 0) {
+ ret = rgw_remove_user_bucket_info(store, s->user.user_id, s->bucket);
+ if (ret < 0) {
+ ldout(s->cct, 0) << "WARNING: failed to remove bucket: ret=" << ret << dendl;
}
}
}
protected:
int ret;
+ RGWObjVersionTracker objv_tracker;
+
public:
RGWDeleteBucket() : ret(0) {}
* bucket: the name of the bucket to delete
* Returns 0 on success, -ERR# otherwise.
*/
-int RGWRados::delete_bucket(rgw_bucket& bucket)
+int RGWRados::delete_bucket(rgw_bucket& bucket, RGWObjVersionTracker& objv_tracker)
{
librados::IoCtx index_ctx;
string oid;
}
} while (is_truncated);
- r = rgw_bucket_delete_bucket_obj(this, bucket.name);
+ r = rgw_bucket_delete_bucket_obj(this, bucket.name, objv_tracker);
if (r < 0)
return r;
* Delete a bucket.
* bucket: the name of the bucket to delete
* Returns 0 on success, -ERR# otherwise.
- */ virtual int delete_bucket(rgw_bucket& bucket);
+ */
+ virtual int delete_bucket(rgw_bucket& bucket, RGWObjVersionTracker& objv_tracker);
int set_bucket_owner(rgw_bucket& bucket, ACLOwner& owner);
int set_buckets_enabled(std::vector<rgw_bucket>& buckets, bool enabled);
set_req_state_err(s, r);
dump_errno(s);
end_header(s);
+
+ if (s->system_request) {
+ JSONFormatter f; /* use json formatter for system requests output */
+
+ f.open_object_section("info");
+ encode_json("object_ver", objv_tracker.read_version, &f);
+ f.close_section();
+ rgw_flush_formatter_and_reset(s, &f);
+ }
}
int RGWPutObj_ObjStore_S3::get_params()