diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-15 22:06:33 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-15 22:06:33 -0700 |
commit | 1113ff02126aecac8c01d9a77221fe11ef693072 (patch) | |
tree | 40b8b4a1fa7f7c0d0d28cc9c92f02ca00a6ccd55 | |
parent | a2cf14fe27a2da54e44b12a373b15b29c89d31b9 (diff) | |
download | ceph-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.cc | 9 | ||||
-rw-r--r-- | src/rgw/rgw_bucket.h | 3 | ||||
-rw-r--r-- | src/rgw/rgw_cache.h | 6 | ||||
-rw-r--r-- | src/rgw/rgw_metadata.cc | 10 | ||||
-rw-r--r-- | src/rgw/rgw_metadata.h | 4 | ||||
-rw-r--r-- | src/rgw/rgw_rados.cc | 32 | ||||
-rw-r--r-- | src/rgw/rgw_rados.h | 17 | ||||
-rw-r--r-- | src/rgw/rgw_swift.cc | 2 | ||||
-rw-r--r-- | src/rgw/rgw_tools.cc | 6 | ||||
-rw-r--r-- | src/rgw/rgw_tools.h | 2 | ||||
-rw-r--r-- | src/rgw/rgw_user.cc | 27 | ||||
-rw-r--r-- | src/rgw/rgw_user.h | 3 |
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) |