From: Radoslaw Zarzynski Date: Wed, 1 Apr 2015 15:49:50 +0000 (+0200) Subject: rgw: implement base for inter-region account metadata. X-Git-Tag: v9.0.3~179^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=10b882b10ac1b54274b36516df2c5860d0a4c29c;p=ceph.git rgw: implement base for inter-region account metadata. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc index 24b72fb8572..c2d037a31e5 100644 --- a/src/rgw/rgw_user.cc +++ b/src/rgw/rgw_user.cc @@ -89,8 +89,13 @@ int rgw_user_sync_all_stats(RGWRados *store, const string& user_id) * 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, time_t mtime, bool exclusive) +int rgw_store_user_info(RGWRados *store, + RGWUserInfo& info, + RGWUserInfo *old_info, + RGWObjVersionTracker *objv_tracker, + time_t mtime, + bool exclusive, + map *pattrs) { bufferlist bl; info.encode(bl); @@ -151,7 +156,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, mtime); + ret = store->meta_mgr->put_entry(user_meta_handler, info.user_id, data_bl, exclusive, &ot, mtime, pattrs); if (ret < 0) return ret; @@ -196,6 +201,18 @@ int rgw_store_user_info(RGWRados *store, RGWUserInfo& info, RGWUserInfo *old_inf return ret; } +int rgw_store_user_attrs(RGWRados *const store, + string& user_id, + map& attrs, + map* const rmattrs, + RGWObjVersionTracker * const objv_tracker) +{ + rgw_obj obj(store->zone.user_uid_pool, user_id); + + return store->meta_mgr->set_attrs(user_meta_handler, user_id, obj, + attrs, rmattrs, objv_tracker); +} + struct user_info_entry { RGWUserInfo info; RGWObjVersionTracker objv_tracker; @@ -257,17 +274,22 @@ int rgw_get_user_info_from_index(RGWRados *store, string& key, rgw_bucket& bucke * Given a uid, finds the user info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ -int rgw_get_user_info_by_uid(RGWRados *store, string& uid, RGWUserInfo& info, - RGWObjVersionTracker *objv_tracker, time_t *pmtime, - rgw_cache_entry_info *cache_info) +int rgw_get_user_info_by_uid(RGWRados *store, + string& uid, + RGWUserInfo& info, + RGWObjVersionTracker *objv_tracker, + time_t *pmtime, + rgw_cache_entry_info *cache_info, + map *pattrs) { bufferlist bl; RGWUID user_id; RGWObjectCtx obj_ctx(store); - int ret = rgw_get_system_obj(store, obj_ctx, store->zone.user_uid_pool, uid, bl, objv_tracker, pmtime, NULL, cache_info); - if (ret < 0) + int ret = rgw_get_system_obj(store, obj_ctx, store->zone.user_uid_pool, uid, bl, objv_tracker, pmtime, pattrs, cache_info); + if (ret < 0) { return ret; + } bufferlist::iterator iter = bl.begin(); try { @@ -317,6 +339,20 @@ extern int rgw_get_user_info_by_access_key(RGWRados *store, string& access_key, return rgw_get_user_info_from_index(store, access_key, store->zone.user_keys_pool, info, objv_tracker, pmtime); } +int rgw_get_user_attrs_by_uid(RGWRados *store, + const string& user_id, + map& attrs, + RGWObjVersionTracker *objv_tracker) +{ + RGWObjectCtx obj_ctx(store); + rgw_obj obj(store->zone.user_uid_pool, user_id); + RGWRados::SystemObject src(store, obj_ctx, obj); + RGWRados::SystemObject::Read rop(&src); + + rop.stat_params.attrs = &attrs; + return rop.stat(objv_tracker); +} + int rgw_remove_key_index(RGWRados *store, RGWAccessKey& access_key) { rgw_obj obj(store->zone.user_keys_pool, access_key.id); @@ -2389,16 +2425,37 @@ int RGWUserAdminOp_Caps::remove(RGWRados *store, RGWUserAdminOpState& op_state, return 0; } -class RGWUserMetadataObject : public RGWMetadataObject { +struct RGWUserCompleteInfo { RGWUserInfo info; + map attrs; + bool has_attrs; + + RGWUserCompleteInfo() + : has_attrs(false) + {} + + void dump(Formatter * const f) const { + info.dump(f); + encode_json("attrs", attrs, f); + } + + void decode_json(JSONObj *obj) { + decode_json_obj(info, obj); + has_attrs = JSONDecoder::decode_json("attrs", attrs, obj); + } +}; + +class RGWUserMetadataObject : public RGWMetadataObject { + RGWUserCompleteInfo uci; public: - RGWUserMetadataObject(RGWUserInfo& i, obj_version& v, time_t m) : info(i) { + RGWUserMetadataObject(const RGWUserCompleteInfo& _uci, obj_version& v, time_t m) + : uci(_uci) { objv = v; mtime = m; } void dump(Formatter *f) const { - info.dump(f); + uci.dump(f); } }; @@ -2407,17 +2464,17 @@ public: string get_type() { return "user"; } int get(RGWRados *store, string& entry, RGWMetadataObject **obj) { - RGWUserInfo info; - + RGWUserCompleteInfo uci; RGWObjVersionTracker objv_tracker; time_t mtime; - int ret = rgw_get_user_info_by_uid(store, entry, info, &objv_tracker, &mtime); - if (ret < 0) + int ret = rgw_get_user_info_by_uid(store, entry, uci.info, &objv_tracker, + &mtime, NULL, &uci.attrs); + if (ret < 0) { return ret; + } - RGWUserMetadataObject *mdo = new RGWUserMetadataObject(info, objv_tracker.read_version, mtime); - + RGWUserMetadataObject *mdo = new RGWUserMetadataObject(uci, objv_tracker.read_version, mtime); *obj = mdo; return 0; @@ -2425,9 +2482,14 @@ public: int put(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker, time_t mtime, JSONObj *obj, sync_type_t sync_mode) { - RGWUserInfo info; + RGWUserCompleteInfo uci; - decode_json_obj(info, obj); + decode_json_obj(uci, obj); + + map *pattrs = NULL; + if (uci.has_attrs) { + pattrs = &uci.attrs; + } RGWUserInfo old_info; time_t orig_mtime; @@ -2442,9 +2504,10 @@ public: return STATUS_NO_APPLY; } - ret = rgw_store_user_info(store, info, &old_info, &objv_tracker, mtime, false); - if (ret < 0) + ret = rgw_store_user_info(store, uci.info, &old_info, &objv_tracker, mtime, false, pattrs); + if (ret < 0) { return ret; + } return STATUS_APPLIED; } diff --git a/src/rgw/rgw_user.h b/src/rgw/rgw_user.h index 6204b096732..1d01d5a81ca 100644 --- a/src/rgw/rgw_user.h +++ b/src/rgw/rgw_user.h @@ -55,15 +55,35 @@ 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, time_t mtime, bool exclusive); +extern int rgw_store_user_info(RGWRados *store, + RGWUserInfo& info, + RGWUserInfo *old_info, + RGWObjVersionTracker *objv_tracker, + time_t mtime, + bool exclusive, + map *pattrs = NULL); +/** + * Save the custom user metadata given in @attrs and delete those in @rmattrs + * for user specified in @user_id. + * Returns: 0 on success, -ERR# on failure. + */ +extern int rgw_store_user_attrs(RGWRados *store, + string& user_id, + map& attrs, + map* rmattrs, + RGWObjVersionTracker *objv_tracker); + /** * Given an email, finds the user info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ -extern int rgw_get_user_info_by_uid(RGWRados *store, string& user_id, RGWUserInfo& info, - RGWObjVersionTracker *objv_tracker = NULL, time_t *pmtime = NULL, - rgw_cache_entry_info *cache_info = NULL); +extern int rgw_get_user_info_by_uid(RGWRados *store, + string& user_id, + RGWUserInfo& info, + RGWObjVersionTracker *objv_tracker = NULL, + time_t *pmtime = NULL, + rgw_cache_entry_info *cache_info = NULL, + map *pattrs = NULL); /** * Given an swift username, finds the user info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) @@ -82,6 +102,15 @@ extern int rgw_get_user_info_by_swift(RGWRados *store, string& swift_name, RGWUs */ extern int rgw_get_user_info_by_access_key(RGWRados *store, string& access_key, RGWUserInfo& info, RGWObjVersionTracker *objv_tracker = NULL, time_t *pmtime = NULL); +/** + * Get all the custom metadata stored for user specified in @user_id + * and put it into @attrs. + * Returns: 0 on success, -ERR# on failure. + */ +extern int rgw_get_user_attrs_by_uid(RGWRados *store, + const string& user_id, + map& attrs, + RGWObjVersionTracker *objv_tracker = NULL); /** * Given an RGWUserInfo, deletes the user and its bucket ACLs. */