亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種并行重放文件系統(tǒng)重做日志的方法與流程

文檔序號:12364179閱讀:262來源:國知局

本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域。更具體地,涉及一種并行重放文件系統(tǒng)重做日志的方法。



背景技術(shù):

計(jì)算機(jī)的文件系統(tǒng)在不同的領(lǐng)域廣泛使用了重做日志(redo log)技術(shù)來實(shí)現(xiàn)文件系統(tǒng)數(shù)據(jù)恢復(fù)、文件系統(tǒng)遠(yuǎn)程鏡像、文件系統(tǒng)元數(shù)據(jù)復(fù)制等各種不同的目的。文件系統(tǒng)寫前日志(WAL)/企圖日志(Intent Long)是重做日志的一種形態(tài),為了保證文件系統(tǒng)數(shù)據(jù)和元數(shù)據(jù)的一致性,文件系統(tǒng)會在更新操作真正應(yīng)用到文件系統(tǒng)之前,先將所有涉及此次更新的所有文件系統(tǒng)修改以日志條目的形式持久化追加到文件系統(tǒng)中去,當(dāng)這些更新真正應(yīng)用到文件系統(tǒng)中后,相關(guān)的日志條目才可以被系統(tǒng)回收。如果文件系統(tǒng)由于各種原因(如,機(jī)器異常重啟,硬盤異常掉線)導(dǎo)致異常下線,文件系統(tǒng)重新掛載時(shí)需要將還沒有應(yīng)用到文件系統(tǒng)中的日志條目重放(replay),保證所有的更新,原子的應(yīng)用到文件系統(tǒng)中;有些文件系統(tǒng)會將所有的元數(shù)據(jù)更新動作作為重做日志(redo log)的形式保留下來,重放(replay)日志條目到遠(yuǎn)端的鏡像站點(diǎn)來達(dá)到文件系統(tǒng)遠(yuǎn)程鏡像的目的;還有些文件系統(tǒng)會利用重做日志,通過將所有的日志重放,將文件系統(tǒng)的數(shù)據(jù)特征(文件系統(tǒng)元數(shù)據(jù))復(fù)制到另外的檢索系統(tǒng)中,從而達(dá)到數(shù)據(jù)特征管理、分析的目的。

其中重做日志(redo log)的重放(replay)效率直接決定了文件系統(tǒng)數(shù)據(jù)恢復(fù)的速度,或者文件系統(tǒng)遠(yuǎn)程鏡像和元數(shù)據(jù)復(fù)制的性能。

redo log通常是以順序追加的方式不斷的追加在文件系統(tǒng)重做日志的尾端,重做日志的客戶端(如文件系統(tǒng)恢復(fù)程序、文件系統(tǒng)鏡像軟件)順序的讀取每一個(gè)重做日志條目,并且逐條重放(replay)重做日志到目標(biāo)系統(tǒng)中去。

當(dāng)文件系統(tǒng)變化頻繁,并且重做日志的客戶端重放重做日志條目的速度小于日志追加速度的時(shí)候(比如重放日志到遠(yuǎn)端的鏡像站點(diǎn)),重做日志會越來越長,占用越來越多的存儲空間。并且緩慢的重放重做日志會影響文件系統(tǒng)重做日志客戶端應(yīng)用的性能。

如果文件系統(tǒng)擁有大量的小文件和密集的元數(shù)據(jù)更新操作(創(chuàng)建、刪除、修改操作),那么對重做日志系統(tǒng)而言,單線程順序的逐條重放重做日志條目,無法充分的利用計(jì)算機(jī)的并行資源,因而效率低下,加重了重做日志系統(tǒng)的負(fù)擔(dān)。而并行重放重做日志并不易實(shí)現(xiàn),原因是文件系統(tǒng)的多個(gè)元數(shù)據(jù)更新動作之間是有依賴關(guān)系的。比如一個(gè)文件的修改,第一次改成A,第二次改成B,這兩個(gè)改動要保證更新順序才能維護(hù)文件系統(tǒng)數(shù)據(jù)的正確性。再比如,文件系統(tǒng)多個(gè)對象的更新操作之間也是有關(guān)聯(lián)關(guān)系的,目錄創(chuàng)建和目錄下文件的創(chuàng)建和修改的動作也必須保證順序執(zhí)行,否則將破壞文件系統(tǒng)的一致性。

因此,需要提供一種并行重放文件系統(tǒng)重做日志的方法。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明的目的在于提供一種并行重放文件系統(tǒng)重做日志的方法,可以由多個(gè)工作線程并行重放文件系統(tǒng)的重做日志,有效的提高了文件系統(tǒng)重做日志的重放效率。

為達(dá)到上述目的,本發(fā)明采用下述技術(shù)方案:

一種并行重放文件系統(tǒng)重做日志的方法,包括如下步驟:

步驟1、利用一個(gè)讀日志線程從文件系統(tǒng)的重做日志中按序逐條讀取重做日志條目,并將重做日志條目順序追加到一個(gè)更新動作鏈表中;

步驟2、利用多個(gè)重放工作線程按重做日志條目在更新動作鏈表中的順序掃描更新動作鏈表,判斷是否存在未處理的重做日志條目:

如果存在,則重放工作線程按重做日志條目在更新動作鏈表中的順序分別取出更新動作鏈表中的一個(gè)重做日志條目,并按照保證元數(shù)據(jù)更新動作之間邏輯關(guān)系正確的原則判斷該重放工作線程讀取的重做日志條目是否可執(zhí)行重放:如是,則該重放工作線程重放讀取的重做日志條目;如否,則該重放工作線程掛起讀取的重做日志條目直到該重放工作線程被其他的工作線程喚醒;

如果不存在,則重放工作線程重復(fù)按重做日志條目在更新動作鏈表中的順序掃描更新動作鏈表直到存在未處理的重做日志條目;

步驟3、完成重放其讀取的重做日志條目的重放工作線程判斷是否有等待該重做日志條目中包含的文件系統(tǒng)的元數(shù)據(jù)更新動作完成的其他文件系統(tǒng)的元數(shù)據(jù)更新動作對應(yīng)的重做日志條目可被喚醒執(zhí)行:如是,則該重放工作線程喚醒可被喚醒執(zhí)行的重做日志條目的重放工作線程重放讀取的重做日志條目,轉(zhuǎn)入步驟4;如否,則轉(zhuǎn)入步驟4;

步驟4、完成重放其讀取的重做日志條目的重放工作線程重新按重做日志條目在更新動作鏈表中的順序掃描更新動作鏈表。

優(yōu)選地,一個(gè)重做日志條目中包含一個(gè)文件系統(tǒng)的元數(shù)據(jù)更新動作及該元數(shù)據(jù)更新動作所涉及的對象和元數(shù)據(jù)。

優(yōu)選地,所述對象包括文件對象、符號鏈接對象、目錄對象、節(jié)點(diǎn)對象和鏈接對象,所述目錄對象包括子對象。

優(yōu)選地,重做日志條目中包含的文件系統(tǒng)的元數(shù)據(jù)更新動作如下幾個(gè)類型:

創(chuàng)建目錄操作;創(chuàng)建文件、符號鏈接、鏈接或節(jié)點(diǎn)操作;刪除文件、鏈接、符號鏈接或節(jié)點(diǎn)操作;刪除目錄操作;所有涉及到屬性修改的操作;其他文件系統(tǒng)更新操作。

優(yōu)選地,步驟2中,在重放工作線程按重做日志條目在更新動作鏈表中的順序分別取出更新動作鏈表中的一個(gè)重做日志條目之后且在并按照保證元數(shù)據(jù)更新動作之間邏輯關(guān)系正確的原則判斷該重放工作線程讀取的重做日志條目是否可執(zhí)行重放之前還包括如下步驟:

重放工作線程判斷該重放工作線程讀取的重做日志條目中包含的文件系統(tǒng)的元數(shù)據(jù)更新動作所涉及的對象是否存在描述符:如果描述符已存在,則重放工作線程獲取相應(yīng)描述符,如果描述符不存在則重放工作線程為該對象新創(chuàng)建一個(gè)描述符;

所述描述符包括:

一個(gè)等待隊(duì)列,用來描述等待在這個(gè)對象上的所有未重放的更新動作;

多個(gè)標(biāo)志位,描述對象當(dāng)前的狀態(tài);

對于目錄對象,設(shè)置一個(gè)計(jì)數(shù)器,記錄等待刪除的目錄對象的子對象個(gè)數(shù)。

優(yōu)選地,按照保證元數(shù)據(jù)更新動作之間邏輯關(guān)系正確的原則判斷該重放工作線程讀取的重做日志條目是否可執(zhí)行重放的具體方法如下:

對于創(chuàng)建文件、符號鏈接、鏈接或節(jié)點(diǎn)操作和創(chuàng)建目錄操作:為更新動作所涉及的對象的描述符設(shè)置正在創(chuàng)建標(biāo)記,描述此對象正在被創(chuàng)建;如果父目錄創(chuàng)建還沒有重放成功,即該對象的父對象的描述符設(shè)置了正在創(chuàng)建標(biāo)記,則該重做日志條目不可執(zhí)行重放,為該更新動作設(shè)置等待父對象創(chuàng)建標(biāo)記,并將該更新動作加入父對象的等待隊(duì)列上;否則,該重做日志條目可執(zhí)行重放;

對于刪除文件、鏈接、符號鏈接或節(jié)點(diǎn)操作:為更新動作所涉及的對象描述符設(shè)置正在刪除標(biāo)記;找到該對象的父對象的描述符,為其待刪除的子對象計(jì)數(shù)器加一;如果該對象正在創(chuàng)建或該對象的等待隊(duì)列不為空,則該重做日志條目不可執(zhí)行重放,為該更新動作設(shè)置等待處理標(biāo)記,將該更新動作加入到該對象的等待隊(duì)列中;否則,該重做日志條目可執(zhí)行重放;

對于刪除目錄操作:為更新動作所涉及的對象描述符設(shè)置正在刪除標(biāo)記;找到該對象的父對象的描述符,為其待刪除的子對象計(jì)數(shù)器加一;如果該對象正在創(chuàng)建或者該對象的等待隊(duì)列不為空,則該重做日志條目不可執(zhí)行重放,為該更新動作設(shè)置等待處理標(biāo)記,將該更新動作加入到該對象的等待隊(duì)列中;如果該對象的子對象沒有全部被刪除光,即正在刪除的子對象隊(duì)列不為0,則為該更新動作設(shè)置等待子對象刪除標(biāo)記并將該更新動作加入到該對象的等待隊(duì)列;否則該重做日志條目可執(zhí)行重放;

對于所有涉及到屬性修改的操作和其他文件系統(tǒng)更新操作:如果更新動作所涉及的對象正在創(chuàng)建或者該對象的等待隊(duì)列不為空,則該重做日志條目不可執(zhí)行重放,為該更新動作設(shè)置等待處理標(biāo)記,將該更新動作加入到該對象的等待隊(duì)列中去;否則,該重做日志條目可執(zhí)行重放。

優(yōu)選地,步驟3中完成重放其讀取的重做日志條目的重放工作線程判斷是否有等待該重做日志條目中包含的文件系統(tǒng)的元數(shù)據(jù)更新動作完成的其他文件系統(tǒng)的元數(shù)據(jù)更新動作對應(yīng)的重做日志條目可被喚醒執(zhí)行:如是,則該重放工作線程喚醒可被喚醒執(zhí)行的重做日志條目的重放工作線程重放讀取的重做日志條目的具體過程為:

對于創(chuàng)建目錄操作:清除所涉及的對象的正在創(chuàng)建標(biāo)記;遍歷該目錄對象的等待隊(duì)列,尋找等待父目錄創(chuàng)建的所有子創(chuàng)建動作,即標(biāo)記了等待父目錄創(chuàng)建的更新動作,從該對象等待隊(duì)列上摘除下來標(biāo)記了等待父目錄創(chuàng)建的更新動作,喚醒重放工作線程執(zhí)行該更新動作;

對于刪除文件、鏈接、符號鏈接或節(jié)點(diǎn)操作和刪除目錄操作:清除所涉及的對象的正在刪除標(biāo)記;找到該對象的父對象的描述符,為其待刪除的子對象計(jì)數(shù)器減一;如果父對象的待刪除的子對象計(jì)數(shù)減為零并且父對象設(shè)置了正在刪除標(biāo)記,則從父對象的等待隊(duì)列上尋找標(biāo)記了等待子對象刪除的更新動作,喚醒重放工作線程執(zhí)行標(biāo)記了等待子對象刪除的更新動作;

對于創(chuàng)建文件、符號鏈接、鏈接或節(jié)點(diǎn)操作:清除所涉及的對象的正在刪除標(biāo)記;如果該對象的等待隊(duì)列不為空,則選擇一個(gè)等待的更新動作,喚醒重放工作線程執(zhí)行該更新動作;

對于所有涉及到屬性修改的操作和其他文件系統(tǒng)更新操作:如果所涉及的對象的等待隊(duì)列不為空,則選擇一個(gè)等待的更新動作,喚醒重放工作線程執(zhí)行該更新動作。

優(yōu)選地,步驟3中重放工作線程喚醒可被喚醒執(zhí)行的重做日志條目的重放工作線程重放讀取的重做日志條目的方法為:重放工作線程利用操作系統(tǒng)的同步原語喚醒可被喚醒執(zhí)行的重做日志條目的重放工作線程重放讀取的重做日志條目。

本發(fā)明的有益效果如下:

本發(fā)明所述技術(shù)方案充分利用了計(jì)算機(jī)并行資源,由多個(gè)工作線程并行重放文件系統(tǒng)的重做日志,有效的提高了文件系統(tǒng)重做日志的重放效率。

附圖說明

下面結(jié)合附圖對本發(fā)明的具體實(shí)施方式作進(jìn)一步詳細(xì)的說明;

圖1示出并行重放文件系統(tǒng)重做日志的方法實(shí)現(xiàn)過程的示意圖。

具體實(shí)施方式

為了更清楚地說明本發(fā)明,下面結(jié)合優(yōu)選實(shí)施例和附圖對本發(fā)明做進(jìn)一步的說明。附圖中相似的部件以相同的附圖標(biāo)記進(jìn)行表示。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,下面所具體描述的內(nèi)容是說明性的而非限制性的,不應(yīng)以此限制本發(fā)明的保護(hù)范圍。

如圖1所示,本實(shí)施例提供的并行重放文件系統(tǒng)重做日志的方法,包括如下步驟:

步驟1、利用一個(gè)讀日志線程從文件系統(tǒng)的重做日志中按序逐條讀取重做日志條目,并將重做日志條目順序追加到一個(gè)更新動作鏈表中,一個(gè)重做日志條目中包含一個(gè)文件系統(tǒng)的元數(shù)據(jù)更新動作及該元數(shù)據(jù)更新動作所涉及的對象和元數(shù)據(jù),元數(shù)據(jù)更新動作包括創(chuàng)建、刪除或修改等操作,對象包括文件對象、符號鏈接對象、目錄對象、節(jié)點(diǎn)對象和鏈接對象等。目錄對象包括子對象,例如目錄對象下的目錄、文件、符號鏈接、鏈接和節(jié)點(diǎn)。元數(shù)據(jù)包含文件系統(tǒng)標(biāo)準(zhǔn)POSIX屬性,如:標(biāo)識、大小、更新時(shí)間、創(chuàng)建時(shí)間和訪問時(shí)間等,以及文件系統(tǒng)擴(kuò)展屬性;

步驟2、利用多個(gè)重放工作線程按重做日志條目在更新動作鏈表中的順序掃描更新動作鏈表,判斷是否存在未處理的重做日志條目:

如果存在,則重放工作線程按重做日志條目在更新動作鏈表中的順序分別取出更新動作鏈表中的一個(gè)重做日志條目(例如有8個(gè)重做日志條目,有4個(gè)重放工作線程,則4個(gè)重放工作線程先競爭第1個(gè)重做日志條目,之后競爭失敗的3個(gè)重放工作線程再競爭第2個(gè)重做日志條目,以此類推),并按照保證元數(shù)據(jù)更新動作之間邏輯關(guān)系正確的原則判斷該重放工作線程讀取的重做日志條目是否可執(zhí)行重放:如是,則該重放工作線程重放讀取的重做日志條目;如否,則該重放工作線程掛起讀取的重做日志條目直到該重放工作線程被其他的工作線程喚醒;

如果不存在,則重放工作線程重復(fù)按重做日志條目在更新動作鏈表中的順序掃描更新動作鏈表直到存在未處理的重做日志條目;

步驟3、完成重放其讀取的重做日志條目的重放工作線程判斷是否有等待該重做日志條目中包含的文件系統(tǒng)的元數(shù)據(jù)更新動作完成的其他文件系統(tǒng)的元數(shù)據(jù)更新動作對應(yīng)的重做日志條目可被喚醒執(zhí)行:如是,則該重放工作線程喚醒可被喚醒執(zhí)行的重做日志條目的重放工作線程重放讀取的重做日志條目,轉(zhuǎn)入步驟4;如否,則轉(zhuǎn)入步驟4;

步驟4、完成重放其讀取的重做日志條目的重放工作線程重新按重做日志條目在更新動作鏈表中的順序掃描更新動作鏈表。

其中,

步驟2和步驟3的具體過程為:

利用多個(gè)重放工作線程掃描更新動作鏈表,對鏈表上的每一個(gè)更新動作,調(diào)用重放工作線程進(jìn)行重放預(yù)處理(即,按照保證元數(shù)據(jù)更新動作之間邏輯關(guān)系正確的原則判斷該重放工作線程讀取的重做日志條目是否可執(zhí)行重放),如果預(yù)處理成功,返回預(yù)處理成功的更新動作,執(zhí)行更新動作的日志重放。重放結(jié)束后,執(zhí)行重放事后處理(即,完成重放其讀取的重做日志條目的重放工作線程判斷是否有等待該重做日志條目中包含的文件系統(tǒng)的元數(shù)據(jù)更新動作完成的其他文件系統(tǒng)的元數(shù)據(jù)更新動作對應(yīng)的重做日志條目可被喚醒執(zhí)行)。多個(gè)重放線程根據(jù)重放預(yù)處理算法判斷是否依賴的其他的更新動作,如果沒有依賴關(guān)系的更新動作,可以并行執(zhí)行的更新動作,可以被多個(gè)重放工作線程并行重放。

調(diào)用重放工作線程進(jìn)行重放預(yù)處理時(shí)根據(jù)重放預(yù)處理算法,判斷該更新動作是否可以被重放工作線程處理,如果可以被處理,返回這個(gè)待處理的更新動作,否則標(biāo)記這個(gè)更新動作掛起,且將這個(gè)更新動作掛到對應(yīng)的等待對象的等待隊(duì)列上。

執(zhí)行重放事后處理時(shí)根據(jù)重放事后處理算法,喚醒相關(guān)等待的更新動作,并且將處理完成的重做日志排序插入一個(gè)隊(duì)列,判斷是否可以回收哪些日志條目。

步驟3中重放工作線程喚醒可被喚醒執(zhí)行的重做日志條目的重放工作線程重放讀取的重做日志條目的方法為:重放工作線程利用操作系統(tǒng)的同步原語(例如條件變量)喚醒可被喚醒執(zhí)行的重做日志條目的重放工作線程重放讀取的重做日志條目。

本實(shí)施例中,將重做日志條目中包含的文件系統(tǒng)的元數(shù)據(jù)更新動作抽象為如下幾個(gè)類型:

op_mkdir:創(chuàng)建目錄操作(mkdir)

op_create:創(chuàng)建文件(create)、符號鏈接(symlink)、鏈接(link)或節(jié)點(diǎn)操作(mknode);

op_unlink:刪除文件、鏈接、符號鏈接或節(jié)點(diǎn)操作;

op_rmdir:刪除目錄操作;

op_setattr:所有涉及到屬性修改的操作,包括write、setattr和truncate;

其他:其他文件系統(tǒng)更新操作。

步驟2中按照保證元數(shù)據(jù)更新動作之間邏輯關(guān)系正確的原則判斷該重放工作線程讀取的重做日志條目是否可執(zhí)行重放的具體方法為:

按照保證元數(shù)據(jù)更新動作之間邏輯關(guān)系正確的原則判斷該重放工作線程讀取的重做日志條目是否可執(zhí)行重放的具體方法的總體思路是:對同個(gè)對象的所有更新操作,必須順序執(zhí)行;對不同對象的所有更新操作,有條件的并行執(zhí)行。

按照保證元數(shù)據(jù)更新動作之間邏輯關(guān)系正確的原則判斷該重放工作線程讀取的重做日志條目是否可執(zhí)行重放的具體方法判斷單個(gè)對象的更新動作前提是否滿足,以及不同對象更新動作的依賴關(guān)系,來決定是否可以由不同的重放工作線程并行執(zhí)行重放。

首先需要每一個(gè)待處理的更新鏈表中的重做日志條目中包含的文件系統(tǒng)的元數(shù)據(jù)更新動作所涉及的對象都對應(yīng)于一個(gè)唯一的描述符,所以,重放工作線程判斷該重放工作線程讀取的重做日志條目中包含的文件系統(tǒng)的元數(shù)據(jù)更新動作所涉及的對象是否存在描述符:如果描述符已存在,則重放工作線程獲取相應(yīng)描述符,如果描述符不存在則重放工作線程為該對象新創(chuàng)建一個(gè)描述符,所述描述符包括:

一個(gè)等待隊(duì)列,用來描述等待在這個(gè)對象上的所有未重放的更新動作;

多個(gè)標(biāo)志位,描述對象當(dāng)前的狀態(tài);

對于目錄對象,設(shè)置一個(gè)計(jì)數(shù)器,記錄等待刪除的子對象的個(gè)數(shù),deleting_children。

根據(jù)重做日志條目中包含的文件系統(tǒng)的元數(shù)據(jù)更新動作的抽象類型,按照保證元數(shù)據(jù)更新動作之間邏輯關(guān)系正確的原則判斷該重放工作線程讀取的重做日志條目是否可執(zhí)行重放的具體方法如下:

對于op_create和op_mkdir:為更新動作所涉及的對象的描述符設(shè)置正在創(chuàng)建(being_create)標(biāo)記,描述此對象正在被創(chuàng)建;此類更新動作的前提條件是父目錄創(chuàng)建不在更新動作鏈表上,或者父目錄創(chuàng)建動作已經(jīng)重放完成了。如果父目錄創(chuàng)建還沒有重放成功(更新動作所涉及的對象的父對象的描述符設(shè)置了正在創(chuàng)建(being_create)標(biāo)記),說明該更新動作不能夠被執(zhí)行,即該重做日志條目不可執(zhí)行重放,那么為這個(gè)更新動作設(shè)置等待父對象創(chuàng)建(wait_parent_create)標(biāo)記,并將該更新動作加入父對象的等待隊(duì)列上;否則,該更新動作可以被重放工作線程取走執(zhí)行,即該重做日志條目可執(zhí)行重放。

對于op_unlink:為更新動作所涉及的對象描述符設(shè)置正在刪除(being_removed)標(biāo)記;找到該對象的父對象的描述符,為其待刪除的子對象計(jì)數(shù)器加一;如果該對象正在創(chuàng)建或者該對象的等待隊(duì)列不為空,都說明該更新動作不能夠被執(zhí)行,即該重做日志條目不可執(zhí)行重放,為該更新動作設(shè)置等待處理(wait_obj_proc)標(biāo)記,將該更新動作加入到該對象的等待隊(duì)列中去;否則,該更新動作可以被重放工作線程取走,即該重做日志條目可執(zhí)行重放。

對于op_rmdir:標(biāo)志更新動作所涉及的對象正在被刪除,為更新動作所涉及的對象描述符設(shè)置正在刪除(being_removed)標(biāo)記;找到該對象的父對象的描述符,為其待刪除的子對象計(jì)數(shù)器加一;如果該對象正在創(chuàng)建或者這個(gè)對象的等待隊(duì)列不為空,都說明該更新動作不能夠被執(zhí)行,即該重做日志條目不可執(zhí)行重放,為該更新動作設(shè)置等待處理(wait_obj_proc)標(biāo)記,將該更新動作加入到該對象的等待隊(duì)列中去;如果該對象的子對象還沒有全部被刪除光,即正在刪除的子對象(deleting_children)隊(duì)列不為0,則為該更新動作設(shè)置等待子對象刪除(wait_chld_del)標(biāo)記并將該更新動作加入到該對象的等待隊(duì)列;否則(指的是不滿足“該對象正在創(chuàng)建或者該對象的等待隊(duì)列不為空”的條件),該更新動作可以被重放線程取走執(zhí)行,即該重做日志條目可執(zhí)行重放。

對于op_setattr和其他:如果更新動作所涉及的對象正在創(chuàng)建或者該對象的等待隊(duì)列不為空,都說明這個(gè)更新動作不能夠被執(zhí)行,即該重做日志條目不可執(zhí)行重放,為該更新動作設(shè)置等待處理(wait_obj_proc)標(biāo)記,將該更新動作加入到該對象的等待隊(duì)列中去;否則,該更新動作可以被重放工作線程取走重放,即該重做日志條目可執(zhí)行重放。

步驟3中完成重放其讀取的重做日志條目的重放工作線程判斷是否有等待該重做日志條目中包含的文件系統(tǒng)的元數(shù)據(jù)更新動作完成的其他文件系統(tǒng)的元數(shù)據(jù)更新動作對應(yīng)的重做日志條目可被喚醒執(zhí)行:如是,則該重放工作線程喚醒可被喚醒執(zhí)行的重做日志條目的重放工作線程重放讀取的重做日志條目的具體過程為:

事后重放算法記錄一個(gè)動作完成之后,判斷是否有等待這個(gè)動作完成的其他動作可以被喚醒執(zhí)行。

根據(jù)重做日志條目中包含的文件系統(tǒng)的元數(shù)據(jù)更新動作的抽象類型,步驟3中完成重放其讀取的重做日志條目的重放工作線程判斷是否有等待該重做日志條目中包含的文件系統(tǒng)的元數(shù)據(jù)更新動作完成的其他文件系統(tǒng)的元數(shù)據(jù)更新動作對應(yīng)的重做日志條目可被喚醒執(zhí)行:如是,則該重放工作線程喚醒可被喚醒執(zhí)行的重做日志條目的重放工作線程重放讀取的重做日志條目的具體方法為:

對于op_mkdir:清除對象的正在創(chuàng)建(being_created)標(biāo)記;遍歷該目錄對象的等待隊(duì)列,尋找等待父目錄創(chuàng)建的所有子創(chuàng)建動作,即標(biāo)記了等待父目錄創(chuàng)建(wait_parent_create)的更新動作,從對象等待隊(duì)列上摘除下來標(biāo)記了等待父目錄創(chuàng)建(wait_parent_create)的更新動作,喚醒重放工作線程執(zhí)行該更新動作。

對于op_unlink和op_rmkdir:清除對象的正在刪除(being_removed)標(biāo)記;找到該對象的父對象的描述符,為其待刪除的子對象計(jì)數(shù)器減一;如果父對象的待刪除的子對象計(jì)數(shù)減為零了,并且父對象設(shè)置了正在刪除標(biāo)記,說明此父對象等待所有子對象刪除后要?jiǎng)h除,從父對象的等待隊(duì)列上尋找標(biāo)記有等待子對象刪除(wait_chld_del)的更新動作,喚醒重放工作線程執(zhí)行該更新動作。

對于op_create:清除所涉及的對象的正在創(chuàng)建(being_created)標(biāo)記;如果該對象等待隊(duì)列不為空,則選擇一個(gè)等待的更新動作,喚醒重放工作線程執(zhí)行該更新動作。

對于op_setattr和其他:如果所涉及的對象的等待隊(duì)列不為空,則選擇一個(gè)等待的更新動作,喚醒重放工作線程執(zhí)行該更新動作。

顯然,本發(fā)明的上述實(shí)施例僅僅是為清楚地說明本發(fā)明所作的舉例,而并非是對本發(fā)明的實(shí)施方式的限定,對于所屬領(lǐng)域的普通技術(shù)人員來說,在上述說明的基礎(chǔ)上還可以做出其它不同形式的變化或變動,這里無法對所有的實(shí)施方式予以窮舉,凡是屬于本發(fā)明的技術(shù)方案所引伸出的顯而易見的變化或變動仍處于本發(fā)明的保護(hù)范圍之列。

當(dāng)前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1