if (bypass_gc)
ret = bucket->remove_bucket_bypass_gc(op_state.get_max_aio(), keep_index_consistent, y, dpp);
else
- ret = bucket->remove_bucket(dpp, op_state.will_delete_children(), string(), string(),
+ ret = bucket->remove_bucket(dpp, op_state.will_delete_children(),
false, nullptr, y);
return ret;
return;
}
- string prefix, delimiter;
-
- if (s->prot_flags & RGW_REST_SWIFT) {
- string path_args;
- path_args = s->info.args.get("path");
- if (!path_args.empty()) {
- if (!delimiter.empty() || !prefix.empty()) {
- op_ret = -EINVAL;
- return;
- }
- prefix = path_args;
- delimiter="/";
- }
- }
-
- op_ret = s->bucket->remove_bucket(this, false, prefix, delimiter, false, nullptr, y);
+ op_ret = s->bucket->remove_bucket(this, false, false, nullptr, y);
if (op_ret < 0 && op_ret == -ECANCELED) {
// lost a race, either with mdlog sync or another delete bucket operation.
// in either case, we've already called ctl.bucket->unlink_bucket()
op_ret = 0;
}
+
return;
}
goto delop_fail;
}
} else {
- ret = bucket->remove_bucket(dpp, false, string(), string(), true, &s->info, s->yield);
+ ret = bucket->remove_bucket(dpp, false, true, &s->info, s->yield);
if (ret < 0) {
goto delop_fail;
}
num_deleted++;
return true;
-
binfo_fail:
if (-ENOENT == ret) {
ldpp_dout(dpp, 20) << "cannot find bucket = " << path.bucket_name << dendl;
return;
}
- op_ret = bucket->remove_bucket(s, delete_children, string(), string(), true, &s->info, s->yield);
+ op_ret = bucket->remove_bucket(s, delete_children, true, &s->info, s->yield);
}
class RGWOp_Set_Bucket_Quota : public RGWRESTOp {
/** Set the cached attributes on this bucket */
virtual int set_attrs(Attrs a) { attrs = a; return 0; }
/** Remove this bucket from the backing store */
- virtual int remove_bucket(const DoutPrefixProvider* dpp, bool delete_children, std::string prefix, std::string delimiter, bool forward_to_master, req_info* req_info, optional_yield y) = 0;
+ virtual int remove_bucket(const DoutPrefixProvider* dpp, bool delete_children, bool forward_to_master, req_info* req_info, optional_yield y) = 0;
/** Remove this bucket, bypassing garbage collection. May be removed */
virtual int remove_bucket_bypass_gc(int concurrent_max, bool
keep_index_consistent,
std::vector<std::unique_ptr<MultipartUpload>>& uploads,
std::map<std::string, bool> *common_prefixes,
bool *is_truncated) = 0;
- /** Abort multipart uploads matching the prefix and delimiter */
- virtual int abort_multiparts(const DoutPrefixProvider *dpp,
- CephContext *cct,
- std::string& prefix, std::string& delim) = 0;
+ /** Abort multipart uploads in a bucket */
+ virtual int abort_multiparts(const DoutPrefixProvider* dpp,
+ CephContext* cct) = 0;
/* dang - This is temporary, until the API is completed */
rgw_bucket& get_key() { return info.bucket; }
return ret;
}
- int DBBucket::remove_bucket(const DoutPrefixProvider *dpp, bool delete_children, std::string prefix, std::string delimiter, bool forward_to_master, req_info* req_info, optional_yield y)
+ int DBBucket::remove_bucket(const DoutPrefixProvider *dpp, bool delete_children, bool forward_to_master, req_info* req_info, optional_yield y)
{
int ret;
return 0;
}
- int DBBucket::abort_multiparts(const DoutPrefixProvider *dpp,
- CephContext *cct,
- string& prefix, string& delim) {
+ int DBBucket::abort_multiparts(const DoutPrefixProvider* dpp,
+ CephContext* cct) {
return 0;
}
virtual std::unique_ptr<Object> get_object(const rgw_obj_key& k) override;
virtual int list(const DoutPrefixProvider *dpp, ListParams&, int, ListResults&, optional_yield y) override;
- virtual int remove_bucket(const DoutPrefixProvider *dpp, bool delete_children, std::string prefix, std::string delimiter, bool forward_to_master, req_info* req_info, optional_yield y) override;
+ virtual int remove_bucket(const DoutPrefixProvider *dpp, bool delete_children, bool forward_to_master, req_info* req_info, optional_yield y) override;
virtual int remove_bucket_bypass_gc(int concurrent_max, bool
keep_index_consistent,
optional_yield y, const
vector<std::unique_ptr<MultipartUpload>>& uploads,
map<string, bool> *common_prefixes,
bool *is_truncated) override;
- virtual int abort_multiparts(const DoutPrefixProvider *dpp,
- CephContext *cct,
- string& prefix, string& delim) override;
+ virtual int abort_multiparts(const DoutPrefixProvider* dpp,
+ CephContext* cct) override;
friend class DBStore;
};
int RadosBucket::remove_bucket(const DoutPrefixProvider* dpp,
bool delete_children,
- std::string prefix,
- std::string delimiter,
bool forward_to_master,
- req_info* req_info, optional_yield y)
+ req_info* req_info,
+ optional_yield y)
{
int ret;
}
} while(results.is_truncated);
- /* If there's a prefix, then we are aborting multiparts as well */
- if (!prefix.empty()) {
- ret = abort_multiparts(dpp, store->ctx(), prefix, delimiter);
- if (ret < 0) {
- return ret;
- }
+ ret = abort_multiparts(dpp, store->ctx());
+ if (ret < 0) {
+ return ret;
}
ret = store->ctl()->bucket->sync_user_stats(dpp, info.owner, info, y);
if (ret < 0)
return ret;
- string prefix, delimiter;
-
- ret = abort_multiparts(dpp, cct, prefix, delimiter);
+ ret = abort_multiparts(dpp, cct);
if (ret < 0) {
return ret;
}
// this function can only be run if caller wanted children to be
// deleted, so we can ignore the check for children as any that
// remain are detritus from a prior bug
- ret = remove_bucket(dpp, true, std::string(), std::string(), false, nullptr, y);
+ ret = remove_bucket(dpp, true, false, nullptr, y);
if (ret < 0) {
ldpp_dout(dpp, -1) << "ERROR: could not remove bucket " << this << dendl;
return ret;
return 0;
}
-int RadosBucket::abort_multiparts(const DoutPrefixProvider *dpp,
- CephContext *cct,
- string& prefix, string& delim)
+int RadosBucket::abort_multiparts(const DoutPrefixProvider* dpp,
+ CephContext* cct)
{
constexpr int max = 1000;
int ret, num_deleted = 0;
string marker;
bool is_truncated;
+ const std::string empty_delim;
+ const std::string empty_prefix;
+
do {
- ret = list_multiparts(dpp, prefix, marker, delim,
- max, uploads, nullptr, &is_truncated);
+ ret = list_multiparts(dpp, empty_prefix, marker, empty_delim,
+ max, uploads, nullptr, &is_truncated);
if (ret < 0) {
ldpp_dout(dpp, 0) << __func__ <<
" ERROR : calling list_bucket_multiparts; ret=" << ret <<
- "; bucket=\"" << this << "\"; prefix=\"" <<
- prefix << "\"; delim=\"" << delim << "\"" << dendl;
+ "; bucket=\"" << this << "\"" << dendl;
return ret;
}
ldpp_dout(dpp, 20) << __func__ <<
virtual std::unique_ptr<Object> get_object(const rgw_obj_key& k) override;
virtual int list(const DoutPrefixProvider* dpp, ListParams&, int, ListResults&, optional_yield y) override;
- virtual int remove_bucket(const DoutPrefixProvider* dpp, bool delete_children, std::string prefix, std::string delimiter, bool forward_to_master, req_info* req_info, optional_yield y) override;
+ virtual int remove_bucket(const DoutPrefixProvider* dpp, bool delete_children, bool forward_to_master, req_info* req_info, optional_yield y) override;
virtual int remove_bucket_bypass_gc(int concurrent_max, bool
keep_index_consistent,
optional_yield y, const
std::vector<std::unique_ptr<MultipartUpload>>& uploads,
std::map<std::string, bool> *common_prefixes,
bool *is_truncated) override;
- virtual int abort_multiparts(const DoutPrefixProvider *dpp,
- CephContext *cct,
- std::string& prefix, std::string& delim) override;
+ virtual int abort_multiparts(const DoutPrefixProvider* dpp,
+ CephContext* cct) override;
private:
int link(const DoutPrefixProvider* dpp, User* new_user, optional_yield y, bool update_entrypoint = true, RGWObjVersionTracker* objv = nullptr);
return -EEXIST; // change to code that maps to 409: conflict
}
- std::string prefix, delimiter;
for (auto it = m.begin(); it != m.end(); ++it) {
- ret = it->second->remove_bucket(dpp, true, prefix, delimiter, false, nullptr, y);
+ ret = it->second->remove_bucket(dpp, true, false, nullptr, y);
if (ret < 0) {
set_err_msg(err_msg, "unable to delete user data");
return ret;