int max = 1000;
list_op.params.list_versions = true;
+ list_op.params.allow_unordered = true;
+ bool is_truncated = false;
do {
objs.clear();
- ret = list_op.list_objects(max, &objs, &common_prefixes, NULL);
+ ret = list_op.list_objects(max, &objs, &common_prefixes, &is_truncated);
if (ret < 0)
return ret;
for (const auto& obj : objs) {
rgw_obj_key key(obj.key);
ret = rgw_remove_object(store, info, bucket, key);
- if (ret < 0)
+ if (ret < 0 && ret != -ENOENT) {
return ret;
+ }
}
-
- } while (!objs.empty());
+ } while(is_truncated);
string prefix, delimiter;
RGWObjVersionTracker objv_tracker;
- ret = store->delete_bucket(info, objv_tracker);
+ // if we deleted children above we will force delete, as any that
+ // remain is detrius from a prior bug
+ ret = store->delete_bucket(info, objv_tracker, !delete_children);
if (ret < 0) {
- lderr(store->ctx()) << "ERROR: could not remove bucket " << bucket.name << dendl;
+ lderr(store->ctx()) << "ERROR: could not remove bucket " <<
+ bucket.name << dendl;
return ret;
}
RGWRados::Bucket::List list_op(&target);
list_op.params.list_versions = true;
+ list_op.params.allow_unordered = true;
std::list<librados::AioCompletion*> handles;
int max = 1000;
int max_aio = concurrent_max;
- ret = list_op.list_objects(max, &objs, &common_prefixes, NULL);
- if (ret < 0)
- return ret;
+ bool is_truncated = true;
+
+ while (is_truncated) {
+ objs.clear();
+ ret = list_op.list_objects(max, &objs, &common_prefixes, &is_truncated);
+ if (ret < 0)
+ return ret;
- while (!objs.empty()) {
std::vector<rgw_bucket_dir_entry>::iterator it = objs.begin();
for (; it != objs.end(); ++it) {
RGWObjState *astate = NULL;
max_aio = concurrent_max;
}
} // for all RGW objects
- objs.clear();
-
- ret = list_op.list_objects(max, &objs, &common_prefixes, NULL);
- if (ret < 0)
- return ret;
}
ret = drain_handles(handles);
RGWObjVersionTracker objv_tracker;
- ret = store->delete_bucket(info, objv_tracker);
+ // 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 = store->delete_bucket(info, objv_tracker, false);
if (ret < 0) {
lderr(store->ctx()) << "ERROR: could not remove bucket " << bucket.name << dendl;
return ret;