REMOVE_OBJ,
};
-#define CACHE_FLAG_DATA 0x1
-#define CACHE_FLAG_XATTRS 0x2
-#define CACHE_FLAG_META 0x4
-#define CACHE_FLAG_MODIFY_XATTRS 0x8
+#define CACHE_FLAG_DATA 0x01
+#define CACHE_FLAG_XATTRS 0x02
+#define CACHE_FLAG_META 0x04
+#define CACHE_FLAG_MODIFY_XATTRS 0x08
+#define CACHE_FLAG_OBJV 0x10
#define mydout(v) lsubdout(T::cct, rgw, v)
map<string, bufferlist> xattrs;
map<string, bufferlist> rm_xattrs;
ObjectMetaInfo meta;
+ obj_version version;
ObjectCacheInfo() : status(0), flags(0), epoch(0) {}
void encode(bufferlist& bl) const {
- ENCODE_START(4, 3, bl);
+ ENCODE_START(5, 3, bl);
::encode(status, bl);
::encode(flags, bl);
::encode(data, bl);
::encode(meta, bl);
::encode(rm_xattrs, bl);
::encode(epoch, bl);
+ ::encode(version, bl);
ENCODE_FINISH(bl);
}
void decode(bufferlist::iterator& bl) {
- DECODE_START_LEGACY_COMPAT_LEN(4, 3, 3, bl);
+ DECODE_START_LEGACY_COMPAT_LEN(5, 3, 3, bl);
::decode(status, bl);
::decode(flags, bl);
::decode(data, bl);
::decode(rm_xattrs, bl);
if (struct_v >= 4)
::decode(epoch, bl);
+ if (struct_v >= 5)
+ ::decode(version, bl);
DECODE_FINISH(bl);
}
void dump(Formatter *f) const;
string name = normal_name(obj.bucket, oid);
ObjectCacheInfo info;
- if (cache.get(name, info, CACHE_FLAG_DATA) == 0) {
+
+ uint32_t flags = CACHE_FLAG_DATA;
+ if (objv_tracker)
+ flags |= CACHE_FLAG_OBJV;
+
+ if (cache.get(name, info, flags) == 0) {
if (info.status < 0)
return info.status;
obl.clear();
i.copy_all(obl);
+ if (objv_tracker)
+ objv_tracker->read_version = info.version;
return bl.length();
}
int r = T::get_obj(ctx, objv_tracker, handle, obj, obl, ofs, end);
bufferlist::iterator o = obl.begin();
o.copy_all(bl);
info.status = 0;
- info.flags = CACHE_FLAG_DATA;
+ info.flags = flags;
+ if (objv_tracker) {
+ info.version = objv_tracker->read_version;
+ }
cache.put(name, info);
return r;
}
info.xattrs[attr_name] = bl;
info.status = 0;
info.flags = CACHE_FLAG_MODIFY_XATTRS;
+ if (objv_tracker) {
+ info.version = objv_tracker->write_version;
+ info.flags |= CACHE_FLAG_OBJV;
+ }
}
int ret = T::set_attr(ctx, obj, attr_name, bl, objv_tracker);
if (cacheable) {
info.rm_xattrs = *rmattrs;
info.status = 0;
info.flags = CACHE_FLAG_MODIFY_XATTRS;
+ if (objv_tracker) {
+ info.version = objv_tracker->write_version;
+ info.flags |= CACHE_FLAG_OBJV;
+ }
}
int ret = T::set_attrs(ctx, obj, attrs, rmattrs, objv_tracker);
if (cacheable) {
info.data = *data;
info.flags |= CACHE_FLAG_DATA;
}
+ if (objv_tracker) {
+ info.version = objv_tracker->write_version;
+ info.flags |= CACHE_FLAG_OBJV;
+ }
}
int ret = T::put_obj_meta_impl(ctx, obj, size, mtime, attrs, category, flags, rmattrs, data, manifest, ptag, remove_objs,
modify_version, objv_tracker);
uint64_t epoch;
ObjectCacheInfo info;
- int r = cache.get(name, info, CACHE_FLAG_META | CACHE_FLAG_XATTRS);
+ uint32_t flags = CACHE_FLAG_META | CACHE_FLAG_XATTRS;
+ if (objv_tracker)
+ flags |= CACHE_FLAG_OBJV;
+ int r = cache.get(name, info, flags);
if (r == 0) {
if (info.status < 0)
return info.status;
size = info.meta.size;
mtime = info.meta.mtime;
epoch = info.epoch;
+ if (objv_tracker)
+ objv_tracker->read_version = info.version;
goto done;
}
r = T::obj_stat(ctx, obj, &size, &mtime, &epoch, &info.xattrs, first_chunk, objv_tracker);
info.meta.mtime = mtime;
info.meta.size = size;
info.flags = CACHE_FLAG_META | CACHE_FLAG_XATTRS;
+ if (objv_tracker) {
+ info.flags |= CACHE_FLAG_OBJV;
+ info.version = objv_tracker->read_version;
+ }
cache.put(name, info);
done:
if (psize)
* object: name of the object to get the ACL for.
* Returns: 0 on success, -ERR# otherwise.
*/
-static int get_policy_from_attr(CephContext *cct, RGWRados *store, void *ctx, RGWAccessControlPolicy *policy, rgw_obj& obj)
+static int get_policy_from_attr(CephContext *cct, RGWRados *store, void *ctx, RGWAccessControlPolicy *policy, rgw_obj& obj,
+ RGWObjVersionTracker *objv_tracker)
{
bufferlist bl;
int ret = 0;
if (obj.bucket.name.size()) {
- RGWObjVersionTracker objv_tracker;
- ret = store->get_attr(ctx, obj, RGW_ATTR_ACL, bl, &objv_tracker);
+ ret = store->get_attr(ctx, obj, RGW_ATTR_ACL, bl, objv_tracker);
if (ret >= 0) {
bufferlist::iterator iter = bl.begin();
/* object exists, but policy is broken */
RGWBucketInfo info;
RGWUserInfo uinfo;
- int r = store->get_bucket_info(ctx, obj.bucket.name, info, &objv_tracker);
+ int r = store->get_bucket_info(ctx, obj.bucket.name, info, objv_tracker);
if (r < 0)
goto done;
r = rgw_get_user_info_by_uid(store, info.owner, uinfo);
} else {
obj.init(bucket, oid);
}
- int ret = get_policy_from_attr(s->cct, store, s->obj_ctx, policy, obj);
+ int ret = get_policy_from_attr(s->cct, store, s->obj_ctx, policy, obj, &s->objv_tracker);
if (ret == -ENOENT && object.size()) {
/* object does not exist checking the bucket's ACL to make sure
that we send a proper error code */
RGWAccessControlPolicy bucket_policy(s->cct);
string no_object;
rgw_obj no_obj(bucket, no_object);
- ret = get_policy_from_attr(s->cct, store, s->obj_ctx, &bucket_policy, no_obj);
+ ret = get_policy_from_attr(s->cct, store, s->obj_ctx, &bucket_policy, no_obj, &s->objv_tracker);
if (ret < 0)
return ret;
string& owner = bucket_policy.get_owner().get_id();
RGWBucketInfo bucket_info;
if (s->bucket_name_str.size()) {
- RGWObjVersionTracker objv_tracker;
- ret = store->get_bucket_info(s->obj_ctx, s->bucket_name_str, bucket_info, &objv_tracker);
+ ret = store->get_bucket_info(s->obj_ctx, s->bucket_name_str, bucket_info, &s->objv_tracker);
if (ret < 0) {
ldout(s->cct, 0) << "NOTICE: couldn't get bucket from bucket_name (name=" << s->bucket_name_str << ")" << dendl;
return ret;
if (bucket_name.compare(s->bucket.name) != 0) {
RGWBucketInfo bucket_info;
- RGWObjVersionTracker objv_tracker;
- int r = store->get_bucket_info(NULL, bucket_name, bucket_info, &objv_tracker);
+ int r = store->get_bucket_info(NULL, bucket_name, bucket_info, &s->objv_tracker);
if (r < 0) {
ldout(s->cct, 0) << "could not get bucket info for bucket=" << bucket_name << dendl;
return r;
s->bucket_owner.set_id(s->user.user_id);
s->bucket_owner.set_name(s->user.display_name);
- r = get_policy_from_attr(s->cct, store, s->obj_ctx, &old_policy, obj);
+ r = get_policy_from_attr(s->cct, store, s->obj_ctx, &old_policy, obj, &s->objv_tracker);
if (r >= 0) {
if (old_policy.get_owner().get_id().compare(s->user.user_id) != 0) {
ret = -EEXIST;
*/
RGWBucketInfo info;
map<string, bufferlist> attrs;
- RGWObjVersionTracker objv_tracker;
- int r = store->get_bucket_info(NULL, s->bucket.name, info, &objv_tracker, &attrs);
+ int r = store->get_bucket_info(NULL, s->bucket.name, info, &s->objv_tracker, &attrs);
if (r < 0) {
ldout(s->cct, 0) << "ERROR: get_bucket_info on bucket=" << s->bucket.name << " returned err=" << r << " after create_bucket returned -EEXIST" << dendl;
ret = r;
rgw_get_request_metadata(s, attrs);
- RGWObjVersionTracker objv_tracker;
-
/* no need to track object versioning, need it for bucket's data only */
- RGWObjVersionTracker *ptracker = (s->object ? NULL : &objv_tracker);
+ RGWObjVersionTracker *ptracker = (s->object ? NULL : &s->objv_tracker);
/* check if obj exists, read orig attrs */
ret = get_obj_attrs(store, s, obj, orig_attrs, NULL, ptracker);
*_dout << dendl;
}
- RGWObjVersionTracker objv_tracker;
- RGWObjVersionTracker *ptracker = (s->object ? NULL : &objv_tracker);
+ RGWObjVersionTracker *ptracker = (s->object ? NULL : &s->objv_tracker);
new_policy.encode(bl);
obj.init(s->bucket, s->object_str);
*_dout << dendl;
}
- RGWObjVersionTracker objv_tracker;
- RGWObjVersionTracker *ptracker = (s->object ? NULL : &objv_tracker);
+ RGWObjVersionTracker *ptracker = (s->object ? NULL : &s->objv_tracker);
string no_obj;
cors_config->encode(bl);
map<string, bufferlist> orig_attrs, attrs, rmattrs;
map<string, bufferlist>::iterator iter;
- RGWObjVersionTracker objv_tracker;
- RGWObjVersionTracker *ptracker = (s->object ? NULL : &objv_tracker);
+ RGWObjVersionTracker *ptracker = (s->object ? NULL : &s->objv_tracker);
/* check if obj exists, read orig attrs */
ret = get_obj_attrs(store, s, obj, orig_attrs, NULL, ptracker);