}
struct rgw_bucket_category_stats& stats = calc_header->stats[entry.meta.category];
stats.num_entries++;
- stats.total_size += entry.meta.size;
- stats.total_size_rounded += get_rounded_size(entry.meta.size);
+ stats.total_size += entry.meta.accounted_size;
+ stats.total_size_rounded += get_rounded_size(entry.meta.accounted_size);
start_obj = kiter->first;
}
{
struct rgw_bucket_category_stats& stats = header.stats[entry.meta.category];
stats.num_entries--;
- stats.total_size -= entry.meta.size;
- stats.total_size_rounded -= get_rounded_size(entry.meta.size);
+ stats.total_size -= entry.meta.accounted_size;
+ stats.total_size_rounded -= get_rounded_size(entry.meta.accounted_size);
}
static int read_index_entry(cls_method_context_t hctx, string& name, struct rgw_bucket_dir_entry *entry)
entry.exists = true;
entry.tag = op.tag;
stats.num_entries++;
- stats.total_size += meta.size;
- stats.total_size_rounded += get_rounded_size(meta.size);
+ stats.total_size += meta.accounted_size;
+ stats.total_size_rounded += get_rounded_size(meta.accounted_size);
bufferlist new_key_bl;
::encode(entry, new_key_bl);
int ret = cls_cxx_map_set_val(hctx, op.name, &new_key_bl);
struct rgw_bucket_category_stats& old_stats = header.stats[cur_disk.meta.category];
CLS_LOG(10, "total_entries: %" PRId64 " -> %" PRId64 "\n", old_stats.num_entries, old_stats.num_entries - 1);
old_stats.num_entries--;
- old_stats.total_size -= cur_disk.meta.size;
- old_stats.total_size_rounded -= get_rounded_size(cur_disk.meta.size);
+ old_stats.total_size -= cur_disk.meta.accounted_size;
+ old_stats.total_size_rounded -= get_rounded_size(cur_disk.meta.accounted_size);
header_changed = true;
}
struct rgw_bucket_category_stats& stats =
case CEPH_RGW_UPDATE:
CLS_LOG(10, "CEPH_RGW_UPDATE name=%s total_entries: %" PRId64 " -> %" PRId64 "\n", cur_change.name.c_str(), stats.num_entries, stats.num_entries + 1);
stats.num_entries++;
- stats.total_size += cur_change.meta.size;
- stats.total_size_rounded += get_rounded_size(cur_change.meta.size);
+ stats.total_size += cur_change.meta.accounted_size;
+ stats.total_size_rounded += get_rounded_size(cur_change.meta.accounted_size);
header_changed = true;
cur_change.index_ver = header.ver;
bufferlist cur_state_bl;
f->dump_string("owner", owner);
f->dump_string("owner_display_name", owner_display_name);
f->dump_string("content_type", content_type);
+ f->dump_unsigned("accounted_size", accounted_size);
}
void rgw_bucket_dir_entry::generate_test_instances(list<rgw_bucket_dir_entry*>& o)
string owner;
string owner_display_name;
string content_type;
+ uint64_t accounted_size;
rgw_bucket_dir_entry_meta() :
- category(0), size(0) { mtime.set_from_double(0); }
+ category(0), size(0), accounted_size(0) { mtime.set_from_double(0); }
void encode(bufferlist &bl) const {
- ENCODE_START(3, 3, bl);
+ ENCODE_START(4, 3, bl);
::encode(category, bl);
::encode(size, bl);
::encode(mtime, bl);
::encode(owner, bl);
::encode(owner_display_name, bl);
::encode(content_type, bl);
+ ::encode(accounted_size, bl);
ENCODE_FINISH(bl);
}
void decode(bufferlist::iterator &bl) {
- DECODE_START_LEGACY_COMPAT_LEN(3, 3, 3, bl);
+ DECODE_START_LEGACY_COMPAT_LEN(4, 3, 3, bl);
::decode(category, bl);
::decode(size, bl);
::decode(mtime, bl);
::decode(owner_display_name, bl);
if (struct_v >= 2)
::decode(content_type, bl);
+ if (struct_v >= 4)
+ ::decode(accounted_size, bl);
+ else
+ accounted_size = size;
DECODE_FINISH(bl);
}
void dump(Formatter *f) const;
public:
bool immutable_head() { return true; }
RGWPutObjProcessor_Multipart(const string& bucket_owner, uint64_t _p, req_state *_s) :
- RGWPutObjProcessor_Atomic(bucket_owner, _s->bucket, _s->object_str, _p, _s->req_id), s(_s) {}
+ RGWPutObjProcessor_Atomic(bucket_owner, _s->bucket, _s->object_str, _p, _s->req_id, false), s(_s) {}
};
int RGWPutObjProcessor_Multipart::prepare(RGWRados *store, void *obj_ctx, string *oid_rand)
const string& bucket_owner = s->bucket_owner.get_id();
if (!multipart) {
- processor = new RGWPutObjProcessor_Atomic(bucket_owner, s->bucket, s->object_str, part_size, s->req_id);
+ processor = new RGWPutObjProcessor_Atomic(bucket_owner, s->bucket, s->object_str, part_size, s->req_id, s->bucket_info.versioning_enabled);
} else {
processor = new RGWPutObjProcessor_Multipart(bucket_owner, part_size, s);
}
uint64_t part_size = s->cct->_conf->rgw_obj_stripe_size;
- processor = new RGWPutObjProcessor_Atomic(s->bucket_owner.get_id(), s->bucket, s->object_str, part_size, s->req_id);
+ processor = new RGWPutObjProcessor_Atomic(s->bucket_owner.get_id(), s->bucket, s->object_str, part_size, s->req_id, s->bucket_info.versioning_enabled);
return processor;
}
extra_params.set_mtime = set_mtime;
extra_params.owner = bucket_owner;
+ if (versioned_object) {
+ rgw_obj ver_head_obj(head_obj.bucket, head_obj.object, "ver");
+
+ r = store->put_obj_meta(NULL, ver_head_obj, obj_len, attrs,
+ RGW_OBJ_CATEGORY_MAIN, PUT_OBJ_CREATE,
+ extra_params);
+ if (r < 0) {
+ return r;
+ }
+ }
+
r = store->put_obj_meta(obj_ctx, head_obj, obj_len, attrs,
RGW_OBJ_CATEGORY_MAIN, PUT_OBJ_CREATE,
extra_params);
append_rand_alpha(cct, tag, tag, 32);
RGWPutObjProcessor_Atomic processor(dest_bucket_info.owner, dest_obj.bucket, dest_obj.object,
- cct->_conf->rgw_obj_stripe_size, tag);
+ cct->_conf->rgw_obj_stripe_size, tag, dest_bucket_info.versioning_enabled);
ret = processor.prepare(this, ctx, NULL);
if (ret < 0)
return ret;
ObjectWriteOperation o;
rgw_bucket_dir_entry_meta dir_meta;
dir_meta.size = ent.size;
+ dir_meta.accounted_size = ent.size;
dir_meta.mtime = utime_t(ent.mtime, 0);
dir_meta.etag = ent.etag;
dir_meta.owner = ent.owner;
bufferlist pending_data_bl;
uint64_t max_chunk_size;
+ bool versioned_object;
+
protected:
rgw_bucket bucket;
string obj_str;
public:
~RGWPutObjProcessor_Atomic() {}
- RGWPutObjProcessor_Atomic(const string& bucket_owner, rgw_bucket& _b, const string& _o, uint64_t _p, const string& _t) :
+ RGWPutObjProcessor_Atomic(const string& bucket_owner, rgw_bucket& _b, const string& _o, uint64_t _p, const string& _t, bool versioned) :
RGWPutObjProcessor_Aio(bucket_owner),
part_size(_p),
cur_part_ofs(0),
data_ofs(0),
extra_data_len(0),
max_chunk_size(0),
+ versioned_object(versioned),
bucket(_b),
obj_str(_o),
unique_tag(_t) {}