rgw_lc.h
class RGWLC
1. 有rgw_lc_max_objs(32)个lc_process用于处理过期object
2. 每个lc_process每天只运行一次
3. 若用于测试需要运行多次,则可设置rgw_lc_debug_interval(n),即每隔n秒,32个lc_process都运行一次,过期时间=设置的days * n秒
4. 若重启rgw服务,记录lc_process的遍历bucket的进度标志maker是否会归0?,若归0则今天重启前已经遍历过的未过期object如今已经满足条件内则该过期object会被删除,否则得明天的lc_process遍历
rgw_lc_s3.cc
1.data和days不能同时设置
2.(data或者days)与ExpiredObjectDeleteMarker 不能同时设置
3.ExpiredObjectDeleteMarker 不能设置为False
4.如果设置了Filter,则Prefix参数将不生效,在以后的版本很可能将弃用Prefix参数
5.Expiration、NoncurrentVersionExpiration、AbortIncompleteMultipartUpload至少设置一个
6.任意2个rule的prefix不能相同(和代码写的不同)
rgw_lc.cc
lc 是如何工作的:
1.RGWLC::LCWorker::entry()启动线程:计算时间满足条件则调用lc->process()处理任务,处理完计算睡眠时间,sleep结束后再如此反复,直到遇到退出信号
2.lc->process()依次启动各个线程,默认32个,用对象lc.x来记录start_time和marker
3.RGWLC::process(int index, int max_lock_secs)就是具体处理各个lc.x的函数
(1)查看lc.x->start_time,今天没运行过,置lc.x->start_time=now,marker=None,并把该lc.x里所有bucket的lc status置为=lc_uninitial,即要遍历各个bucket执行任务,否则今天运行过的,则按marker标记,遍历剩下的bucket执行任务即可
(2)把lc.x->marker之后的一个bucket的lc status置为=lc_processing
(3)把lc.x->marker更新为当前正在处理的bucket
(4)开始处理该bucket ,调用bucket_lc_process()
(5)重复2~4直到lc.x里的bucket都吹完了
bucket_lc_process是如何工作的:
1.获取bucket信息,从bucket attrs里读出lc的配置,读prefix_map=list<prefix, lc配置>
2.若是多版本关闭状态的bucket:
(1) 若rule.status !=enable,或者没设置expiration.days/date则跳过该rule
(2) 若expiration.date !=None, 但当前时间<expiration.date ,则跳过该rule
(3) 根据frefix为筛选项,调用list_objects列出所有满足条件的obj,每次读1000个,循环读取
(4) 依次判断各个obj是否需要删除:
a. 若是expiration.date !=None, 且当前时间>expiration.date,则列出的obj都要删除,否则还需其它判断
b. 若不满足a,若是非调试模式,当前时间-obj的创建时间> expiration.days,则obj需要删除
c. 若不满足a/b,若当前是调试模式(conf.rgw_lc_debug_interval>0)则当前时间-obj的创建时间> expiration.days *rgw_lc_debug_interval,则obj需要删除
d. 若需要删除,则删除该obj
3.若是多版本打开/暂停状态的bucket:
(1)若rule.status !=enable,或者(没设置expiration.days/date 且没设置noncur_expiration且没设置noncur_expiration)则跳过该rule
(2)根据frefix为筛选项,调用list_objects列出所有满足条件的obj,每次读1000个,循环读取
(3)依次判断各个obj是否需要删除:
a.若该obj是最新版本obj,若没有设置expiration.days/date且没设置dm_expiration,则该obj不需要删除;
b.若该obj是最新版本obj,且是delete_marker;如果该obj是list_objects的最后一个obj,但是list_object.is_truncated !=False,则有可能该obj不是唯一版本,暂不操作;否则可以通过和后一个obj比较判断该obj是否是唯一最新版本,不是唯一则跳过该obj不处理;否则是唯一最新版本delete_marker则remove_indeed = true,is_expired = dm_expiration
c.若该obj是最新版本obj,且不是delete_marker则remove_indeed = False,根据obj的创建时间判断是否需要删除,需要删除则is_expired = True
d.若该obj不是最新版本,若没有设置noncur_expiration,则该obj不需要删除;否则判断是否需要删除,令remove_indeed = True,用该obj的更新一个版本的创建时间做比较来判断该obj是否需要删除,需要删除则is_expired = True
e.更具前几步骤b/c/d,若is_expired ==True则删除该obj,若remove_indeed == true则真删除,remove_indeed ==False则假删除生成一个delete_marker即可
4.处理完一般obj的过期删除处理后开始对未完成分段上传的obj的处理,依次根据设置了mp_expiration的rule来处理
(1)根据frefix为筛选项,调用list_objects列出所有满足条件的obj,每次读1000个,循环读取
(2)依次判断各个obj是否需要删除
(3)根据obj的创建时间来判断是否需要删除
(4)符合3需要需要删除,还要根据obj.name来判断是否是分段上传的对象,若不是,则跳过该obj
(1)若根据3,4判断是需要删除的过期的分段上传obj,则调用abort_multipart_upload()删除