ceph rgw lc工作流程

2021-09-25 03:11:45 字數 4829 閱讀 1031

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.cc1.

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配置

>

2.若是多版本關閉狀態的bucket:

(1) 

若rule.status !=enable,

或者沒設定

expiration.days/date

則跳過該

rule

(2) 

若expiration.date !=none,

但當前時間

則跳過該

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()

刪除

Struts工作流程

文章分類 招聘求職 乙個使用者的請求是通actionservlet來處理和 的。那麼,actionservlet如何決定把使用者請求 給哪個action物件呢?這就需要一些描述使用者請求路徑和action衍射關係的配置資訊了。在struts中,這些配置對映資訊都儲存在特定的xml檔案struts c...

zf工作流程

zend controller是使用mvc模式來構建乙個站點的基礎。zend controller體系是乙個輕量的,模組化和可擴充套件的體系。它只提供最核心的必要的部分,允許開發者有很大的自由來靈活地構建自己的站點。使用zend controller的站點,其檔案組織和 結構會比較相似。zend c...

spring MVC 工作流程

1 首先來配置一下dispatcherservlet spring mvc和大部分mvc框架一樣,底層也是依賴servlet api的,所以spring mvc的請求處理也是從乙個servlet開始,這個servlet就是dispatcherservlet.以下是在web.xml中dispatche...