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() 删除用户的元数据信息