RGW S3 GC類的主要功能是提供垃圾收集器的功能。用於異步刪除對象。數組
1、RGW S3 GC核心類關係圖異步
2、RGW S3 GC核心數據類關係圖函數
3、RGW S3 GC主要處理函數解析。線程
一、RGWGC初始化操做。code
RGWGC::initialize()對象
|__設置cct和store類對象rem
|__從配置文件中獲得gc最大對象個數,即:rgw_gc_max_objsget
|__根據gc最大對象個數生成obj_names數組且初始化該數組的內容爲gc.0-rgw_gc_max_objsit
二、RGWGC終止操做。io
RGWGC::finalize()
|__刪除obj_names數組
三、添加chain。
RGWGC::add_chain()
|__cls_rgw_gc_set_entry()
|__rgw_cls_gc_set_entry()
|__gc_update_entry()
|__gc_omap_get()
|__cls_cxx_map_get_val() 以名字爲key,獲得Ceph集羣中已經保存的cls_rgw_gc_obj_info信息(CEPH_OSD_OP_OMAPGETVALSBYKEYS)
|__get_time_key() 獲得time key
|__gc_omap_remove()
|__cls_cxx_map_remove_key() 刪除指定time key的值(CEPH_OSD_OMAPRMKEYS)
|__gc_omap_set()
|__cls_cxx_map_set_val() 以名字爲key,設置cls_rgw_gc_obj_info信息到Ceph集羣(CEPH_OSD_OP_OMAPSETVALS)
|__get_time_key() 獲得time key
|__gc_omap_set() 以time爲key,設置cls_rgw_gc_obj_info信息到Ceph集羣(CEPH_OSD_OP_OMAPSETVALS)
四、發送chain。
RGWGC::send_chain()
|__RGWGC::add_chain()
|__RGWGC::tag_index()
|__RGWRados::gc_operate()
五、更新chain。
RGWGC::defer_chain()
|__cls_rgw_gc_defer_entry()
|__rgw_cls_gc_defer_entry()
|__gc_defer_entry()
|__gc_omap_get() 以名字爲key,獲得cls_rgw_gc_obj_info信息
|__gc_update_entry() 以cls_rgw_gc_obj_info和更新的expiration_secs爲參數,更新Ceph集羣中的以名字和time爲key的cls_rgw_gc_obj_info信息
|__RGWGC::tag_index()
|__RGWRados::gc_operate()
六、刪除chain。
RGWGC::remove()
|__cls_rgw_gc_remove()
|__rgw_cls_gc_remove()
|__gc_remove()
|__gc_omap_get() 以名字爲key,獲得cls_rgw_gc_obj_info信息
|__get_time_key() 獲得time key
|__gc_omap_remove() 刪除以time爲key的cls_rgw_gc_obj_info信息
|__gc_omap_remove() 刪除以名字爲key的cls_rgw_gc_obj_info信息
|__RGWRados::gc_operate()
七、列出chain。
RGWGC::list()
|__cls_rgw_gc_list()
|__rgw_cls_gc_list()
|__gc_list_entries()
|__gc_iterate_entries()
|__prepend_index_prefix() 獲得以time爲key的key
|__cls_cxx_map_get_vals() 獲得以time爲key的全部cls_rgw_gc_obj_info信息
|__gc_record_decode() 解析獲得cls_rgw_gc_obj_info信息
|__gc_list_cb() 將獲得的cls_rgw_gc_obj_info信息插入到列表中
八、處理chain。
RGWGC::process()
|__cls_rgw_gc_list() 獲得obj_names[i]對應的全部cls_rgw_gc_obj_info信息
|__遍歷cls_rgw_gc_obj_info信息中全部的cls_rgw_obj,調用cls_refcount_put()
|__cls_rc_refcount_put()
|__read_refcount() 獲得對象對應的引用計數
|__obj_refcount::refs.erase() 減少對象的引用計數
|__對於引用計數爲零,則調用cls_cxx_remove() 從Ceph集羣中刪除對象(CEPH_OSD_OP_DELETE)
|__對於引用計數非零,則調用set_refcount() 更新對象的引用計數
九、RGWGC處理線程主函數。
RGWGC::GCWorker::entry()
|__RGWGC::process()