bool RGWGetObj::prefetch_data()
{
/* HEAD request, stop prefetch*/
- if (!get_data) {
+ if (!get_data || s->info.env->exists("HTTP_X_RGW_AUTH")) {
return false;
}
if (get_type() == RGW_OP_STAT_OBJ) {
return;
}
-
+ if (s->info.env->exists("HTTP_X_RGW_AUTH")) {
+ op_ret = 0;
+ goto done_err;
+ }
/* start gettorrent */
if (torrent.get_flag())
{
string marker;
rgw::sal::RGWBucketList buckets;
uint64_t max_buckets = s->cct->_conf->rgw_list_buckets_max_chunk;
+ const string *lastmarker;
do {
+ lastmarker = nullptr;
op_ret = rgw_read_user_buckets(store, s->user->get_id(), buckets, marker,
string(), max_buckets, true);
if (op_ret < 0) {
/* hmm.. something wrong here.. the user was authenticated, so it
should exist */
- ldpp_dout(this, 10) << "WARNING: failed on rgw_get_user_buckets uid="
- << s->user->get_id() << dendl;
+ ldpp_dout(this, 10) << "WARNING: failed on rgw_read_user_buckets uid="
+ << s->user->get_id() << " ret=" << op_ret << dendl;
break;
} else {
/* We need to have stats for all our policies - even if a given policy
std::map<std::string, rgw::sal::RGWBucket*>& m = buckets.get_buckets();
for (const auto& kv : m) {
const auto& bucket = kv.second;
+ lastmarker = &kv.first;
global_stats.bytes_used += bucket->get_size();
global_stats.bytes_used_rounded += bucket->get_size_rounded();
global_stats.buckets_count += m.size();
}
+ if (!lastmarker) {
+ lderr(s->cct) << "ERROR: rgw_read_user_buckets, stasis at marker="
+ << marker << " uid=" << s->user->get_id() << dendl;
+ break;
+ }
+ marker = *lastmarker;
} while (buckets.is_truncated());
}
encode_delete_at_attr(delete_at, attrs);
+ if (!s->system_request) { // no quota enforcement for system requests
+ // get src object size (cached in obj_ctx from verify_permission())
+ RGWObjState* astate = nullptr;
+ op_ret = store->getRados()->get_obj_state(s->obj_ctx, src_bucket_info, src_obj,
+ &astate, true, s->yield, false);
+ if (op_ret < 0) {
+ return;
+ }
+ // enforce quota against the destination bucket owner
+ op_ret = store->getRados()->check_quota(dest_bucket_info.owner,
+ dest_bucket_info.bucket,
+ user_quota, bucket_quota,
+ astate->accounted_size);
+ if (op_ret < 0) {
+ return;
+ }
+ }
+
bool high_precision_time = (s->system_request);
/* Handle object versioning of Swift API. In case of copying to remote this
obj_op.meta.owner = s->owner.get_id();
obj_op.meta.category = RGWObjCategory::MultiMeta;
obj_op.meta.flags = PUT_OBJ_CREATE_EXCL;
+ obj_op.meta.mtime = &mtime;
multipart_upload_info upload_info;
upload_info.dest_placement = s->dest_placement;