1、RGW S3 User使用的類關係圖。數組
cls_user_header和cls_user_bucket_entry從用戶角度看到用戶所擁有的buckets信息,這兩個對象(其中cls_user_bucket_entry以數組的形式出現)須要保存在ceph集羣中。一般在建立/刪除/更新用戶buckets時都須要這兩個類對象。函數
RGwUserBuckets類是RGW User看到的buckets相關信息,實際上RGWBucketEnt和cls_user_bucket_entry類基本一致。ui
上圖表示的是bucket的類關係圖,其中rgw_bucket_dir_header和rgw_bucket_dir_entry這兩個對象(rgw_bucket_dir_entry以數組的形式出現)保存到ceph集羣中。在讀寫buckets時須要用到上述類。spa
上圖描述了RGW User類的主要類及其關係圖。其中核心類是RGWUser,該類表示一個RGW用戶。上述類中RGWUID和RGWUserInfo類須要保存到Ceph集羣。對象
2、RGW User主要函數處理流程。索引
一、同步指定用戶全部buckets的使用信息rem
rgw_user_sync_all_stats() get
|__rgw_read_user_buckets() 讀取指定用戶全部buckets信息並保存到RGWUserBuckets對象中同步
|__rgw_bucket_sync_user_stats() 同步指定用戶全部buckets的使用信息。其實是要更新cls_user_bucket_entry對象,更新結束後將cls_user_bukcet_entry對象寫入到ceph集羣email
|__RGWRados::complete_sysnc_user_stats() 對於未同步完成的操做完成其操做,最後同步更新cls_user_header對象並將該對象寫入到ceph集羣
二、寫指定用戶信息到ceph集羣
rgw_store_user_info()
|__檢查RGWUserInfo中的access_key是否有效(經過access_key獲取RGWUserInfo信息,以後比較獲取到的RGWUserInfo信息與參數傳進來的RGWUserInfo信息是否一致)
|__生成RGWUID對象且以RGWUserInfo.user_id進行初始化
|__以RGWUserInfo.user_id爲key,將RGWUID和RGWUserInfo信息寫入到user metadata pool中
|__以RGWUserInfo.user_email爲key,將RGWUID信息寫入到user email pool中
|__以RGWUserInfo::RGWAccessKey.id爲key,將RGWUID信息寫入到user keys pool中
三、經過用戶index信息讀取RGWUserInfo信息
rgw_get_user_info_from_index()
|__rgw_get_system_obj() 經過指定用戶的index獲得RGWUID對象
|__rgw_get_info_by_uid() 經過RGWUID.user_id信息獲得RGWUserInfo信息
|__更新RGW User Info Cache uinfo_cache
四、經過用戶uid信息讀取RGWUserInfo信息
rgw_get_user_info_by_uid()
|__rgw_get_system_obj() 以uid爲key,獲得RGWUID對象和RGWUserInfo對象(使用的pool是user uid pool)
五、經過用戶email信息讀取RGWUserInfo信息
rgw_get_user_info_by_email()
|__rgw_get_user_info_from_index() 以用戶的email爲key,獲得RGWUserInfo對象
六、經過用戶accesskey信息讀取RGWUserInfo信息
rgw_get_user_info_by_access_key()
|__rgw_get_user_info_from_index() 以用戶的access key爲key,獲得RGWUserInfo對象
七、經過用戶uid信息讀取用戶的屬性信息
rgw_get_user_attrs_by_uid()
|__RGWRados::SystemObject::Read.stat()
|__RGWRados::stat_system_obj()
|__RGWRados::get_system_obj_state()
|__RGWRados::get_system_obj_state_impl()
|__RGWRados::raw_obj_stat() 讀取指定對象的屬性信息而且去掉以user.rgw.開頭的屬性值
八、刪除用戶access key索引
rgw_remove_key_index()
|__RGWRados::delete_system_obj()
九、刪除用戶uid索引
rgw_remove_uid_index()
|__rgw_get_user_info_by_uid()
|__RGWRados::meta_mgr::remove_entry() 刪除user的metadata信息
十、刪除用戶email索引
rgw_remove_email_index()
|__RGWRados::delete_system_obj()
十一、刪除用戶
rgw_delete_user()
|__rgw_read_user_buckets() 讀取指定用戶uid所擁有的bucket列表信息
|__rgw_remove_key_index() 刪除以access key爲索引的RGWUseInfo信息
|__RGWRados::delete_system_obj() 刪除以email爲索引的RGWUserInfo信息
|__RGWRados::delete_system_obj() 刪除uid.bucket對象
|__RGWRados::meta_mgr.remove_entry() 刪除用戶的元數據信息