專利名稱:一種計(jì)算機(jī)文件系統(tǒng)的快照方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)文件系統(tǒng)的快照方法,特別涉及計(jì)算機(jī)文件系統(tǒng)的 快照方法。
背景技術(shù):
計(jì)算機(jī)文件系統(tǒng)快照技術(shù)已經(jīng)獲得越來越廣泛的關(guān)注,并在文件系統(tǒng)的 備份、版本維護(hù)等管理需求中得到應(yīng)用??煺仗峁┝擞?jì)算機(jī)文件系統(tǒng)在過去 某個(gè)時(shí)間點(diǎn)的一致性印象,通過快照,用戶可以實(shí)現(xiàn)對(duì)文件系統(tǒng)歷史版本的 訪問、以及將文件系統(tǒng)回滾到歷史版本等操作。此外,作為一種普遍的手段, 快照還能夠有效地幫助計(jì)算機(jī)文件系統(tǒng)管理軟件完成在線的文件系統(tǒng)備份、 故障后快速恢復(fù)等數(shù)據(jù)保護(hù)及管理功能。
在本地文件系統(tǒng)中,對(duì)快照的支持通常分為文件系統(tǒng)級(jí)別與文件級(jí)別。
如ext3cow、 elephant這兩種文件系統(tǒng)均在文件級(jí)別快照的基礎(chǔ)上提供了文 件系統(tǒng)級(jí)別的快照支持,而在ZFS中則只支持文件系統(tǒng)級(jí)別/子文件系統(tǒng)級(jí) 別快照。在網(wǎng)絡(luò)存儲(chǔ)環(huán)境下,現(xiàn)有的分布式文件系統(tǒng)對(duì)快照的支持則限于文 件系統(tǒng)級(jí)別,如VxFS、 GPFS、 SANFS等。雖然在SANFS中,還支持基于子 文件系統(tǒng)的快照,但是子文件系統(tǒng)基本上可以看作獨(dú)立的文件系統(tǒng),所以本 質(zhì)上仍然是基于文件系統(tǒng)級(jí)別的。
文件系統(tǒng)級(jí)別的快照與對(duì)文件級(jí)別的快照都存在各自的優(yōu)缺點(diǎn)。其中, 文件系統(tǒng)級(jí)別的快照存在如下缺點(diǎn)
1、 影響范圍大,在文件系統(tǒng)級(jí)別執(zhí)行快照相關(guān)操作(創(chuàng)建/刪除/訪問) 時(shí),會(huì)影響所有用戶對(duì)正常文件系統(tǒng)的訪問,特別在分布式環(huán)境下,客戶端 和訪問進(jìn)程數(shù)量大大加劇了快照相關(guān)操作的影響范圍。
2、 缺乏靈活性,文件系統(tǒng)中并非所有的數(shù)據(jù)都具有同樣的快照需求, 用戶無法根據(jù)實(shí)際需求,對(duì)需要備份或保留版本的目錄有選擇地創(chuàng)建快照。
3、 消耗大量的存儲(chǔ)資源,對(duì)整個(gè)文件系統(tǒng)創(chuàng)建快照后,雖然采用C0W (寫時(shí)拷貝,Copy On Write)技術(shù)可以降低創(chuàng)建耗時(shí)并避免相同數(shù)據(jù)的重
復(fù)存儲(chǔ),但所有對(duì)文件系統(tǒng)的修改都進(jìn)行COW仍然會(huì)導(dǎo)致存儲(chǔ)資源的大量消 耗。
而文件級(jí)別的快照則存在如下缺點(diǎn)
1、 在文件級(jí)別進(jìn)行快照操作時(shí),快照通常釆用索引節(jié)點(diǎn)(inode)的版本 log及目錄項(xiàng)中記錄文件〈創(chuàng)建時(shí)間、刪除時(shí)間〉的方式組織文件版本。因此 在對(duì)快照做刪除操作時(shí),需要遍歷整個(gè)文件系統(tǒng)才能決定哪些資源被共享訪 問,哪些資源可以被回收,刪除快照的效率4艮低。
2、 與文件系統(tǒng)級(jí)別的快照相比,文件級(jí)別的快照具有最廣泛的靈活性, 但與此同時(shí),也會(huì)帶來由于靈活性所造成的維護(hù)成本問題。如在elephant 中允許用戶為每個(gè)文件定制不同的快照維護(hù)策略,但如對(duì)整個(gè)文件系統(tǒng)中所 有文件進(jìn)行策略定制,其管理和維護(hù)成本是相當(dāng)高的。例如,管理員通常利 用第三方備份軟件進(jìn)行在線備份工作,需要備份的數(shù)據(jù)內(nèi)容通常集中存放于 某些目錄下的,如果需要管理員理解快照的策略,并根據(jù)備份需要進(jìn)行配置, 則管理員的工作任務(wù)量和復(fù)雜度都會(huì)大大增加。
綜上所述,在現(xiàn)有技術(shù)中文件系統(tǒng)級(jí)別的快照存在快照粒度過大的缺 陷,而文件級(jí)別的快照又存在快照粒度過小的缺陷。
發(fā)明內(nèi)容
因此,本發(fā)明的任務(wù)是克服現(xiàn)有的快照方法由于快照粒度大小的不適 當(dāng)而產(chǎn)生的靈活性與資源利用率上的問題,從而給出 一 種可在快照使用中 的靈活性與資源利用率上取得一個(gè)較好平衡的快照方法。
為了實(shí)現(xiàn)上述目的,本發(fā)明提供了 一種計(jì)算機(jī)文件系統(tǒng)快照的創(chuàng)建方 法,為計(jì)算機(jī)文件系統(tǒng)中的指定目錄創(chuàng)建快照,將創(chuàng)建快照后的相應(yīng)目錄 稱為快照集;所述快照的創(chuàng)建包括以下步驟
步驟l-l)、在計(jì)算機(jī)文件系統(tǒng)中,確定需要?jiǎng)?chuàng)建快照的目錄;
步驟l-2)、判斷所述目錄是否創(chuàng)建過快照,若所述目錄為第一次創(chuàng)建 快照,則將所述目錄的工作版本的根索引節(jié)點(diǎn)信息添加到快照集索引表的 信息條目中,更新最近一次創(chuàng)建或者刪除快照集的時(shí)間點(diǎn)為計(jì)算機(jī)系統(tǒng)的 當(dāng)前時(shí)間,然后執(zhí)行下一步,否則,直接執(zhí)行下一步;
步驟1-3)、分配一個(gè)新的索引節(jié)點(diǎn)作為所要?jiǎng)?chuàng)建的快照版本的根索引 節(jié)點(diǎn),并將所述工作版本的根索引節(jié)點(diǎn)的內(nèi)容復(fù)制到新分配的索引節(jié)點(diǎn) 中;
步驟1-4、將所述工作版本的寫時(shí)拷貝鏈表復(fù)制到新創(chuàng)建快照的根索 引節(jié)點(diǎn)上,然后將工作版本的寫時(shí)拷貝鏈表內(nèi)容清空;
步驟1-5)、將所述的快照版本的根索引節(jié)點(diǎn)的快照創(chuàng)建時(shí)間設(shè)置為計(jì) 算機(jī)系統(tǒng)的當(dāng)前時(shí)間;
步驟1-6)、將所述的快照版本的根索引節(jié)點(diǎn)鏈接到所述目錄的快照鏈 表上。
上述技術(shù)方案中,所述的快照集索引表用于維護(hù)計(jì)算機(jī)文件系統(tǒng)中所 有快照集的索引信息。
上述技術(shù)方案中,所述的最近一次創(chuàng)建或者刪除快照集的時(shí)間點(diǎn)為整 個(gè)計(jì)算機(jī)文件系統(tǒng)中維護(hù)的 一個(gè)全局信息,所述的最近一次創(chuàng)建或者刪除 快照集的時(shí)間點(diǎn)記錄了最近一次快照集總數(shù)量發(fā)生變化的時(shí)間。
上述技術(shù)方案中,所述的快照版本的根索引節(jié)點(diǎn)中包括有以下域值 快照創(chuàng)建時(shí)間、最近的一個(gè)舊版本索引、最近的一個(gè)新版本索引,通過最 近的一個(gè)舊版本索引和最近的一個(gè)新版本索引,可將對(duì)應(yīng)快照集中所有版 本通過將根索引節(jié)點(diǎn)按照時(shí)間順序鏈接成一個(gè)快照鏈表。
本發(fā)明還提供了 一種計(jì)算機(jī)文件系統(tǒng)快照的刪除方法,為計(jì)算機(jī)文件 系統(tǒng)中的指定目錄刪除指定的快照版本,包括以下步驟
步驟2-l)、在計(jì)算機(jī)文件系統(tǒng)中,在指定目錄的快照鏈表中選擇要?jiǎng)h 除的快照版本;
步驟2-2)、查找所要?jiǎng)h除的快照版本的相鄰新版本,在所述的相鄰新 版本上查詢寫時(shí)拷貝鏈表,得到在相鄰新版本以及后續(xù)版本中不會(huì)被使用 的塊或索引節(jié)點(diǎn)的信息;所述的信息包括類型,塊號(hào)或索引節(jié)點(diǎn)號(hào),出生 時(shí)間;
步驟2-3)、查找所要?jiǎng)h除快照版本的相鄰舊版本,從所述的相鄰舊版 本中找到所記錄的舊版本快照創(chuàng)建時(shí)間,若所要?jiǎng)h除的快照版本不存在相 鄰舊版本,則所要查找的舊版本快照創(chuàng)建時(shí)間為0;
步驟2-4 )、將所述的相鄰新版本的寫時(shí)拷貝鏈表中的塊或索引節(jié)點(diǎn)的 出生時(shí)間逐個(gè)與步驟2-3)的查詢結(jié)果進(jìn)行比較,若一個(gè)塊或索引節(jié)點(diǎn)的 出生時(shí)間大于所述的查詢結(jié)果,則在寫時(shí)拷貝鏈表中刪除該塊或索引節(jié)點(diǎn) 的信息,并回收對(duì)應(yīng)的塊或索引節(jié)點(diǎn)資源;
步驟2-5 )、將待刪除快照版本的寫時(shí)拷貝鏈表合并到相鄰新版本的寫 時(shí)拷貝鏈表中;
步驟2-6)、將待刪除快照版本從快照鏈表中移出,并將代表相鄰新版 本的根索引節(jié)點(diǎn)與代表相鄰舊版本的根索引節(jié)點(diǎn)相連。
上迷技術(shù)方案中,所述的寫時(shí)拷貝鏈表對(duì)應(yīng)一個(gè)快照版本,在所述的 寫拷貝鏈表中記錄著所對(duì)應(yīng)的快照版本因修改而引發(fā)寫時(shí)拷貝后,在本版
本及后續(xù)的版本中不會(huì)被使用的塊或索引節(jié)點(diǎn)的信息,所述的各塊或各索 引節(jié)點(diǎn)信息均分別通過三元組<類型,塊號(hào)或索引節(jié)點(diǎn)號(hào),出生時(shí)間>進(jìn)行 表述。
本發(fā)明又提供了一種計(jì)算機(jī)文件系統(tǒng)快照的目錄工作版本修改方法,
包括以下步驟
步驟3-1 )、在計(jì)算機(jī)文件系統(tǒng)中,選取待修改節(jié)點(diǎn)所對(duì)應(yīng)的索引節(jié)點(diǎn);
步驟3-2 )、根據(jù)所述索引節(jié)點(diǎn)的時(shí)間戳與最近一次創(chuàng)建或者刪除快照 集的時(shí)間點(diǎn),對(duì)所述索引節(jié)點(diǎn)中的快照集指針有效性進(jìn)行判斷,若所述的 快照集指針有效,則執(zhí)行下一步,否則,執(zhí)行步驟3-4);
步驟3-3 )、比較所述快照集指針?biāo)赶虻目煺占械淖钚驴煺瞻姹镜?創(chuàng)建時(shí)間,以及待修改節(jié)點(diǎn)的出生時(shí)間,根據(jù)比較結(jié)果,決定在結(jié)束修改 過程前是否要進(jìn)行寫時(shí)拷貝操作;如果不需要,則直接修改待修改節(jié)點(diǎn)并 結(jié)束修改過程;如果需要進(jìn)行寫時(shí)拷貝操作,則執(zhí)行寫時(shí)拷貝、修改寫時(shí) 拷貝出的新節(jié)點(diǎn)、擴(kuò)充寫時(shí)拷貝鏈表后,最后還需向上追溯其在元素目錄 樹中的父節(jié)點(diǎn),重新執(zhí)行本步驟;
步驟3-4)、更新快照集指針,在所述的更新過程中,通過將所述節(jié)點(diǎn) 的絕對(duì)路徑名與快照集索引表中的快照集信息進(jìn)行前綴匹配,并根據(jù)匹配 結(jié)果更新所述快照集指針和時(shí)間戳。若更新后快照集指針為空,則直接修 改待修改節(jié)點(diǎn)并結(jié)束修改過程;若所述快照集指針不為空,則重新執(zhí)行步 驟3國(guó)3 )。
上述技術(shù)方案中,在所述的步驟3-3)中,所述的根據(jù)比較結(jié)果,決 定在結(jié)束修改過程前是否要進(jìn)行寫時(shí)拷貝操作包括
a) 、若所述的出生時(shí)間大于或等于所述的創(chuàng)建時(shí)間,則不做寫時(shí)拷貝 操作,直接修改待修改節(jié)點(diǎn)并結(jié)束修改過程;
b) 、若所述的出生時(shí)間小于所述的創(chuàng)建時(shí)間,對(duì)待修改節(jié)點(diǎn)做寫時(shí)拷 貝操作并修改所述寫時(shí)拷貝出的新節(jié)點(diǎn),然后將寫時(shí)拷貝對(duì)應(yīng)的原節(jié)點(diǎn)信 息記錄到工作版本的寫時(shí)拷貝鏈表中,最后還需對(duì)所述節(jié)點(diǎn)在所述元素目 錄樹中的父節(jié)點(diǎn)進(jìn)行所述的出生時(shí)間與所述的創(chuàng)建時(shí)間之間的比較判斷, 若所述父節(jié)點(diǎn)的出生時(shí)間小于創(chuàng)建時(shí)間,則對(duì)所述的父節(jié)點(diǎn)做寫時(shí)拷貝操 作,并修改所述寫時(shí)拷貝出的新父節(jié)點(diǎn),將寫時(shí)拷貝對(duì)應(yīng)的原父節(jié)點(diǎn)信息 記錄到工作版本的寫時(shí)拷貝鏈表中,重復(fù)上述過程,直至一個(gè)祖先節(jié)點(diǎn)的 出生時(shí)間大于或等于創(chuàng)建時(shí)間后,結(jié)束修改過程。
上述技術(shù)方案中,在所述的步驟3-4)中,所述的根據(jù)匹配的結(jié)果, 修改快照集指針包括若匹配不成功,則將所述的快照集指針設(shè)置為空; 若匹配成功,則將快照集指針更新為所述快照集索引表中的相應(yīng)記錄中的 最新版本的根索引節(jié)點(diǎn)號(hào)。
上述技術(shù)方案中,在所述的步驟3-2)中,在對(duì)所述索引節(jié)點(diǎn)中的快 照集指針有效性進(jìn)行判斷時(shí),若所述索引節(jié)點(diǎn)的時(shí)間戳大于或等于所述的 最近一次創(chuàng)建或者刪除快照集的時(shí)間點(diǎn),則所述的快照集指針有效。
上述技術(shù)方案中,所述的時(shí)間戳用來判斷快照集狀態(tài)是否發(fā)生變化。
上述技術(shù)方案中,所述的元素目錄樹是對(duì)計(jì)算機(jī)文件系統(tǒng)中包括索引 節(jié)點(diǎn)、間址塊、目錄塊、數(shù)據(jù)塊在內(nèi)的4類基本元素進(jìn)行抽象后得到的, 在抽象過程中,將所述的索引節(jié)點(diǎn)、間址塊、目錄塊之類的非葉子節(jié)點(diǎn)抽 象為一種抽象節(jié)點(diǎn),所述的抽象節(jié)點(diǎn)包括本節(jié)點(diǎn)信息和子節(jié)點(diǎn)描述信息。
上述技術(shù)方案中,所述的子節(jié)點(diǎn)描述信息包括子節(jié)點(diǎn)出生時(shí)間,子節(jié) 點(diǎn)描述和子節(jié)點(diǎn)指針。
本發(fā)明的優(yōu)點(diǎn)在于
1、本發(fā)明通過提供一種支持計(jì)算機(jī)文件系統(tǒng)目錄級(jí)快照的方法,可有 效滿足用戶及應(yīng)用程序在實(shí)際應(yīng)用中,對(duì)需要進(jìn)行數(shù)據(jù)保護(hù)、在線備份或 者版本維護(hù)的目錄及文件,靈活地進(jìn)行快照創(chuàng)建、訪問、刪除等操作的需 求。相比文件系統(tǒng)級(jí)的快照支持,本發(fā)明通過縮小的快照粒度能夠有效地 解決快照操作對(duì)整個(gè)文件系統(tǒng)訪問的時(shí)間、涉及的文件和目錄范圍等影 響,并顯著降低存儲(chǔ)資源的大量耗用問題。相比文件級(jí)的快照支持,本發(fā) 明通過擴(kuò)大的快照粒度能夠有效地降低文件級(jí)快照粒度帶來的管理維護(hù) 成本,并可從技術(shù)上解決刪除效率的問題。
2 、本發(fā)明提供的 一種支持目錄級(jí)快照的計(jì)算機(jī)文件系統(tǒng)方法具體包括 創(chuàng)建快照、刪除快照以及修改目錄工作版本。創(chuàng)建快照方法中,僅涉及到 內(nèi)存中的個(gè)別數(shù)據(jù)結(jié)構(gòu)的讀寫操作,這使得創(chuàng)建快照操作幾乎在瞬間完 成。刪除快照方法中,避免了文件級(jí)快照的刪除帶來的索引節(jié)點(diǎn)鏈表遍歷 的過程,并且操作的也是內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),所以刪除操作也非常迅速。 修改目錄工作版本方法中,采用COW技術(shù)有效的推遲了版本之間的共享 樹因發(fā)生修改而分裂的過程,不僅節(jié)省了拷貝所花費(fèi)的時(shí)間,更節(jié)省了存 儲(chǔ)資源的耗用。
以下,結(jié)合附圖來詳細(xì)說明本發(fā)明的實(shí)施例,其中
圖1為本發(fā)明的文件系統(tǒng)目錄級(jí)快照組織結(jié)構(gòu)概要圖2為非葉子節(jié)點(diǎn)對(duì)象的抽象示意圖3為元素目錄樹的一個(gè)簡(jiǎn)單示意圖4為快照創(chuàng)建過程中的狀態(tài)變化圖5為快照刪除過程中的狀態(tài)變化圖6為本發(fā)明的計(jì)算機(jī)文件系統(tǒng)快照的創(chuàng)建方法的流程圖7為本發(fā)明的計(jì)算機(jī)文件系統(tǒng)快照的刪除方法的流程圖8為本發(fā)明的計(jì)算機(jī)文件系統(tǒng)快照的目錄工作版本修改方法的流程圖。
具體實(shí)施例方式
下面結(jié)合附圖和具體實(shí)施方式
對(duì)本發(fā)明做進(jìn)一步的說明。 本發(fā)明為了克服現(xiàn)有技術(shù)快照粒度過大或過小的缺陷,在文件系統(tǒng)的 目錄級(jí)別上實(shí)現(xiàn)了對(duì)快照的支持。與文件系統(tǒng)級(jí)別快照和文件級(jí)別快照相 比,目錄級(jí)快照具有不同的特點(diǎn),下面首先對(duì)目錄級(jí)快照所涉及到的相關(guān) 概念進(jìn)行說明。
1 、快照集(snapset):在計(jì)算機(jī)文件系統(tǒng)內(nèi),用戶可對(duì)目錄創(chuàng)建相應(yīng) 的快照,為了將已經(jīng)創(chuàng)建快照的目錄和未創(chuàng)建快照的目錄相區(qū)別,本發(fā)明 將已經(jīng)創(chuàng)建快照的目錄稱為快照集。在快照集中所包含的內(nèi)容包括目錄中 所有子目錄以及子文件。例如,對(duì)于一個(gè)目錄"/root/usr/dir"創(chuàng)建了快照, 那么該目錄就是 一 個(gè)快照集,該目錄中所包含的所有子目錄如 "/root/usr/dir/sub一dirl, /root/usr/dir/sub一dir2/grand—dir3" 等、子文4牛^口 "/root/usr/dir/filel, /root/usr/dir/sub—dir2/file2,,等,都屬于這個(gè)快照集。
2、 LMTS:在整個(gè)計(jì)算機(jī)文件系統(tǒng)中維護(hù)的一個(gè)全局變量,該全局變 量記錄最近一次創(chuàng)建或者刪除快照集的時(shí)間點(diǎn)(Last Modify Time of Snapset, LMTS)。
3、 版本,工作版本和快照版本文件系統(tǒng)中的任何目錄都具有版本。 對(duì)于從未創(chuàng)建過快照的目錄,僅有一個(gè)工作版本,所述的工作版本對(duì)應(yīng)著 不具備快照功能的傳統(tǒng)的文件系統(tǒng)訪問操作實(shí)體。而 一個(gè)快照集中的每個(gè) 快照,都分別對(duì)應(yīng)著一個(gè)快照版本。版本之間邏輯上不具備依賴性,例如
一個(gè)快照集有一個(gè)工作版本和一個(gè)快照版本,工作版本被刪除后,快照版 本仍然存在。
4、 快照集索引表快照集索引表用于維護(hù)文件系統(tǒng)中所有快照集的 索引信息。任意一個(gè)快照集在索引表中都具備對(duì)應(yīng)的索引信息項(xiàng) <目錄 名,最新版本的根索引節(jié)點(diǎn)號(hào)>。通常最新版本是工作版本,例如,在附 圖1中,通過快照集索引表l中"/root/usr/dir"對(duì)應(yīng)的索引信息,可定位"文 件系統(tǒng)樹"中對(duì)應(yīng)快照集"/root/usr/dir"工作版本的根索引節(jié)點(diǎn)。通過表 中另 一 項(xiàng)"/root/home/a/b ,,對(duì)應(yīng)的索引信息,則可定位快照集
'7root/home/a/b"工作版本的根索引節(jié)點(diǎn)。當(dāng)快照集的工作版本不存在時(shí), 比如已經(jīng)被刪除,那么最新版本就指最新的一個(gè)快照版本??煺占饕?是本發(fā)明與文件系統(tǒng)級(jí)快照方法或文件級(jí)快照方法的區(qū)別特征,采用了快 照集索引表后,可以知道計(jì)算機(jī)文件系統(tǒng)中哪些目錄創(chuàng)建了快照,哪些目 錄則沒有創(chuàng)建快照,并可以實(shí)現(xiàn)對(duì)創(chuàng)建快照目錄的快速查找。
5、 版本的根索引節(jié)點(diǎn)任何版本的根索引節(jié)點(diǎn)都具有如下特殊域值, 快照創(chuàng)建時(shí)間(epoch)、最近的一個(gè)舊版本索引(prev)、最近的一個(gè)新版本 索引(next),上述特殊域值在附圖4中標(biāo)出。
通過版本根索引節(jié)點(diǎn)中的prev、 next等指針,可將對(duì)應(yīng)快照集中所有 版本通過將根索引節(jié)點(diǎn)按照時(shí)間順序鏈接成一個(gè)快照鏈表。當(dāng)僅存在一個(gè) 版本時(shí),對(duì)應(yīng)的prev、 next指針均為空。在附圖l中,對(duì)目錄在創(chuàng)建快照 過程中所生成的不同版本進(jìn)行了舉例說明??煺占?7root/usr/dir"擁有三 個(gè)版本工作版本、快照版本B和快照版本A。通過三個(gè)版本根索引節(jié)點(diǎn) 中的相應(yīng)指針,將三個(gè)版本的索引節(jié)點(diǎn)形成快照鏈表。
并且,從任何版本的根索引節(jié)點(diǎn)開始,通過基本的文件系統(tǒng)命名解析 過程就可以遍歷該版本的內(nèi)容,即其下所有的子文件、子目錄等。 一個(gè)快 照集中的各個(gè)版本可以獨(dú)立地形成一棵樹。例如,附圖1中的2所示, /root/usr/dir/的工作版本就形成了 一棵樹,同時(shí)這棵樹是整個(gè)文件系統(tǒng)的一 棵子樹。由于采用COW ( copy-on-write,寫時(shí)拷貝)技術(shù)提高訪問效率及 降低容量占用,所以不同版本的樹之間通常存在共享分支。例如,從工作 版本的根索引節(jié)點(diǎn)向下遍歷/root/usr/dir的工作版本樹2時(shí),分別可訪問 COW的新分支21,以及工作版本和快照版本B共享分支22;同樣,共享 分支3是快照版本B和快照版本A兩棵樹的共享分支。
6、 寫時(shí)拷貝鏈表(COW—list):每個(gè)版本都具有一個(gè)COW—list,該鏈
表中記錄著本版本作為工作版本時(shí)因修改而引發(fā)COW,從而在本版本及 后續(xù)的版本中不會(huì)被使用的資源(塊和索引節(jié)點(diǎn))。每項(xiàng)上述資源,在
COW—list中都對(duì)應(yīng)著一項(xiàng)三元組 <類型,塊號(hào)/索引節(jié)點(diǎn)號(hào),出生時(shí)間>, 其中,類型是指該資源為塊或者為索引節(jié)點(diǎn),塊號(hào)/索引節(jié)點(diǎn)號(hào)則是該資源 在文件系統(tǒng)中的唯一標(biāo)識(shí),出生時(shí)間是指該資源被分配并使用的時(shí)間點(diǎn), 通過與文件系統(tǒng)創(chuàng)建時(shí)刻之間間隔的秒數(shù)來標(biāo)識(shí)。通過三元組中的出生時(shí) 間,以及COW一list所對(duì)應(yīng)版本的更新根索引節(jié)點(diǎn)中的版本創(chuàng)建時(shí)間(epoch) 就可以確定資源(塊和索引節(jié)點(diǎn))的生存周期該資源在<出生時(shí)間,版 本創(chuàng)建時(shí)間 >的時(shí)間段內(nèi)被使用。
非快照集的普通目錄工作版本的COW—list為空,因?yàn)闆]有發(fā)生過 COW。在對(duì)一個(gè)目錄創(chuàng)建快照時(shí),就會(huì)將目錄工作版本的COW一list轉(zhuǎn)接 到新創(chuàng)建的快照版本上,并將工作目錄的COW一list清空。在目錄是第一 次創(chuàng)建快照的情況下,由于之前從未發(fā)生過COW所以工作版本的 COW—list為空,故在COWJist轉(zhuǎn)接后,新創(chuàng)建的快照版本的COW—list 也就為空,也就是說,任何一個(gè)目錄在第一次創(chuàng)建快照后得到的快照版本 的COW—list—定為空。另夕卜,僅工作版本的COW—list中記錄的三元組個(gè) 數(shù)才有可能因?yàn)榘l(fā)生COW過程而變多,因?yàn)榭煺瞻姹臼遣荒軌虮恍薷牡?所以肯定不會(huì)發(fā)生COW過程。
在附圖5中,對(duì)COWJist的形式及內(nèi)容做了相關(guān)的說明61所示的 "相鄰新版本"的COW—list中記錄著4項(xiàng)在該版本及其后續(xù)版本中不會(huì) 被使用的資源,如其中一項(xiàng)〈B, 20, 120>表示塊號(hào)為20,出生時(shí)間是120 的塊;62所示的"待刪除快照"的COW」ist中記錄著3項(xiàng)不會(huì)被該版本 及其后續(xù)版本(如"相鄰新版本")中被使用的資源,如其中一項(xiàng)<1, 90, 60>表示索引節(jié)點(diǎn)號(hào)為卯,出生時(shí)間是60的索引節(jié)點(diǎn)。
7、文件系統(tǒng)元素目錄樹結(jié)構(gòu)在計(jì)算機(jī)文件系統(tǒng)中,所有的節(jié)點(diǎn)按 照類型可以分為4類基本元素,分別為索引節(jié)點(diǎn)、間址塊(indirect block )、 目錄塊(dentry block)、數(shù)據(jù)塊。在快照文件系統(tǒng)中,上述4類元素也是 快照文件系統(tǒng)中COW的直接操作實(shí)體。在快照文件系統(tǒng)中將上述4類基 本元素做進(jìn)一步的抽象,可組織成為文件系統(tǒng)元素目錄樹。
在文件系統(tǒng)元素目錄樹中,節(jié)點(diǎn)按類型可分為非葉子節(jié)點(diǎn)和葉子節(jié) 點(diǎn)。非葉子節(jié)點(diǎn)包括索引節(jié)點(diǎn),間址塊,目錄塊三類。葉子節(jié)點(diǎn)通常情況 下是數(shù)據(jù)塊(Datablock),但在文件大小為0時(shí)的索引節(jié)點(diǎn)或空目錄中的
第一個(gè)目錄塊也可以成為葉子節(jié)點(diǎn)。所有3類非葉子節(jié)點(diǎn)都可以抽象為一
種對(duì)象節(jié)點(diǎn),其具有兩類信息本節(jié)點(diǎn)信息和子節(jié)點(diǎn)描述信息。本節(jié)點(diǎn)信 息包括節(jié)點(diǎn)屬性相關(guān)信息;子節(jié)點(diǎn)描述包括子節(jié)點(diǎn)出生時(shí)間,子節(jié)點(diǎn)描 述和子節(jié)點(diǎn)指針。在附圖2中對(duì)非葉子節(jié)點(diǎn)進(jìn)行了描述。其中,索引節(jié)點(diǎn) 的節(jié)點(diǎn)屬性相關(guān)信息中包含與快照相關(guān)的兩類信息。第一類是前述的根索 引節(jié)點(diǎn)中的快照創(chuàng)建時(shí)間(epoch)、最近的一個(gè)舊版本索引(prev)、最近的 一個(gè)新版本索引(next)。對(duì)于快照集版本的根索引節(jié)點(diǎn),這三個(gè)項(xiàng)有效, 而對(duì)普通的索引節(jié)點(diǎn),這三個(gè)值無效。第二類信息包含一個(gè)快照集指針 (snapsetptr)和一個(gè)時(shí)間戳(timestamp),在快照集指針有效的情況下, 指向本索引節(jié)點(diǎn)所屬快照集的最新版本的根索引節(jié)點(diǎn),如果它的值為空, 則表示本索引節(jié)點(diǎn)不屬于一個(gè)快照集。而時(shí)間戳則是判斷快照集指針有效
性的一個(gè)必要條件,通過比較時(shí)間戳與LMTS判斷快照集指針是否有效, 時(shí)間戳大于LMTS則快照集指針有效,否則無效。
通過上述的各類非葉子節(jié)點(diǎn)中的子節(jié)點(diǎn)描述和指針,可將文件系統(tǒng)的 某個(gè)目錄的某個(gè)版本組織成為一棵元素目錄樹,并通過這些元素目錄樹可 組織起整個(gè)文件系統(tǒng)。通過元素目錄樹,在處理快照相關(guān)才喿作時(shí),可以邏 輯上忽略具體的非葉子節(jié)點(diǎn)的類型,而進(jìn)行統(tǒng)一的描述及處理。例如在后 文中提到的"對(duì)目錄工作版本的修改"的流程中,步驟3-2 (二)中存在 "上溯判斷父節(jié)點(diǎn)是否需要COW"的判斷,其中"父節(jié)點(diǎn),, 一定是一個(gè) 非葉子節(jié)點(diǎn),但無需關(guān)注是何種類型的非葉子節(jié)點(diǎn)。圖3是一個(gè)簡(jiǎn)單的元 素目錄樹的示意圖,在該圖中,從'7root/usr/dir,,的索引節(jié)點(diǎn)開始,通過 各層節(jié)點(diǎn)的子節(jié)點(diǎn)指針可以逐級(jí)遍歷以"/root/usr/dir"為根(可以是該目 錄的任何一個(gè)版本的根)的目錄元素樹中各層非葉子節(jié)點(diǎn)和葉子節(jié)點(diǎn)。
在對(duì)目錄級(jí)別快照系統(tǒng)所具有的特征做上述說明后,對(duì)目錄級(jí)別快照 的創(chuàng)建、刪除以及對(duì)目錄工作版本的修改分別進(jìn)行說明。
參考圖6,并結(jié)合實(shí)例,對(duì)目錄級(jí)別快照的創(chuàng)建流程做如下說明 步驟l-l、根據(jù)用戶的選擇,決定文件系統(tǒng)中需要?jiǎng)?chuàng)建快照的目錄; 步驟1-2、判斷所要?jiǎng)?chuàng)建快照的目錄是否創(chuàng)建過快照,即是否已經(jīng)是 快照集;如果是第一次創(chuàng)建快照,則在計(jì)算機(jī)文件系統(tǒng)的快照集索引表中 添加與所要?jiǎng)?chuàng)建快照的目錄相關(guān)的索引條目,更新LMTS為計(jì)算機(jī)系統(tǒng)的 當(dāng)前時(shí)間,然后執(zhí)行下一步,如果不是第一次創(chuàng)建快照,則直接執(zhí)行下一 步;
步驟1-3、分配一個(gè)新的索引節(jié)點(diǎn)作為新創(chuàng)建快照版本的根索引節(jié)點(diǎn),
并將工作版本的根索引節(jié)點(diǎn)內(nèi)容拷貝至新創(chuàng)建快照的根索引節(jié)點(diǎn);
步驟l-4、將工作版本的COW—list復(fù)制到新創(chuàng)建快照的根索引節(jié)點(diǎn)上,
并將工作版本的COWJist內(nèi)容清空;
步驟1-5、將新創(chuàng)建快照版本的根索引節(jié)點(diǎn)的快照創(chuàng)建時(shí)間(epoch)設(shè)
置為計(jì)算機(jī)系統(tǒng)的當(dāng)前時(shí)間;
步驟1-6、將新創(chuàng)建快照版本的根索引節(jié)點(diǎn)鏈接到對(duì)應(yīng)目錄的快照鏈
表上。新分配的根索引節(jié)點(diǎn)在鏈接時(shí),如果當(dāng)前目錄是第一次創(chuàng)建快照,
則目錄的快照鏈表中只有目錄工作版本的根索引節(jié)點(diǎn),將新分配的根索引
節(jié)點(diǎn)直接鏈接到工作版本的根索引節(jié)點(diǎn)即可,在鏈接過程中,將新分配根
索引節(jié)點(diǎn)的前向指針指向工作版本的根索引節(jié)點(diǎn),將工作版本的根索引節(jié)
點(diǎn)的后向指針指向新分配的根索引節(jié)點(diǎn);如果當(dāng)前目錄之前已經(jīng)創(chuàng)建過快
照,則新分配的根索引節(jié)點(diǎn)在鏈接時(shí),將新分配的根索引節(jié)點(diǎn)的前向指針
指向工作版本的根索引節(jié)點(diǎn),將工作版本的根索引節(jié)點(diǎn)的后向指針指向新
分配的根索引節(jié)點(diǎn),并且將新分配的根索引節(jié)點(diǎn)的后向指針指向相鄰舊版
本根索引節(jié)點(diǎn),相鄰舊版本根索引節(jié)點(diǎn)的前向指針指向新分配的根索引節(jié) 點(diǎn)。
在附圖4中,在目錄之前已經(jīng)創(chuàng)建過快照(該目錄已經(jīng)是快照集)的 條件下,對(duì)新創(chuàng)建快照版本的根索引節(jié)點(diǎn)進(jìn)行鏈接的過程做了詳細(xì)說明。 在對(duì)某一個(gè)目錄創(chuàng)建新的快照前,已經(jīng)有一個(gè)快照版本A以及該目錄自身 的工作版本,快照版本A所對(duì)應(yīng)的根索引節(jié)點(diǎn)號(hào)為80,工作版本curr所 對(duì)應(yīng)的根索引節(jié)點(diǎn)號(hào)為10,工作版本的根索引節(jié)點(diǎn)中的舊版本索引指向快 照版本A對(duì)應(yīng)的根索引節(jié)點(diǎn),快照版本A的根索引節(jié)點(diǎn)的新版本索引指 向工作版本的根索引節(jié)點(diǎn)。對(duì)目錄創(chuàng)建快照的新版本后,所創(chuàng)建快照的新 版本為快照版本B:首先為快照版本B分配的根索引節(jié)點(diǎn)號(hào)為100并將索 引節(jié)點(diǎn)IO的內(nèi)容復(fù)制到其中;然后將41所示的寫時(shí)拷貝鏈表轉(zhuǎn)接到快照 版本B上成為52并將工作版本的寫時(shí)拷貝鏈表清空,如51所示;接著, 設(shè)置快照版本B的創(chuàng)建時(shí)間(epoch)為系統(tǒng)當(dāng)前的時(shí)間150;最后,設(shè)置 快照版本B的新版本索引指向工作版本的根索引節(jié)點(diǎn),設(shè)置其舊版本索引 指向快照版本A的根索引節(jié)點(diǎn),在快照版本A和工作版本的根索引節(jié)點(diǎn) 中進(jìn)行相應(yīng)的修改,從而實(shí)現(xiàn)對(duì)新創(chuàng)建快照的根索引節(jié)點(diǎn)與目錄的快照鏈 表間的鏈接。在本圖中,對(duì)所有需要新增或修改的內(nèi)容通過斜紋框進(jìn)行標(biāo) 示。
用戶在創(chuàng)建快照后,根據(jù)實(shí)際需要可實(shí)現(xiàn)對(duì)快照的刪除,參考圖7, 并結(jié)合實(shí)例,對(duì)快照的刪除流程進(jìn)行詳細(xì)說明
步驟2-l、在某一目錄的快照鏈表中選定所要?jiǎng)h除的快照版本;
步驟2-2、查找所要?jiǎng)h除快照版本的相鄰新版本,從相鄰新版本中查 詢COW—list。在本步驟中,所述的相鄰新版本是指與所要?jiǎng)h除的快照版本 相比更新的且時(shí)間間隔最短的一個(gè)快照版本或目錄的工作版本。若所述目 錄除了工作版本外只存在所要?jiǎng)h除的快照版本或所要?jiǎng)h除的快照版本為 最新的快照版本,則相鄰新版本即為目錄的工作版本,若所述目錄除了工 作版本外,還有其它的快照版本,且在這些版本中存在與所要?jiǎng)h除的快照 版本相比更新的快照版本,則相鄰新版本為與所要?jiǎng)h除的快照版本在時(shí)間 上最為接近的較新版本。
在實(shí)際操作中,查找所要?jiǎng)h除快照版本的相鄰新版本只需在所要?jiǎng)h除 的快照版本對(duì)應(yīng)的根索引節(jié)點(diǎn)上查找前向指針?biāo)赶虻母饕?jié)點(diǎn),該根 索引節(jié)點(diǎn)所代表的版本就是所述的相鄰新版本。在前述對(duì)COW—list的說 明中,已經(jīng)對(duì)COW—list所包含的內(nèi)容進(jìn)行了解釋,從COW一list可以知道 在COW一list所屬版本以及后續(xù)版本中不被使用的"塊,,或"索引節(jié)點(diǎn)"。 這些被記錄在COW—list中的"塊"或"索引節(jié)點(diǎn),,也被稱為被該版本"殺 死"的"塊"或"索引節(jié)點(diǎn)"。
步驟2-3、查找所要?jiǎng)h除快照版本的相鄰舊版本,并查詢相鄰舊版本 所記錄的快照創(chuàng)建時(shí)間(epoch),若不存在相鄰舊版本,則查詢結(jié)果為0。 在查詢相鄰舊版本時(shí),根據(jù)要?jiǎng)h除快照版本根索引節(jié)點(diǎn)的后向指針即可找 到相鄰舊版本所對(duì)應(yīng)的根索引節(jié)點(diǎn)。相鄰舊版本所記錄的快照創(chuàng)建時(shí)間在 其根索引節(jié)點(diǎn)的快照創(chuàng)建時(shí)間(epoch)項(xiàng)中有相應(yīng)的記載。如果后向指 針為NULL,則證明相鄰舊版本不存在,那么創(chuàng)建時(shí)間(epoch)則認(rèn)為是 文件系統(tǒng)創(chuàng)建的時(shí)間點(diǎn),即0。
步驟2-4、將相鄰新版本的COW一list中的塊和索引節(jié)點(diǎn)的出生時(shí)間逐 項(xiàng)與步驟2-3查詢結(jié)果進(jìn)行比較,若所述的出生時(shí)間大于所述的查詢結(jié)果, 則刪除COW—list中的相應(yīng)三元組,并回收對(duì)應(yīng)的塊或索引節(jié)點(diǎn)資源,使 得這些資源重新可用;
步驟2-5、將待刪除快照版本的COW—list合并到相鄰新版本的 COW—list中;
步驟2-6、將待刪除快照版本從快照鏈表中移出,并將代表相鄰新版 本的根索引節(jié)點(diǎn)與代表相鄰舊版本的根索引節(jié)點(diǎn)相連。
附圖5為快照刪除的一個(gè)具體實(shí)例,在該實(shí)例中, 一個(gè)快照鏈表有三 個(gè)快照版本,所要?jiǎng)h除的快照版本是圖中的"待刪除快照"。圖中的"相 鄰新版本"的COW—list中有三個(gè)被其"殺死"的塊,分別是〈B,20,120〉, <B,21,70>, 〈B,22,80和一個(gè)被相鄰新版本"殺死"的索引節(jié)點(diǎn)<1,100,110>。 圖中"相鄰舊版本"的快照創(chuàng)建時(shí)間為100。首先,通過COW—list中各項(xiàng) 資源的出生時(shí)間與"相鄰舊版本,,的快照時(shí)間比較得出在"相鄰新版本" 的COW—list中僅有兩項(xiàng)符合刪除條件的資源,分別為〈B,20,12O和 <1,100,110>,故刪除上述兩項(xiàng)并釋放塊號(hào)20和索引節(jié)點(diǎn)號(hào)100對(duì)應(yīng)的資 源。然后,將"待刪除快照"的COW一list中的三項(xiàng)資源記錄項(xiàng)全部合并 到相鄰新版本的COWJist中,最后在快照鏈表中刪除"待刪除快照"對(duì) 應(yīng)的根索引節(jié)點(diǎn),并將剩余兩個(gè)版本相鏈接。
除了上述的快照創(chuàng)建和快照刪除流程外,本發(fā)明還包括對(duì)目錄工作版 本的修改。對(duì)目錄工作版本的修改是指修改該目錄的工作版本對(duì)應(yīng)的樹中 任何內(nèi)容,比如,附圖1中的2就是/root/usr/dir/的工作版本形成的一棵樹, 修改樹中任何內(nèi)容都被稱為對(duì)目錄工作版本的修改。
在對(duì)目錄工作版本的修改過程中,還可能會(huì)引發(fā)COW的操作。為了 便于理解,首先對(duì)COW操作的基本思想進(jìn)行舉例說明。
目錄a有兩個(gè)子節(jié)點(diǎn)b和c,且a為根節(jié)點(diǎn)。假設(shè)對(duì)a創(chuàng)建快照,在 創(chuàng)建過程中復(fù)制a成a,, a,即為新創(chuàng)建的快照版本的根節(jié)點(diǎn)。此時(shí)a指向 自己子節(jié)點(diǎn)b和c,由于a,是復(fù)制的,所以a,也指向子節(jié)點(diǎn)b和c,即b 和c是被共享的資源。訪問工作版本時(shí),通過a、 a指向子節(jié)點(diǎn)b的指針、 a指向子節(jié)點(diǎn)c的指針即可以訪問到工作版本的所有內(nèi)容。同理,訪問快 照版本時(shí),通過a,、 a,指向子節(jié)點(diǎn)b的指針、a,指向子節(jié)點(diǎn)c的指針也都 可以訪問到快照版本的所有內(nèi)容。
當(dāng)工作版本需要修改時(shí),例如b中原來有從1到10共10個(gè)值,需要 將其中的2修改為20,但是不能直接修改b,因?yàn)閎被快照a,也引用著, 在任何時(shí)刻訪問快照a,中的b節(jié)點(diǎn)內(nèi)容必須都一樣(內(nèi)容仍然是1到10), 如果修改b,那么工作版本的修改成功了 ,快照版本的內(nèi)容就被破壞了。 所以,此時(shí)需要進(jìn)行一次COW操作首先復(fù)制一個(gè)b,(即新分配一個(gè)b,, 將b的內(nèi)容拷貝到b,中,b,中有從l到10的10個(gè)值),然后將b,的內(nèi)容進(jìn)行修改(如將b,中的2修改為20),稱b為被COW的源節(jié)點(diǎn),b,為COW 出的新節(jié)點(diǎn)。在COW后,再將a指向b的子節(jié)點(diǎn)指針修改為指向b,。經(jīng) 過上述操作,c還是共享的,但是b和b,就分開了,之后再對(duì)b,進(jìn)行修改, 就不需要COW操作,因?yàn)榇藭r(shí)的b,僅屬于工作版本。
在對(duì)COW操作的思想進(jìn)行說明后,下面對(duì)修改目錄工作版本的流程 進(jìn)行具體的說明。對(duì)目錄工作版本的修改可能涉及目錄元素樹中多個(gè)節(jié)點(diǎn) 都需要進(jìn)行修改,而下面僅描述了修改其中某個(gè)節(jié)點(diǎn)的流程,因?yàn)樵摴?jié)點(diǎn) 可以是任何一類非葉子節(jié)點(diǎn)或葉子節(jié)點(diǎn)。
所有索引節(jié)點(diǎn)中都存在一個(gè)快照集指針(snapset ptr)和一個(gè)時(shí)間戳 (timestamp),在附圖2中存在于索引節(jié)點(diǎn)的文件屬性中,在該snapsetptr 有效的情況下,指向本索引節(jié)點(diǎn)所屬快照集的最新版本的根索引節(jié)點(diǎn),如 果它的值為空,則表示本索引節(jié)點(diǎn)不屬于一個(gè)快照集。而timestamp則是 判斷snapset ptr有效性的一個(gè)必要條件,通過比較timestamp與LMTS判 斷snapset ptr是否有效,LMTS表示最近新增或刪除快照集的時(shí)間點(diǎn), timestamp大于LMTS則snapset ptr有々文,否則無歲文。
參考圖8,目錄工作版本的修改流程如下
3-1、獲取待修改節(jié)點(diǎn)所對(duì)應(yīng)的索引節(jié)點(diǎn),如果待修改節(jié)點(diǎn)就是一個(gè)索 引節(jié)點(diǎn),則獲取的索引節(jié)點(diǎn)就是其自身;
3_2、若索引節(jié)點(diǎn)中的timestamp大于LMTS,且snapset ptr為空,貝寸 不需要COW,直接修改待修改節(jié)點(diǎn),修改過程結(jié)束;
本步驟中,"timestamp大于LMTS"可證明snapset ptr有效,而在有 效的情況下,snapset ptr為空則說明待修改節(jié)點(diǎn)不屬于一個(gè)快照集,那么 就不存在快照版本和工作版本共享的問題,也就不需要進(jìn)行COW操作。 即任何不屬于快照集的目錄進(jìn)行修改時(shí),均不需要COW操作。
3-3 、若索引節(jié)點(diǎn)中的timestamp大于LMTS,且snapset ptr不為空, 說明待修改節(jié)點(diǎn)屬于此snapset ptr指向的快照集,則比較該快照集中最新 的快照版本的創(chuàng)建時(shí)間(epoch)與待修改節(jié)點(diǎn)的出生時(shí)間(記錄在其父 節(jié)點(diǎn)中)兩者的大小
(一)出生時(shí)間大于或等于epoch,則不需要COW,直接修改待修改 節(jié)點(diǎn),修改過程結(jié)束。
在這種情況下,說明待修改節(jié)點(diǎn)已經(jīng)進(jìn)行過COW操作,僅屬于工作 版本,可直接進(jìn)行修改,無需再做COW操作。例如前文COW操作實(shí)
例中COW出的新節(jié)點(diǎn)b,,它的出生時(shí)間肯定大于當(dāng)時(shí)最新快照的epoch, 則修改b,時(shí)不需要COW,直接修改即可。
(二)出生時(shí)間小于epoch,則需要COW并修改待^修改節(jié)點(diǎn);并且 需要上溯判斷父節(jié)點(diǎn)是否需要COW,如果其父節(jié)點(diǎn)的出生時(shí)間小于 epoch,則父節(jié)點(diǎn)也需要COW,進(jìn)行父節(jié)點(diǎn)的修改后還需上溯到祖父節(jié)點(diǎn) 進(jìn)行COW判斷和修改,直到 一個(gè)祖先節(jié)點(diǎn)的出生時(shí)間大于或等于epoch, 才停止上溯,修改過程結(jié)束。
在這種情況下,說明待修改節(jié)點(diǎn)是被工作版本和最新的'決照版本共 享,因此需要進(jìn)行COW。并且,在本步驟中需要上溯父節(jié)點(diǎn)是因?yàn)楦改?錄可能也被共享,如果共享,那么父目錄由于需要修改其指向子目錄的指 針和出生時(shí)間,所以也就需要COW。同理一直需要上溯到一個(gè)在此之前 已經(jīng)COW過的祖先節(jié)點(diǎn)。這一上溯過程有可能會(huì)上溯到這個(gè)工作版本的 根索引節(jié)點(diǎn)。
另外,任何進(jìn)行COW操作的節(jié)點(diǎn),都需要將被COW的原節(jié)點(diǎn)的< 類型,節(jié)點(diǎn)號(hào),出生時(shí)間>記錄到目錄工作版本的COW—list中。
3_4、若索引節(jié)點(diǎn)中的timestamp小于LMTS,表示最近發(fā)生過快照 集的新增或刪除,即snapsetptr可能無效,故需要對(duì)snapset ptr進(jìn)行更新。 更新過程通過將該節(jié)點(diǎn)的絕對(duì)路徑名與快照集索引表中的快照集信息進(jìn) 行前綴匹配
(一) 若沒有匹配,則證明此時(shí)待修改節(jié)點(diǎn)不屬于任何快照集,需要 更新索引節(jié)點(diǎn)的timestamp且將snapset ptr設(shè)置為空,不進(jìn)行COW操作, 直接修改待修改節(jié)點(diǎn),修改過程結(jié)束;
(二) 若能夠匹配,則證明此時(shí)待修改節(jié)點(diǎn)存在于一個(gè)快照集中,所 以無論之前的snapset ptr是何內(nèi)容,都將其更新為索引表中的相應(yīng)記錄中 的最新版本的根索引節(jié)點(diǎn)號(hào),并更新索引節(jié)點(diǎn)的timestamp,而后跳至步 驟3-3。
在本步驟中,對(duì)索引節(jié)點(diǎn)的timestamp的修改不同于普通的對(duì)索引 節(jié)點(diǎn)的修改,不需進(jìn)行是否COW的判斷及父節(jié)點(diǎn)上溯等過程。
最后所應(yīng)說明的是,以上實(shí)施例僅用以說明本發(fā)明的技術(shù)方案而非限 制。盡管參照實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng) 理解,對(duì)本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,都不脫離本發(fā)明技術(shù)方
案的精神和范圍,其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求范圍當(dāng)中。
權(quán)利要求
1、一種計(jì)算機(jī)文件系統(tǒng)快照的創(chuàng)建方法,為計(jì)算機(jī)文件系統(tǒng)中的指定目錄創(chuàng)建快照,將創(chuàng)建快照后的相應(yīng)目錄稱為快照集;所述快照的創(chuàng)建包括以下步驟步驟1-1)、在計(jì)算機(jī)文件系統(tǒng)中,確定需要?jiǎng)?chuàng)建快照的目錄;步驟1-2)、判斷所述目錄是否創(chuàng)建過快照,若所述目錄為第一次創(chuàng)建快照,則將所述目錄的工作版本的根索引節(jié)點(diǎn)信息添加到快照集索引表的信息條目中,更新最近一次創(chuàng)建或者刪除快照集的時(shí)間點(diǎn)為計(jì)算機(jī)系統(tǒng)的當(dāng)前時(shí)間,然后執(zhí)行下一步,若所述目錄并非第一次創(chuàng)建快照,直接執(zhí)行下一步;步驟1-3)、分配一個(gè)新的索引節(jié)點(diǎn)作為所要?jiǎng)?chuàng)建的快照版本的根索引節(jié)點(diǎn),并將所述工作版本的根索引節(jié)點(diǎn)的內(nèi)容復(fù)制到新分配的索引節(jié)點(diǎn)中;步驟1-4)、將所述工作版本的寫時(shí)拷貝鏈表復(fù)制到新創(chuàng)建快照的根索引節(jié)點(diǎn)上,然后將工作版本的寫時(shí)拷貝鏈表內(nèi)容清空;步驟1-5)、將所述的快照版本的根索引節(jié)點(diǎn)的快照創(chuàng)建時(shí)間設(shè)置為計(jì)算機(jī)系統(tǒng)的當(dāng)前時(shí)間;步驟1-6)、將所述的快照版本的根索引節(jié)點(diǎn)鏈接到所述目錄的快照鏈表上。
2、 根據(jù)權(quán)利要求1所述的計(jì)算機(jī)文件系統(tǒng)快照的創(chuàng)建方法,其特征 在于,所述的快照集索引表用于維護(hù)計(jì)算機(jī)文件系統(tǒng)中所有快照集的索引<呂息。
3、 根據(jù)權(quán)利要求1所述的計(jì)算機(jī)文件系統(tǒng)快照的創(chuàng)建方法,其特征 在于,所述的最近一次創(chuàng)建或者刪除快照集的時(shí)間點(diǎn)為整個(gè)計(jì)算機(jī)文件系 統(tǒng)中維護(hù)的一個(gè)全局信息,所述的最近一次創(chuàng)建或者刪除快照集的時(shí)間點(diǎn) 記錄了最近一次快照集總數(shù)量發(fā)生變化的時(shí)間。
4、 根據(jù)權(quán)利要求1所述的計(jì)算機(jī)文件系統(tǒng)快照的創(chuàng)建方法,其特征 在于,所述的快照版本的根索引節(jié)點(diǎn)中包括有以下閾值快照創(chuàng)建時(shí)間、 最近的一個(gè)舊版本索引、最近的一個(gè)新版本索引,通過最近的一個(gè)舊版本 索引和最近的一個(gè)新版本索引,可將對(duì)應(yīng)快照集中所有版本通過將根索引 節(jié)點(diǎn)按照時(shí)間順序鏈接成一個(gè)快照鏈表。
5、 一種計(jì)算機(jī)文件系統(tǒng)快照的刪除方法,為計(jì)算機(jī)文件系統(tǒng)中的指定目錄刪除指定的快照版本,包括以下步驟步驟2-l)、在計(jì)算機(jī)文件系統(tǒng)中,在指定目錄的快照鏈表中選擇要?jiǎng)h 除的快照版本;步驟2-2)、查找所要?jiǎng)h除的快照版本的相鄰新版本,在所述的相鄰新 版本上查詢寫時(shí)拷貝鏈表,得到在相鄰新版本以及后續(xù)版本中不會(huì)被使用 的塊或索引節(jié)點(diǎn)的信息;所述的信息包括類型,塊號(hào)或索引節(jié)點(diǎn)號(hào),出生 時(shí)間;步驟2-3)、查找所要?jiǎng)h除快照版本的相鄰舊版本,從所述的相鄰舊版 本中找到所記錄的舊版本快照創(chuàng)建時(shí)間,若所要?jiǎng)h除的快照版本不存在相 鄰舊版本,則所要查找的舊版本快照創(chuàng)建時(shí)間為0;步驟2-4 )、將所述的相鄰新版本的寫時(shí)拷貝鏈表中的塊或索引節(jié)點(diǎn)的 出生時(shí)間逐個(gè)與步驟2-3)的查詢結(jié)果進(jìn)行比較,若一個(gè)塊或索引節(jié)點(diǎn)的 出生時(shí)間大于所述的查詢結(jié)果,則在寫時(shí)拷貝鏈表中刪除該塊或索引節(jié)點(diǎn) 的信息,并回收對(duì)應(yīng)的塊或索引節(jié)點(diǎn)資源;步驟2-5 )、將待刪除快照版本的寫時(shí)拷貝鏈表合并到相鄰新版本的寫 時(shí)拷貝鏈表中;步驟2-6)、將待刪除快照版本從快照鏈表中移出,并將代表相鄰新版 本的根索引節(jié)點(diǎn)與代表相鄰舊版本的根索引節(jié)點(diǎn)相連。
6、 根據(jù)權(quán)利要求5所述的計(jì)算機(jī)文件系統(tǒng)快照的刪除方法,其特征 在于,所述的寫時(shí)拷貝鏈表對(duì)應(yīng)一個(gè)快照版本,在所述的寫拷貝鏈表中記 錄著所對(duì)應(yīng)的快照版本因修改而引發(fā)寫時(shí)拷貝后,在本版本及后續(xù)的版本 中不會(huì)被使用的塊或索引節(jié)點(diǎn)的信息,所述的各塊或各索引節(jié)點(diǎn)信息均分 別通過三元組<類型,塊號(hào)/索引節(jié)點(diǎn)號(hào),出生時(shí)間>進(jìn)行表述。
7、 一種計(jì)算機(jī)文件系統(tǒng)快照的目錄工作版本修改方法,包括以下步驟步驟3-1 )、在計(jì)算機(jī)文件系統(tǒng)中,選取待修改節(jié)點(diǎn)所對(duì)應(yīng)的索引節(jié)點(diǎn); 步驟3-2 )、根據(jù)所述索引節(jié)點(diǎn)的時(shí)間戳與最近一次創(chuàng)建或者刪除快照 集的時(shí)間點(diǎn),對(duì)所述索引節(jié)點(diǎn)中的快照集指針有效性進(jìn)行判斷,若所述的 快照集指針有效,則執(zhí)行下一步,否則,執(zhí)行步驟3-4);步驟3-3 )、比較所述快照集指針?biāo)赶虻目煺占械淖钚驴煺瞻姹镜?創(chuàng)建時(shí)間,以及待修改節(jié)點(diǎn)的出生時(shí)間,根據(jù)比較結(jié)果,決定在結(jié)束修改過程前是否要進(jìn)行寫時(shí)拷貝操作;如果不需要,則直接修改待修改節(jié)點(diǎn)并結(jié)束修改過程;如果需要進(jìn)行寫時(shí)拷貝操作,則執(zhí)行寫時(shí)拷貝、修改寫時(shí)拷貝出的新節(jié)點(diǎn)、擴(kuò)充寫時(shí)拷貝鏈表后,最后還需向上追溯其在元素目錄樹中的父節(jié)點(diǎn),重新執(zhí)行本步驟;步驟3-4)、更新快照集指針,在所述的更新過程中,通過將所述節(jié)點(diǎn) 的絕對(duì)路徑名與快照集索引表中的快照集信息進(jìn)行前綴匹配,并根據(jù)匹配 結(jié)果更新所述快照集指針和時(shí)間戳。若更新后快照集指針為空,則結(jié)束更 新過程;若所述快照集指針不為空,則重新執(zhí)行步驟3-3)。
8、 根據(jù)權(quán)利要求7所述的計(jì)算機(jī)文件系統(tǒng)快照的目錄工作版本修改 方法,其特征在于,在所述的步驟3-3)中,所述的根據(jù)比較結(jié)果,決定 在結(jié)束修改過程前是否要進(jìn)行寫時(shí)拷貝操作包括a) 、若所述的出生時(shí)間大于或等于所述的創(chuàng)建時(shí)間,則不做寫時(shí)拷貝 操作,直接修改待修改節(jié)點(diǎn)并結(jié)束修改過程;b) 、若所述的出生時(shí)間小于所述的創(chuàng)建時(shí)間,對(duì)待修改節(jié)點(diǎn)做寫時(shí)拷 貝操作并修改所述節(jié)點(diǎn),然后將寫時(shí)拷貝對(duì)應(yīng)的原節(jié)點(diǎn)信息記錄到工作版 本的寫時(shí)拷貝鏈表中,最后還需對(duì)所述節(jié)點(diǎn)在所述元素目錄樹中的父節(jié)點(diǎn)進(jìn)行所述的出生時(shí)間與所述的創(chuàng)建時(shí)間之間的比較判斷,若所述父節(jié)點(diǎn)的 出生時(shí)間小于創(chuàng)建時(shí)間,則對(duì)所述的父節(jié)點(diǎn)做寫時(shí)拷貝操作,并修改父節(jié) 點(diǎn),將寫時(shí)拷貝對(duì)應(yīng)的原父節(jié)點(diǎn)信息記錄到工作版本的寫時(shí)拷貝鏈表中, 重復(fù)上述過程,直至一個(gè)祖先節(jié)點(diǎn)的出生時(shí)間大于或等于創(chuàng)建時(shí)間后,結(jié) 束余改過程。
9、 根據(jù)權(quán)利要求7所述的計(jì)算機(jī)文件系統(tǒng)快照的目錄工作版本修改 方法,其特征在于,在所述的步驟3-4)中,所述的根據(jù)匹配的結(jié)果,修 改快照集指針包括若匹配不成功,則將所述的快照集指針設(shè)置為空;若 匹配成功,則將快照集指針更新為所述快照集索引表中的相應(yīng)記錄中的最 新版本的根索引節(jié)點(diǎn)號(hào)。
10、 根據(jù)權(quán)利要求7或8或9所述的計(jì)算機(jī)文件系統(tǒng)快照的目錄工作 版本修改方法,其特征在于,在所述的步驟3-2)中,在對(duì)所述索引節(jié)點(diǎn) 中的快照集指針有效性進(jìn)行判斷時(shí),若所述索引節(jié)點(diǎn)的時(shí)間戳大于或等于 所述的最近 一 次創(chuàng)建或者刪除快照集的時(shí)間點(diǎn),則所述的快照集指針有 效。
11、 根據(jù)權(quán)利要求7所述的計(jì)算機(jī)文件系統(tǒng)快照的目錄工作版本修改方法,其特征在于,所述的時(shí)間戳用來判斷快照集狀態(tài)是否發(fā)生變化。
12、 根據(jù)權(quán)利要求7所述的計(jì)算機(jī)文件系統(tǒng)快照的目錄工作版本修改方法,其特征在于,所述的元素目錄樹是對(duì)計(jì)算機(jī)文件系統(tǒng)中包括索引節(jié)點(diǎn)、間址塊、目錄塊、數(shù)據(jù)塊在內(nèi)的4類基本元素進(jìn)行抽象后得到的,在 抽象過程中,將所述的索引節(jié)點(diǎn)、間址塊、目錄塊之類的非葉子節(jié)點(diǎn)抽象 為一種抽象節(jié)點(diǎn),所述的抽象節(jié)點(diǎn)包括本節(jié)點(diǎn)信息和子節(jié)點(diǎn)描述信息。
13、 根據(jù)權(quán)利要求'12所述的計(jì)算機(jī)文件系統(tǒng)快照的目錄工作版本修 改方法,其特征在于,所述的子節(jié)點(diǎn)描述信息包括子節(jié)點(diǎn)出生時(shí)間,子節(jié) 點(diǎn)描述和子節(jié)點(diǎn)指針。
全文摘要
本發(fā)明提供一種目錄級(jí)計(jì)算機(jī)文件系統(tǒng)快照的創(chuàng)建方法,包括確定需要?jiǎng)?chuàng)建快照的目錄;當(dāng)目錄第一次創(chuàng)建快照時(shí),將目錄工作版本的根索引節(jié)點(diǎn)信息添加到快照集索引表中,更新最近一次創(chuàng)建或者刪除快照集的時(shí)間點(diǎn);分配一個(gè)新的索引節(jié)點(diǎn)作為所要?jiǎng)?chuàng)建的快照版本的根索引節(jié)點(diǎn),并將工作版本的根索引節(jié)點(diǎn)的內(nèi)容復(fù)制到新分配的索引節(jié)點(diǎn)中;將工作版本的寫時(shí)拷貝鏈表復(fù)制到新創(chuàng)建快照的根索引節(jié)點(diǎn)上,然后清空工作版本的寫時(shí)拷貝鏈表內(nèi)容;將快照版本的根索引節(jié)點(diǎn)的快照創(chuàng)建時(shí)間設(shè)置為計(jì)算機(jī)系統(tǒng)的當(dāng)前時(shí)間;將快照版本的根索引節(jié)點(diǎn)鏈接到目錄的快照鏈表上。本發(fā)明還提供了目錄級(jí)計(jì)算機(jī)文件系統(tǒng)快照的刪除方法,以及目錄工作版本修改方法。
文檔編號(hào)G06F11/14GK101178677SQ20071017713
公開日2008年5月14日 申請(qǐng)日期2007年11月9日 優(yōu)先權(quán)日2007年11月9日
發(fā)明者瀏 劉, 張軍偉, 張建剛, 張敬亮, 董歡慶 申請(qǐng)人:中國(guó)科學(xué)院計(jì)算技術(shù)研究所