summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-06-15 22:06:33 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-06-15 22:06:33 -0700
commit1113ff02126aecac8c01d9a77221fe11ef693072 (patch)
tree40b8b4a1fa7f7c0d0d28cc9c92f02ca00a6ccd55
parenta2cf14fe27a2da54e44b12a373b15b29c89d31b9 (diff)
downloadceph-1113ff02126aecac8c01d9a77221fe11ef693072.tar.gz
rgw: get / set user & bucket meta mtime
also update infrastructure to be able to set mtime on objects Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r--src/rgw/rgw_bucket.cc9
-rw-r--r--src/rgw/rgw_bucket.h3
-rw-r--r--src/rgw/rgw_cache.h6
-rw-r--r--src/rgw/rgw_metadata.cc10
-rw-r--r--src/rgw/rgw_metadata.h4
-rw-r--r--src/rgw/rgw_rados.cc32
-rw-r--r--src/rgw/rgw_rados.h17
-rw-r--r--src/rgw/rgw_swift.cc2
-rw-r--r--src/rgw/rgw_tools.cc6
-rw-r--r--src/rgw/rgw_tools.h2
-rw-r--r--src/rgw/rgw_user.cc27
-rw-r--r--src/rgw/rgw_user.h3
12 files changed, 69 insertions, 52 deletions
diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc
index ae0a23e9a85..7a6423f660b 100644
--- a/src/rgw/rgw_bucket.cc
+++ b/src/rgw/rgw_bucket.cc
@@ -121,8 +121,9 @@ int rgw_remove_user_bucket_info(RGWRados *store, string user_id, rgw_bucket& buc
}
int rgw_bucket_store_info(RGWRados *store, string& bucket_name, bufferlist& bl, bool exclusive,
- map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker) {
- return store->meta_mgr->put_entry(bucket_meta_handler, bucket_name, bl, exclusive, objv_tracker, pattrs);
+ map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker,
+ time_t mtime) {
+ return store->meta_mgr->put_entry(bucket_meta_handler, bucket_name, bl, exclusive, objv_tracker, mtime, pattrs);
}
@@ -1331,7 +1332,7 @@ public:
return 0;
}
- int put(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker, JSONObj *obj) {
+ int put(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker, time_t mtime, JSONObj *obj) {
RGWBucketCompleteInfo bci, old_bci;
decode_json_obj(bci, obj);
@@ -1357,7 +1358,7 @@ public:
bci.info.bucket.index_pool = old_bci.info.bucket.index_pool;
}
- ret = store->put_bucket_info(entry, bci.info, false, &objv_tracker, &bci.attrs);
+ ret = store->put_bucket_info(entry, bci.info, false, &objv_tracker, mtime, &bci.attrs);
if (ret < 0)
return ret;
diff --git a/src/rgw/rgw_bucket.h b/src/rgw/rgw_bucket.h
index 0278b872aa7..4431c77f97e 100644
--- a/src/rgw/rgw_bucket.h
+++ b/src/rgw/rgw_bucket.h
@@ -23,7 +23,8 @@ using namespace std;
extern void rgw_get_buckets_obj(string& user_id, string& buckets_obj_id);
extern int rgw_bucket_store_info(RGWRados *store, string& bucket_name, bufferlist& bl, bool exclusive,
- map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker);
+ map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker,
+ time_t mtime);
extern int rgw_bucket_delete_bucket_obj(RGWRados *store, string& bucket_name, RGWObjVersionTracker& objv_tracker);
diff --git a/src/rgw/rgw_cache.h b/src/rgw/rgw_cache.h
index 6514a6171de..1a36e1a78d2 100644
--- a/src/rgw/rgw_cache.h
+++ b/src/rgw/rgw_cache.h
@@ -199,7 +199,7 @@ public:
map<std::string, bufferlist>& attrs, RGWObjCategory category, int flags,
map<std::string, bufferlist>* rmattrs, const bufferlist *data,
RGWObjManifest *manifest, const string *ptag, list<string> *remove_objs,
- bool modify_version, RGWObjVersionTracker *objv_tracker);
+ bool modify_version, RGWObjVersionTracker *objv_tracker, time_t set_mtime);
int put_obj_data(void *ctx, rgw_obj& obj, const char *data,
off_t ofs, size_t len, bool exclusive);
@@ -379,7 +379,7 @@ int RGWCache<T>::put_obj_meta_impl(void *ctx, rgw_obj& obj, uint64_t size, time_
map<std::string, bufferlist>& attrs, RGWObjCategory category, int flags,
map<std::string, bufferlist>* rmattrs, const bufferlist *data,
RGWObjManifest *manifest, const string *ptag, list<string> *remove_objs,
- bool modify_version, RGWObjVersionTracker *objv_tracker)
+ bool modify_version, RGWObjVersionTracker *objv_tracker, time_t set_mtime)
{
rgw_bucket bucket;
string oid;
@@ -401,7 +401,7 @@ int RGWCache<T>::put_obj_meta_impl(void *ctx, rgw_obj& obj, uint64_t size, time_
}
}
int ret = T::put_obj_meta_impl(ctx, obj, size, mtime, attrs, category, flags, rmattrs, data, manifest, ptag, remove_objs,
- modify_version, objv_tracker);
+ modify_version, objv_tracker, set_mtime);
if (cacheable) {
string name = normal_name(bucket, oid);
if (ret >= 0) {
diff --git a/src/rgw/rgw_metadata.cc b/src/rgw/rgw_metadata.cc
index edf01c8b858..2a90f0d0e0c 100644
--- a/src/rgw/rgw_metadata.cc
+++ b/src/rgw/rgw_metadata.cc
@@ -167,7 +167,7 @@ public:
virtual string get_type() { return string(); }
virtual int get(RGWRados *store, string& entry, RGWMetadataObject **obj) { return -ENOTSUP; }
- virtual int put(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker, JSONObj *obj) { return -ENOTSUP; }
+ virtual int put(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker, time_t mtime, JSONObj *obj) { return -ENOTSUP; }
virtual void get_pool_and_oid(RGWRados *store, string& key, rgw_bucket& bucket, string& oid) {}
@@ -319,16 +319,18 @@ int RGWMetadataManager::put(string& metadata_key, bufferlist& bl)
obj_version *objv = &objv_tracker.write_version;
+ time_t mtime = 0;
JSONDecoder::decode_json("key", metadata_key, &parser);
JSONDecoder::decode_json("ver", *objv, &parser);
+ JSONDecoder::decode_json("mtime", mtime, &parser);
JSONObj *jo = parser.find_obj("data");
if (!jo) {
return -EINVAL;
}
- return handler->put(store, entry, objv_tracker, jo);
+ return handler->put(store, entry, objv_tracker, mtime, jo);
}
int RGWMetadataManager::remove(string& metadata_key)
@@ -510,7 +512,7 @@ int RGWMetadataManager::post_modify(string& section, string& key, RGWMetadataLog
}
int RGWMetadataManager::put_entry(RGWMetadataHandler *handler, string& key, bufferlist& bl, bool exclusive,
- RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs)
+ RGWObjVersionTracker *objv_tracker, time_t mtime, map<string, bufferlist> *pattrs)
{
string section;
RGWMetadataLogData log_data;
@@ -525,7 +527,7 @@ int RGWMetadataManager::put_entry(RGWMetadataHandler *handler, string& key, buff
ret = rgw_put_system_obj(store, bucket, oid,
bl.c_str(), bl.length(), exclusive,
- objv_tracker, pattrs);
+ objv_tracker, mtime, pattrs);
if (ret < 0)
return ret;
diff --git a/src/rgw/rgw_metadata.h b/src/rgw/rgw_metadata.h
index a023b373b10..eaac1fac987 100644
--- a/src/rgw/rgw_metadata.h
+++ b/src/rgw/rgw_metadata.h
@@ -50,7 +50,7 @@ public:
virtual string get_type() = 0;
virtual int get(RGWRados *store, string& entry, RGWMetadataObject **obj) = 0;
- virtual int put(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker, JSONObj *obj) = 0;
+ virtual int put(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker, time_t mtime, JSONObj *obj) = 0;
virtual int remove(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker) = 0;
virtual int list_keys_init(RGWRados *store, void **phandle) = 0;
@@ -129,7 +129,7 @@ public:
RGWMetadataHandler *get_handler(const char *type);
int put_entry(RGWMetadataHandler *handler, string& key, bufferlist& bl, bool exclusive,
- RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs = NULL);
+ RGWObjVersionTracker *objv_tracker, time_t mtime, map<string, bufferlist> *pattrs = NULL);
int remove_entry(RGWMetadataHandler *handler, string& key, RGWObjVersionTracker *objv_tracker);
int set_attr(RGWMetadataHandler *handler, string& key, rgw_obj& obj, string& attr, bufferlist& bl,
RGWObjVersionTracker *objv_tracker);
diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc
index 6e91c8571d2..d6ba18a55a2 100644
--- a/src/rgw/rgw_rados.cc
+++ b/src/rgw/rgw_rados.cc
@@ -132,7 +132,7 @@ int RGWRegion::set_as_default()
::encode(default_info, bl);
- int ret = rgw_put_system_obj(store, pool, oid, bl.c_str(), bl.length(), false, NULL, NULL);
+ int ret = rgw_put_system_obj(store, pool, oid, bl.c_str(), bl.length(), false, NULL, 0, NULL);
if (ret < 0)
return ret;
@@ -236,7 +236,7 @@ int RGWRegion::store_info(bool exclusive)
bufferlist bl;
::encode(*this, bl);
- int ret = rgw_put_system_obj(store, pool, oid, bl.c_str(), bl.length(), exclusive, NULL, NULL);
+ int ret = rgw_put_system_obj(store, pool, oid, bl.c_str(), bl.length(), exclusive, NULL, 0, NULL);
return ret;
}
@@ -315,7 +315,7 @@ int RGWZoneParams::store_info(CephContext *cct, RGWRados *store, RGWRegion& regi
bufferlist bl;
::encode(*this, bl);
- int ret = rgw_put_system_obj(store, pool, oid, bl.c_str(), bl.length(), false, NULL, NULL);
+ int ret = rgw_put_system_obj(store, pool, oid, bl.c_str(), bl.length(), false, NULL, 0, NULL);
return ret;
}
@@ -391,7 +391,7 @@ int RGWRegionMap::store(CephContext *cct, RGWRados *store)
bufferlist bl;
::encode(*this, bl);
- int ret = rgw_put_system_obj(store, pool, oid, bl.c_str(), bl.length(), false, NULL, NULL);
+ int ret = rgw_put_system_obj(store, pool, oid, bl.c_str(), bl.length(), false, NULL, 0, NULL);
return ret;
}
@@ -1735,7 +1735,7 @@ int RGWRados::create_bucket(string& owner, rgw_bucket& bucket,
time(&info.creation_time);
else
info.creation_time = creation_time;
- ret = put_bucket_info(bucket.name, info, exclusive, &objv_tracker, &attrs);
+ ret = put_bucket_info(bucket.name, info, exclusive, &objv_tracker, 0, &attrs);
if (ret == -EEXIST) {
librados::IoCtx index_ctx; // context for new bucket
int r = open_bucket_index_ctx(bucket, index_ctx);
@@ -1961,7 +1961,8 @@ int RGWRados::put_obj_meta_impl(void *ctx, rgw_obj& obj, uint64_t size,
const string *ptag,
list<string> *remove_objs,
bool modify_version,
- RGWObjVersionTracker *objv_tracker)
+ RGWObjVersionTracker *objv_tracker,
+ time_t set_mtime)
{
rgw_bucket bucket;
std::string oid, key;
@@ -1994,6 +1995,11 @@ int RGWRados::put_obj_meta_impl(void *ctx, rgw_obj& obj, uint64_t size,
objv_tracker->prepare_op_for_write(&op);
}
+ if (!set_mtime)
+ time(&set_mtime);
+
+ op.mtime(&set_mtime);
+
if (data) {
/* if we want to overwrite the data, we also want to overwrite the
xattrs, so just remove the object */
@@ -2079,11 +2085,8 @@ int RGWRados::put_obj_meta_impl(void *ctx, rgw_obj& obj, uint64_t size,
if (r < 0)
goto done_cancel;
-
if (mtime) {
- r = io_ctx.stat(oid, NULL, mtime);
- if (r < 0)
- return r;
+ *mtime = set_mtime;
}
return 0;
@@ -2640,7 +2643,7 @@ int RGWRados::set_bucket_owner(rgw_bucket& bucket, ACLOwner& owner)
info.owner = owner.get_id();
- r = put_bucket_info(bucket.name, info, false, &objv_tracker, &attrs);
+ r = put_bucket_info(bucket.name, info, false, &objv_tracker, 0, &attrs);
if (r < 0) {
ldout(cct, 0) << "NOTICE: put_bucket_info on bucket=" << bucket.name << " returned err=" << r << dendl;
return r;
@@ -2678,7 +2681,7 @@ int RGWRados::set_buckets_enabled(vector<rgw_bucket>& buckets, bool enabled)
info.flags |= BUCKET_SUSPENDED;
}
- r = put_bucket_info(bucket.name, info, false, &objv_tracker, &attrs);
+ r = put_bucket_info(bucket.name, info, false, &objv_tracker, 0, &attrs);
if (r < 0) {
ldout(cct, 0) << "NOTICE: put_bucket_info on bucket=" << bucket.name << " returned err=" << r << ", skipping bucket" << dendl;
ret = r;
@@ -4289,13 +4292,14 @@ int RGWRados::get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& inf
return 0;
}
-int RGWRados::put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exclusive, RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs)
+int RGWRados::put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exclusive, RGWObjVersionTracker *objv_tracker,
+ time_t mtime, map<string, bufferlist> *pattrs)
{
bufferlist bl;
::encode(info, bl);
- int ret = rgw_bucket_store_info(this, info.bucket.name, bl, exclusive, pattrs, objv_tracker);
+ int ret = rgw_bucket_store_info(this, info.bucket.name, bl, exclusive, pattrs, objv_tracker, mtime);
return ret;
}
diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h
index 2a2ffe0437a..387e10e9f42 100644
--- a/src/rgw/rgw_rados.h
+++ b/src/rgw/rgw_rados.h
@@ -797,11 +797,12 @@ public:
list<string> *remove_objs;
bool modify_version;
RGWObjVersionTracker *objv_tracker;
+ time_t set_mtime;
PutObjMetaExtraParams() : mtime(NULL), rmattrs(NULL),
data(NULL), manifest(NULL), ptag(NULL),
remove_objs(NULL), modify_version(false),
- objv_tracker(NULL) {}
+ objv_tracker(NULL), set_mtime(0) {}
};
/** Write/overwrite an object to the bucket storage. */
@@ -809,21 +810,22 @@ public:
map<std::string, bufferlist>& attrs, RGWObjCategory category, int flags,
map<std::string, bufferlist>* rmattrs, const bufferlist *data,
RGWObjManifest *manifest, const string *ptag, list<string> *remove_objs,
- bool modify_version, RGWObjVersionTracker *objv_tracker);
+ bool modify_version, RGWObjVersionTracker *objv_tracker,
+ time_t set_mtime /* 0 for don't set */);
virtual int put_obj_meta(void *ctx, rgw_obj& obj, uint64_t size, time_t *mtime,
map<std::string, bufferlist>& attrs, RGWObjCategory category, int flags,
const bufferlist *data = NULL) {
return put_obj_meta_impl(ctx, obj, size, mtime, attrs, category, flags,
NULL, data, NULL, NULL, NULL,
- false, NULL);
+ false, NULL, 0);
}
virtual int put_obj_meta(void *ctx, rgw_obj& obj, uint64_t size, map<std::string, bufferlist>& attrs,
RGWObjCategory category, int flags, PutObjMetaExtraParams& params) {
return put_obj_meta_impl(ctx, obj, size, params.mtime, attrs, category, flags,
params.rmattrs, params.data, params.manifest, params.ptag, params.remove_objs,
- params.modify_version, params.objv_tracker);
+ params.modify_version, params.objv_tracker, params.set_mtime);
}
virtual int put_obj_data(void *ctx, rgw_obj& obj, const char *data,
@@ -832,7 +834,8 @@ public:
off_t ofs, bool exclusive, void **handle);
/* note that put_obj doesn't set category on an object, only use it for none user objects */
int put_system_obj(void *ctx, rgw_obj& obj, const char *data, size_t len, bool exclusive,
- time_t *mtime, map<std::string, bufferlist>& attrs, RGWObjVersionTracker *objv_tracker) {
+ time_t *mtime, map<std::string, bufferlist>& attrs, RGWObjVersionTracker *objv_tracker,
+ time_t set_mtime) {
bufferlist bl;
bl.append(data, len);
int flags = PUT_OBJ_CREATE;
@@ -844,6 +847,7 @@ public:
ep.data = &bl;
ep.modify_version = true;
ep.objv_tracker = objv_tracker;
+ ep.set_mtime = set_mtime;
int ret = put_obj_meta(ctx, obj, len, attrs, RGW_OBJ_CATEGORY_NONE, flags, ep);
return ret;
@@ -1074,7 +1078,8 @@ public:
int get_bucket_stats(rgw_bucket& bucket, uint64_t *bucket_ver, uint64_t *master_ver, map<RGWObjCategory, RGWBucketStats>& stats);
virtual int get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, RGWObjVersionTracker *objv_tracker,
time_t *pmtime, map<string, bufferlist> *pattrs = NULL);
- virtual int put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exclusive, RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs);
+ virtual int put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exclusive, RGWObjVersionTracker *objv_tracker,
+ time_t mtime, map<string, bufferlist> *pattrs);
int cls_rgw_init_index(librados::IoCtx& io_ctx, librados::ObjectWriteOperation& op, string& oid);
int cls_obj_prepare_op(rgw_bucket& bucket, RGWModifyOp op, string& tag,
diff --git a/src/rgw/rgw_swift.cc b/src/rgw/rgw_swift.cc
index 56933b3d722..d42bc579e76 100644
--- a/src/rgw/rgw_swift.cc
+++ b/src/rgw/rgw_swift.cc
@@ -511,7 +511,7 @@ int RGWSwift::update_user_info(RGWRados *store, struct rgw_swift_auth_info *info
user_info.user_id = info->user;
user_info.display_name = info->display_name;
- int ret = rgw_store_user_info(store, user_info, NULL, NULL, true);
+ int ret = rgw_store_user_info(store, user_info, NULL, NULL, 0, true);
if (ret < 0) {
ldout(cct, 0) << "ERROR: failed to store new user's info: ret=" << ret << dendl;
return ret;
diff --git a/src/rgw/rgw_tools.cc b/src/rgw/rgw_tools.cc
index 28cc7ccbb90..95ae52b7941 100644
--- a/src/rgw/rgw_tools.cc
+++ b/src/rgw/rgw_tools.cc
@@ -15,7 +15,7 @@
static map<string, string> ext_mime_map;
int rgw_put_system_obj(RGWRados *rgwstore, rgw_bucket& bucket, string& oid, const char *data, size_t size, bool exclusive,
- RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs)
+ RGWObjVersionTracker *objv_tracker, time_t set_mtime, map<string, bufferlist> *pattrs)
{
map<string,bufferlist> no_attrs;
if (!pattrs)
@@ -23,12 +23,12 @@ int rgw_put_system_obj(RGWRados *rgwstore, rgw_bucket& bucket, string& oid, cons
rgw_obj obj(bucket, oid);
- int ret = rgwstore->put_system_obj(NULL, obj, data, size, exclusive, NULL, *pattrs, objv_tracker);
+ int ret = rgwstore->put_system_obj(NULL, obj, data, size, exclusive, NULL, *pattrs, objv_tracker, set_mtime);
if (ret == -ENOENT) {
ret = rgwstore->create_pool(bucket);
if (ret >= 0)
- ret = rgwstore->put_system_obj(NULL, obj, data, size, exclusive, NULL, *pattrs, objv_tracker);
+ ret = rgwstore->put_system_obj(NULL, obj, data, size, exclusive, NULL, *pattrs, objv_tracker, set_mtime);
}
return ret;
diff --git a/src/rgw/rgw_tools.h b/src/rgw/rgw_tools.h
index 38ec3e8efc0..0c3ba0559c7 100644
--- a/src/rgw/rgw_tools.h
+++ b/src/rgw/rgw_tools.h
@@ -12,7 +12,7 @@ class RGWObjVersionTracker;
struct obj_version;
int rgw_put_system_obj(RGWRados *rgwstore, rgw_bucket& bucket, string& oid, const char *data, size_t size, bool exclusive,
- RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs = NULL);
+ RGWObjVersionTracker *objv_tracker, time_t set_mtime, map<string, bufferlist> *pattrs = NULL);
int rgw_get_system_obj(RGWRados *rgwstore, void *ctx, rgw_bucket& bucket, string& key, bufferlist& bl,
RGWObjVersionTracker *objv_tracker, time_t *pmtime, map<string, bufferlist> *pattrs = NULL);
diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc
index 88a65c192fb..23cfc418674 100644
--- a/src/rgw/rgw_user.cc
+++ b/src/rgw/rgw_user.cc
@@ -45,7 +45,8 @@ bool rgw_user_is_authenticated(RGWUserInfo& info)
* Save the given user information to storage.
* Returns: 0 on success, -ERR# on failure.
*/
-int rgw_store_user_info(RGWRados *store, RGWUserInfo& info, RGWUserInfo *old_info, RGWObjVersionTracker *objv_tracker, bool exclusive)
+int rgw_store_user_info(RGWRados *store, RGWUserInfo& info, RGWUserInfo *old_info,
+ RGWObjVersionTracker *objv_tracker, time_t mtime, bool exclusive)
{
bufferlist bl;
info.encode(bl);
@@ -106,7 +107,7 @@ int rgw_store_user_info(RGWRados *store, RGWUserInfo& info, RGWUserInfo *old_inf
::encode(ui, data_bl);
::encode(info, data_bl);
- ret = store->meta_mgr->put_entry(user_meta_handler, info.user_id, data_bl, exclusive, &ot);
+ ret = store->meta_mgr->put_entry(user_meta_handler, info.user_id, data_bl, exclusive, &ot, mtime);
if (ret < 0)
return ret;
@@ -114,7 +115,7 @@ int rgw_store_user_info(RGWRados *store, RGWUserInfo& info, RGWUserInfo *old_inf
if (!old_info ||
old_info->user_email.compare(info.user_email) != 0) { /* only if new index changed */
ret = rgw_put_system_obj(store, store->zone.user_email_pool, info.user_email,
- link_bl.c_str(), link_bl.length(), exclusive, NULL);
+ link_bl.c_str(), link_bl.length(), exclusive, NULL, 0);
if (ret < 0)
return ret;
}
@@ -129,7 +130,7 @@ int rgw_store_user_info(RGWRados *store, RGWUserInfo& info, RGWUserInfo *old_inf
ret = rgw_put_system_obj(store, store->zone.user_keys_pool, k.id,
link_bl.c_str(), link_bl.length(), exclusive,
- NULL);
+ NULL, 0);
if (ret < 0)
return ret;
}
@@ -143,7 +144,7 @@ int rgw_store_user_info(RGWRados *store, RGWUserInfo& info, RGWUserInfo *old_inf
ret = rgw_put_system_obj(store, store->zone.user_swift_pool, k.id,
link_bl.c_str(), link_bl.length(), exclusive,
- NULL);
+ NULL, 0);
if (ret < 0)
return ret;
}
@@ -1569,7 +1570,7 @@ int RGWUser::update(RGWUserAdminOpState& op_state, std::string *err_msg)
}
if (is_populated()) {
- ret = rgw_store_user_info(store, user_info, &old_info, &op_state.objv, false);
+ ret = rgw_store_user_info(store, user_info, &old_info, &op_state.objv, 0, false);
if (ret < 0) {
set_err_msg(err_msg, "unable to store user info");
return ret;
@@ -1581,7 +1582,7 @@ int RGWUser::update(RGWUserAdminOpState& op_state, std::string *err_msg)
return ret;
}
} else {
- ret = rgw_store_user_info(store, user_info, NULL, &op_state.objv, false);
+ ret = rgw_store_user_info(store, user_info, NULL, &op_state.objv, 0, false);
if (ret < 0) {
set_err_msg(err_msg, "unable to store user info");
return ret;
@@ -2255,8 +2256,9 @@ int RGWUserAdminOp_Caps::remove(RGWRados *store, RGWUserAdminOpState& op_state,
class RGWUserMetadataObject : public RGWMetadataObject {
RGWUserInfo info;
public:
- RGWUserMetadataObject(RGWUserInfo& i, obj_version& v) : info(i) {
+ RGWUserMetadataObject(RGWUserInfo& i, obj_version& v, time_t m) : info(i) {
objv = v;
+ mtime = m;
}
void dump(Formatter *f) const {
@@ -2272,19 +2274,20 @@ public:
RGWUserInfo info;
RGWObjVersionTracker objv_tracker;
+ time_t mtime;
- int ret = rgw_get_user_info_by_uid(store, entry, info, &objv_tracker);
+ int ret = rgw_get_user_info_by_uid(store, entry, info, &objv_tracker, &mtime);
if (ret < 0)
return ret;
- RGWUserMetadataObject *mdo = new RGWUserMetadataObject(info, objv_tracker.read_version);
+ RGWUserMetadataObject *mdo = new RGWUserMetadataObject(info, objv_tracker.read_version, mtime);
*obj = mdo;
return 0;
}
- int put(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker, JSONObj *obj) {
+ int put(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker, time_t mtime, JSONObj *obj) {
RGWUserInfo info;
decode_json_obj(info, obj);
@@ -2295,7 +2298,7 @@ public:
return ret;
- ret = rgw_store_user_info(store, info, &old_info, &objv_tracker, false);
+ ret = rgw_store_user_info(store, info, &old_info, &objv_tracker, mtime, false);
if (ret < 0)
return ret;
diff --git a/src/rgw/rgw_user.h b/src/rgw/rgw_user.h
index 47a4e29e282..9f21c42e554 100644
--- a/src/rgw/rgw_user.h
+++ b/src/rgw/rgw_user.h
@@ -51,7 +51,8 @@ extern bool rgw_user_is_authenticated(RGWUserInfo& info);
* Save the given user information to storage.
* Returns: 0 on success, -ERR# on failure.
*/
-extern int rgw_store_user_info(RGWRados *store, RGWUserInfo& info, RGWUserInfo *old_info, RGWObjVersionTracker *objv_tracker, bool exclusive);
+extern int rgw_store_user_info(RGWRados *store, RGWUserInfo& info, RGWUserInfo *old_info,
+ RGWObjVersionTracker *objv_tracker, time_t mtime, bool exclusive);
/**
* Given an email, finds the user info associated with it.
* returns: 0 on success, -ERR# on failure (including nonexistence)