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

一種組織和訪(fǎng)問(wèn)分布式文件系統(tǒng)目錄的方法

文檔序號(hào):6387250閱讀:192來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):一種組織和訪(fǎng)問(wèn)分布式文件系統(tǒng)目錄的方法
技術(shù)領(lǐng)域
本發(fā)明涉及計(jì)算機(jī)存儲(chǔ)系統(tǒng)技術(shù)領(lǐng)域,特別是一種組織和訪(fǎng)問(wèn)分布式文件系統(tǒng)目錄的方法。
背景技術(shù)
隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展、信息量的與日俱增,存儲(chǔ)系統(tǒng)已經(jīng)成為計(jì)算機(jī)系統(tǒng)尤其是大型分布式計(jì)算機(jī)系統(tǒng)的瓶頸。分布式文件系統(tǒng)可以方便有效地管理存儲(chǔ)系統(tǒng),并充分發(fā)揮存儲(chǔ)子系統(tǒng)的性能。附圖1給出了分布式文件系統(tǒng)的典型結(jié)構(gòu),分布式文件系統(tǒng)由多個(gè)服務(wù)器和多個(gè)客戶(hù)端組成。按照功能,從邏輯上可以將服務(wù)器劃分為元數(shù)據(jù)管理服務(wù)器和存儲(chǔ)服務(wù)器。
研究人員發(fā)現(xiàn),在目前大多數(shù)應(yīng)用中,元數(shù)據(jù)操作的數(shù)量遠(yuǎn)遠(yuǎn)大于普通的文件讀寫(xiě)數(shù)量,而絕大多數(shù)的元數(shù)據(jù)操作是針對(duì)文件系統(tǒng)目錄的,可以分為兩類(lèi)一類(lèi)是在已存在的目錄下增加或刪除一個(gè)目錄項(xiàng);另一類(lèi)是在一個(gè)目錄下查詢(xún)指定名字的目錄項(xiàng)。目錄的規(guī)模將隨著目錄項(xiàng)的增加而不斷膨脹。
當(dāng)前的應(yīng)用,特別是大規(guī)??茖W(xué)計(jì)算和事務(wù)處理,越來(lái)越趨向于在一個(gè)目錄下存放大量的文件系統(tǒng)對(duì)象(文件和子目錄),這就迫切要求分布式文件系統(tǒng)具有有效地支持在大目錄中快速的增加或者查找某一個(gè)目錄項(xiàng)的能力。
目前,絕大多數(shù)分布式文件系統(tǒng)都采用線(xiàn)性的方式或者平衡二叉樹(shù)的方式組織文件系統(tǒng)目錄。
對(duì)于線(xiàn)性組織方式,每當(dāng)往文件系統(tǒng)的某個(gè)目錄中增加一個(gè)目錄項(xiàng),需要從頭至尾查找足夠容納新增目錄項(xiàng)的空閑空間;當(dāng)查找指定名字的目錄項(xiàng)時(shí),也需要順序地查詢(xún)相應(yīng)目錄中的所有目錄項(xiàng),逐一對(duì)比文件名。這種方式的效率將隨著目錄規(guī)模的增大而下降。
平衡二叉樹(shù)的方法將目錄的內(nèi)容存放在二叉樹(shù)的節(jié)點(diǎn)中。與線(xiàn)性的方式相比,具有更高的效率,但是,為了確保效率,該方法需要在增加和刪除目錄項(xiàng)的操作過(guò)程中,及時(shí)地調(diào)整二叉樹(shù),使得它仍舊保持平衡,這種調(diào)整過(guò)程將對(duì)性能造成很大的影響。在該種方法中,增加和查找目錄項(xiàng)需要從二叉樹(shù)的根部開(kāi)始往樹(shù)的葉子方向依次查找路徑中的每個(gè)節(jié)點(diǎn),當(dāng)目錄的規(guī)模越大,樹(shù)的深度增加,這種方法的搜索路徑越長(zhǎng),它的效率也就相應(yīng)的下降。
鑒于現(xiàn)有的技術(shù)都無(wú)法滿(mǎn)足分布式文件系統(tǒng)高效地支持大目錄操作的需求,提出一種高效地組織和訪(fǎng)問(wèn)目錄的技術(shù)有著重要的意義。
針對(duì)這種需求,我們提出了一種新的方法多層次的、受限的、動(dòng)態(tài)可擴(kuò)展Hash技術(shù)。

發(fā)明內(nèi)容
本發(fā)明的目的在于,提供一種新的組織和訪(fǎng)問(wèn)分布式計(jì)算機(jī)文件系統(tǒng)目錄的方法,該方法通過(guò)對(duì)分布式計(jì)算機(jī)文件系統(tǒng)按照一定的結(jié)構(gòu)進(jìn)行組織,并提供專(zhuān)門(mén)的修改和訪(fǎng)問(wèn)目錄的函數(shù),使得采用該方法的文件系統(tǒng)能夠提高目錄操作的效率。
特別是針對(duì)需要同時(shí)處理大量文件的分布式計(jì)算機(jī)文件系統(tǒng),以提高這種系統(tǒng)支持多個(gè)計(jì)算機(jī)節(jié)點(diǎn)同時(shí)創(chuàng)建、刪除及查找文件和目錄的速度。
本發(fā)明是一種新的組織和訪(fǎng)問(wèn)文件系統(tǒng)目錄的方法,其步驟為1)采用可擴(kuò)展的Hash技術(shù)來(lái)組織文件系統(tǒng)的目錄,一個(gè)目錄項(xiàng)塊對(duì)應(yīng)一個(gè)有效的Hash值,隨著目錄規(guī)模的增大,Hash值的有效位不斷增加,Hash表的規(guī)模也不斷增長(zhǎng);2)使用分布式文件系統(tǒng)元數(shù)據(jù)管理服務(wù)器所在計(jì)算機(jī)的本地文件系統(tǒng)中的兩個(gè)獨(dú)立的文件分別存放目錄的索引結(jié)構(gòu)和目錄的內(nèi)容;3)該方法采用的是多層次的Hash表,允許不同的目錄項(xiàng)塊對(duì)應(yīng)的Hash值的有效位可以不同;4)為避免Hash表的不斷膨脹,限制有效位數(shù)增長(zhǎng)的上限值;5)針對(duì)順序讀取目錄項(xiàng)內(nèi)容提出了按目錄項(xiàng)有效位的寬度串行搜索方法,避免重復(fù)讀取目錄項(xiàng)或者遺漏目錄項(xiàng);
6)該方法在元數(shù)據(jù)管理服務(wù)器內(nèi)部實(shí)現(xiàn)為一個(gè)功能模塊,向元數(shù)據(jù)管理服務(wù)器提供修改和讀取目錄內(nèi)容的函數(shù),完成任何針對(duì)目錄內(nèi)容的操作。
所述的組織和訪(fǎng)問(wèn)分布式文件系統(tǒng)目錄的方法,采用多層次、受限的、動(dòng)態(tài)可擴(kuò)展Hash技術(shù)來(lái)組織文件系統(tǒng)的目錄,一個(gè)目錄項(xiàng)塊對(duì)應(yīng)一個(gè)有效的Hash值,隨著目錄規(guī)模的增大,Hash值的有效位不斷增加,Hash表的規(guī)模也不斷增長(zhǎng);針對(duì)分布式文件系統(tǒng)中的任何一個(gè)目錄使用分布式文件系統(tǒng)元數(shù)據(jù)服務(wù)器在計(jì)算機(jī)本地文件系統(tǒng)中的兩個(gè)獨(dú)立的文件分別存放目錄的索引結(jié)構(gòu)和目錄的內(nèi)容;該方法采用的是多層次的Hash表,允許不同的目錄項(xiàng)塊對(duì)應(yīng)的Hash值的有效位可以不同;為避免Hash表的不斷膨脹,限制有效位數(shù)增長(zhǎng)的上限值;針對(duì)順序讀取目錄項(xiàng)內(nèi)容提出了按目錄項(xiàng)有效位的寬度串行搜索方法,避免重復(fù)讀取目錄項(xiàng)或者遺漏目錄項(xiàng);該方法在元數(shù)據(jù)管理服務(wù)器內(nèi)部實(shí)現(xiàn)為一個(gè)模塊,向元數(shù)據(jù)管理服務(wù)器提供修改和讀取目錄內(nèi)容的函數(shù),完成任何針對(duì)目錄內(nèi)容的操作,該方法采用如下技術(shù)實(shí)現(xiàn)目錄的管理(1)針對(duì)每一個(gè)分布式文件系統(tǒng)的目錄提供兩個(gè)本地磁盤(pán)中的文件一個(gè)是目錄項(xiàng)文件,存放該目錄的所有目錄項(xiàng),它按固定大小的塊進(jìn)行組織,同一塊中的目錄項(xiàng)的Hash值相同;另一個(gè)是索引文件,可以將整個(gè)索引文件看作一個(gè)Hash表,而Hash表的每一個(gè)入口項(xiàng)是與該Hash值對(duì)應(yīng)的索引結(jié)構(gòu),用于記錄相應(yīng)Hash值所對(duì)應(yīng)的塊在目錄項(xiàng)文件中的位置,以及一些與動(dòng)態(tài)Hash技術(shù)相關(guān)的信息,在下述內(nèi)容中會(huì)詳細(xì)描述。Hash值對(duì)應(yīng)索引結(jié)構(gòu)在索引文件中的序號(hào),例如,假設(shè)Hash值為n,索引結(jié)構(gòu)的大小為size,則該Hash值對(duì)應(yīng)的索引結(jié)構(gòu)在索引文件中的位置就是n*size,從該位置讀取索引結(jié)構(gòu),然后就可以獲得該目錄項(xiàng)所在塊在目錄項(xiàng)文件中的位置。為了避免在Hash函數(shù)值不均勻時(shí)Hash表的過(guò)度膨脹造成索引文件的急劇增長(zhǎng),我們限定Hash值最大有效位位數(shù);(2)為了避免Hash表分裂時(shí)修改表項(xiàng)和將Hash表寫(xiě)回計(jì)算機(jī)磁盤(pán)的開(kāi)銷(xiāo),該方法維護(hù)了一個(gè)多層次的Hash表,即每個(gè)Hash表項(xiàng)的有效位數(shù)可以不同。下面針對(duì)幾個(gè)重要的目錄操作分別進(jìn)行說(shuō)明,其中目錄塊的標(biāo)號(hào)均以二進(jìn)制的方式表示。
本發(fā)明——一種組織和訪(fǎng)問(wèn)分布式文件系統(tǒng)目錄的方法,共由四個(gè)關(guān)鍵的子方法構(gòu)成,分別為目錄項(xiàng)塊的分裂方法、增加目錄項(xiàng)的方法、查找指定名字的目錄項(xiàng)的方法以及順序讀取目錄內(nèi)容的處理方法,下面詳細(xì)說(shuō)明每一種子方法的具體流程。
(1)目錄項(xiàng)塊的分裂方法,該子方法確定了在本發(fā)明中,針對(duì)目錄項(xiàng)塊存滿(mǎn)后所需要進(jìn)行的處理,該子方法被(2)增加目錄項(xiàng)的方法中,增加目錄項(xiàng)的方法所調(diào)用。
當(dāng)某一個(gè)目錄項(xiàng)塊已經(jīng)存滿(mǎn)目錄項(xiàng),再往里增加目錄項(xiàng)時(shí),必須對(duì)其進(jìn)行分裂,動(dòng)態(tài)擴(kuò)展其索引文件的大小,這是本發(fā)明中的關(guān)鍵部分。在描述具體的分裂方法之前先作如下的前提說(shuō)明。
使用全局深度global_depth記錄當(dāng)前時(shí)刻的最大有效位數(shù)(這個(gè)值記錄在索引文件的某個(gè)固定位置,一般在文件的開(kāi)頭),同時(shí)在每一個(gè)索引結(jié)構(gòu)中加入局部深度local_depth表示該目錄項(xiàng)塊所對(duì)應(yīng)的有效位數(shù)。每一次分裂后相應(yīng)被分裂的塊和分裂后生成塊的local_depth都等于此時(shí)的global_depth。
如果是往一個(gè)local_depth小于global_depth的目錄項(xiàng)塊中增加一個(gè)目錄項(xiàng),此時(shí),為了在后續(xù)的查找和增加目錄項(xiàng)的操作更為簡(jiǎn)單,將該塊進(jìn)行分裂,根據(jù)目錄項(xiàng)的Hash值將該塊中的目錄項(xiàng)移到對(duì)應(yīng)的索引結(jié)構(gòu)所指向的塊中,此時(shí),這些索引結(jié)構(gòu)都為空,因此在移入第一個(gè)目錄項(xiàng)的之前,為其從目錄項(xiàng)文件的末尾分配一塊,并將原來(lái)的目錄塊所對(duì)應(yīng)的索引結(jié)構(gòu)中的local_depth置為global_depth,其它新分配塊的索引結(jié)構(gòu)中的local_depth也作同樣的設(shè)置,而此時(shí)global_depth不用變。
由此可知,只有當(dāng)local_depth=global_depth的塊被分裂時(shí),global_depth的值才需要增一,否則(local_depth<global_depth),只需將local_depth設(shè)為global_depth即可。這種延遲分裂的策略,即提高了效率,同時(shí)也節(jié)省了索引文件和目錄項(xiàng)文件的空間。
為了避免由于Hash函數(shù)的不均勻造成索引文件的急劇膨脹,在此,設(shè)置global_depth的增長(zhǎng)上限,當(dāng)分裂過(guò)程中發(fā)現(xiàn)global_depth達(dá)到該上限值后,任何local_depth=global_depth的塊不再進(jìn)行分裂,而是為該索引分配另外一個(gè)目錄項(xiàng)塊,并將屬于該索引結(jié)構(gòu)的所有目錄項(xiàng)塊鏈接起來(lái)。
整個(gè)分裂過(guò)程在本方法中以一個(gè)函數(shù)的形式提供給元數(shù)據(jù)服務(wù)器調(diào)用,假設(shè)當(dāng)前目錄項(xiàng)塊blk已經(jīng)存滿(mǎn),此時(shí)往里增加一個(gè)新的目錄項(xiàng),則必須進(jìn)行分裂,其詳細(xì)分裂過(guò)程如下a)如果目錄項(xiàng)塊blk的local_depth小于global_depthI.將目錄項(xiàng)塊blk的local_depth的值直接設(shè)為global_depth;II.針對(duì)目錄項(xiàng)塊blk中的每一個(gè)目錄項(xiàng)作如下操作重新計(jì)算目錄項(xiàng)的hash值,取hash值的低local_depth位,記為cur_value,判斷cur_value是否與目錄項(xiàng)塊blk所對(duì)應(yīng)的索引結(jié)構(gòu)在hash表中序號(hào)相同。如果相同,則無(wú)需做任何處理。如果不同,則需要將該目錄項(xiàng)移到其他目錄項(xiàng)塊中。根據(jù)cur_value值,找到對(duì)應(yīng)的索引結(jié)構(gòu),此時(shí)分為兩種情況i.如果索引結(jié)構(gòu)中指定了對(duì)應(yīng)的目錄項(xiàng)塊在目錄項(xiàng)文件中的偏移地址,說(shuō)明目標(biāo)目錄項(xiàng)塊已經(jīng)存在,則直接將該目錄項(xiàng)從原目錄項(xiàng)塊中刪除,加入到目標(biāo)目錄項(xiàng)塊中,這樣對(duì)這個(gè)目錄項(xiàng)的處理完成。
ii.如果索引結(jié)構(gòu)沒(méi)有指定對(duì)應(yīng)的目錄項(xiàng)塊在目錄項(xiàng)文件中的偏移地址,則說(shuō)明目標(biāo)目錄項(xiàng)塊不存在,這時(shí)從目錄項(xiàng)文件末尾分配一個(gè)目錄項(xiàng)塊,將目錄項(xiàng)塊在目錄項(xiàng)文件中的偏移地址記錄到索引結(jié)構(gòu)中,新增的目錄項(xiàng)塊的local_depth等于global_depth。然后將目錄項(xiàng)從原目錄項(xiàng)塊blk中移到新增的目錄項(xiàng)塊中。
III.分裂結(jié)束。
b)如果目錄項(xiàng)塊blk的local_depth等于global_depth,此時(shí)分兩種情況I.global_depth已經(jīng)達(dá)到最大所允許的有效位數(shù)的上限值。如果已經(jīng)存在有一個(gè)以上的目錄項(xiàng)塊由于與目錄項(xiàng)塊blk具有相同的hash值,而構(gòu)成一個(gè)隊(duì)列,則查詢(xún)?cè)撽?duì)列的最后一個(gè)目錄項(xiàng)塊中是否有空閑的空間足夠容納新增的目錄項(xiàng),如果有,則將該新增的目錄項(xiàng)加入即可。如果沒(méi)有該隊(duì)列的存在或者隊(duì)列末尾的目錄項(xiàng)塊也已經(jīng)存滿(mǎn),則在目錄項(xiàng)文件的末尾分配一個(gè)新的目錄項(xiàng)塊,與目錄項(xiàng)塊blk連成一個(gè)隊(duì)列,新增目錄項(xiàng)塊放在隊(duì)列的末尾,隊(duì)列指針(即隊(duì)列中后一個(gè)目錄項(xiàng)塊在目錄項(xiàng)文件中的偏移地址)存放在隊(duì)列前一個(gè)目錄項(xiàng)塊的最末尾8個(gè)字節(jié)中,新增的目錄項(xiàng)加入到該新的目錄項(xiàng)塊中。
II.如果global_depth小于最大所允許的有效位數(shù)的上限值i.將global_depth的值增一,并將新的global_depth值賦給目錄項(xiàng)塊blk的local_depth。
ii.針對(duì)目錄項(xiàng)塊blk中的每一個(gè)目錄項(xiàng),做如下操作重新計(jì)算目錄項(xiàng)的hash值,取hash值的低local_depth位,記為cur_value,判斷cur_value是否與目錄項(xiàng)塊blk所對(duì)應(yīng)的索引結(jié)構(gòu)在hash表中序號(hào)相同。如果相同,則無(wú)需做任何處理。如果不同,則需要將該目錄項(xiàng)移到其他目錄項(xiàng)塊中。根據(jù)cur_value值,找到對(duì)應(yīng)的索引結(jié)構(gòu),此時(shí)將分兩種情況i)如果索引結(jié)構(gòu)中指定了對(duì)應(yīng)的目錄項(xiàng)塊在目錄項(xiàng)文件中的偏移地址,說(shuō)明目標(biāo)目錄項(xiàng)塊已經(jīng)存在,則直接將該目錄項(xiàng)從原目錄項(xiàng)塊中刪除,加入到目標(biāo)目錄項(xiàng)塊中,這樣對(duì)這個(gè)目錄項(xiàng)的處理完成。
ii)如果索引結(jié)構(gòu)沒(méi)有指定對(duì)應(yīng)的目錄項(xiàng)塊在目錄項(xiàng)文件中的偏移地址,則說(shuō)明目標(biāo)目錄項(xiàng)塊不存在,這時(shí)從目錄項(xiàng)文件末尾分配一個(gè)目錄項(xiàng)塊,將目錄項(xiàng)塊在目錄項(xiàng)文件中的偏移地址記錄到索引結(jié)構(gòu)中,新增的目錄項(xiàng)塊的local_depth等于global_depth。然后將目錄項(xiàng)從原目錄項(xiàng)塊blk中移到新增的目錄項(xiàng)塊中。
(2)增加目錄項(xiàng)的方法,該子方法提供給元數(shù)據(jù)服務(wù)器,用于往指定的目錄中增加一個(gè)目錄項(xiàng);增加目錄項(xiàng)的函數(shù)傳入的參數(shù)為對(duì)應(yīng)指定名字的目錄項(xiàng)和該目錄項(xiàng)所應(yīng)該存放的目錄。其詳細(xì)過(guò)程如下a)計(jì)算指定目錄項(xiàng)名字的Hash值;b)從索引文件中獲得此時(shí)該目錄的全局深度global_depth,將它存放到一個(gè)臨時(shí)變量tmp_depth中;c)取a)中計(jì)算的hash值的二進(jìn)制數(shù)的低tmp_depth位為當(dāng)前的有效位,記為eff_valued)從索引文件中偏移為eff_value*(索引結(jié)構(gòu)大小)的位置取出相應(yīng)的索引結(jié)構(gòu);
e)如果所取到的索引結(jié)構(gòu)為空,tmp_depth的值減一,回到c);否則,從索引結(jié)構(gòu)中獲得對(duì)應(yīng)目錄項(xiàng)塊在目錄項(xiàng)文件中的地址,取出目錄項(xiàng)塊blk;f)如果blk已滿(mǎn),則調(diào)用分裂函數(shù),進(jìn)行分裂操作。分裂結(jié)束后將tmp_depth的值增1,轉(zhuǎn)到c)處。如果blk未滿(mǎn),還有能夠容納該目錄項(xiàng)的空閑空間,則繼續(xù)往下執(zhí)行。
g)如果當(dāng)前目錄項(xiàng)塊blk的局部深度local_depth等于全局深度global_depth,則將目錄項(xiàng)存放在blk中合適的位置,本函數(shù)結(jié)束;如果local_depth<global_depth,則對(duì)blk塊調(diào)用分裂函數(shù)進(jìn)行分裂操作。分裂結(jié)束后,將blk的local_depth設(shè)為global_depth,tmp_depth的值設(shè)為此時(shí)global_depth的值,轉(zhuǎn)到c)處執(zhí)行;(3)查找指定名字的目錄項(xiàng)的方法,該子方法由元數(shù)據(jù)服務(wù)器調(diào)用,用于在指定的目錄下查找一個(gè)指定名字的目錄項(xiàng);該函數(shù)用于查找某個(gè)指定名字的目錄項(xiàng),主要是服務(wù)于分布式文件系統(tǒng)客戶(hù)端的lookup請(qǐng)求。該函數(shù)的參數(shù)是指定的文件系統(tǒng)對(duì)象(文件或者子目錄)的名字和該對(duì)象所在的目錄。具體過(guò)程如下a)計(jì)算指定文件名的Hash值;b)從索引文件中獲取要查找的文件系統(tǒng)對(duì)象所在目錄的全局深度global_depth,并將它記錄在tmp_depth中;c)取a)中計(jì)算的Hash值對(duì)應(yīng)的二進(jìn)制數(shù)的低tmp_depth位的值作為有效值,賦給eff_value;d)從索引文件中偏移為eff_value*(索引結(jié)構(gòu)大小)的位置處取出索引結(jié)構(gòu);h)如果索引結(jié)構(gòu)的內(nèi)容為空,則將tmp_depth的值減一,回到c);否則,從索引結(jié)構(gòu)中獲得對(duì)應(yīng)目錄項(xiàng)塊在目錄項(xiàng)文件中的地址,取出目錄項(xiàng)塊blk;e)從blk中搜索文件名等于指定名字的目錄項(xiàng),如果找到則返回找到的目錄項(xiàng),該函數(shù)結(jié)束;否則,如果目錄項(xiàng)塊blk的局部深度local_depth的值小于全局深度global_depth,說(shuō)明指定名字的目錄項(xiàng)在該目錄下不存在,該函數(shù)結(jié)束;如果目錄項(xiàng)塊blk的局部深度local_depth的值等于全局深度global_depth,并且global_depth已經(jīng)達(dá)到了上限,此時(shí),如果blk之后還有其它與blk具有相同的hash值構(gòu)成的鏈表,則依次搜索該鏈表上的所有目錄項(xiàng)塊,如果找到則返回目錄項(xiàng),搜索完畢,該函數(shù)結(jié)束。
(4)順序讀取目錄內(nèi)容的處理的方法,該子方法提供給元數(shù)據(jù)服務(wù)器,用于處理readdir等順序讀取目錄的方法;UNIX和類(lèi)UNIX操作系統(tǒng)比如LINUX都提供了順序讀取目錄內(nèi)容的命令程序,比如ls,這種程序從一個(gè)目錄的某個(gè)位置開(kāi)始多次調(diào)用readdir操作順序讀取一定量的目錄內(nèi)容。由于目錄項(xiàng)塊在多個(gè)readdir操作之間可能由于加入新的目錄項(xiàng)而造成分裂,使得之前有些已經(jīng)讀取過(guò)的內(nèi)容被重復(fù)地訪(fǎng)問(wèn)或者在此次ls操作中遺漏某些目錄項(xiàng),為此,我們專(zhuān)門(mén)針對(duì)順序讀取目錄內(nèi)容提出了一種名為按目錄項(xiàng)有效位的寬度串行搜索方法。本方法有兩個(gè)特點(diǎn)(1)如果目錄項(xiàng)塊的局部深度小于全局深度,則該目錄項(xiàng)塊分裂后對(duì)應(yīng)的那些目錄項(xiàng)塊當(dāng)前都為空。例如,如果全局深度為5,一個(gè)目錄項(xiàng)塊對(duì)應(yīng)的hash有效值的二進(jìn)制數(shù)為101,即它的局部深度為3,則此時(shí)對(duì)應(yīng)hash有效值的二進(jìn)制數(shù)01101,10101,11101的目錄項(xiàng)塊都不存在;(2)被分裂的目錄項(xiàng)塊中的目錄項(xiàng)只會(huì)被移到hash有效值更大的目錄項(xiàng)塊中。根據(jù)這兩個(gè)特點(diǎn),針對(duì)順序讀取目錄內(nèi)容的操作做如下處理a)如果某個(gè)訪(fǎng)問(wèn)過(guò)的目錄項(xiàng)塊的局部深度小于全局深度,則在此次順序讀取目錄內(nèi)容的操作中,不訪(fǎng)問(wèn)其分裂后生成的目錄項(xiàng)塊。例如,假設(shè)全局深度為5,某個(gè)目錄項(xiàng)塊在訪(fǎng)問(wèn)的時(shí)候的局部深度為3,對(duì)應(yīng)的hash有效值為101,在讀取該目錄項(xiàng)塊結(jié)束后,但本次順序讀取目錄內(nèi)容的操作結(jié)束前,該目錄項(xiàng)塊進(jìn)行分裂,生成了對(duì)應(yīng)hash值為10101、01101、11101的目錄項(xiàng)塊,則在本次順序讀取目錄內(nèi)容的操作中將跳過(guò)這些新生成的目錄項(xiàng)塊。
b)為最后訪(fǎng)問(wèn)的目錄項(xiàng)塊定義一個(gè)二元組(orig_b,orig_depth),其中,orig_b表示最后一次訪(fǎng)問(wèn)該目錄項(xiàng)塊時(shí)的hash有效值,orig_depth表示最后一次訪(fǎng)問(wèn)該目錄項(xiàng)塊時(shí)的局部深度。如果最后一次只是訪(fǎng)問(wèn)目錄項(xiàng)塊的部分內(nèi)容而不是讀取整個(gè)塊,則需要將該二元組傳送給訪(fǎng)問(wèn)者。
c)在索引結(jié)構(gòu)中增加一項(xiàng)off_within_bucket用于記錄分裂后生成的目錄項(xiàng)塊從被分裂的目錄項(xiàng)塊中移過(guò)來(lái)的最后一個(gè)目錄項(xiàng)所存放的位置。
d)如果最后一次readdir操作只讀取了某個(gè)目錄項(xiàng)塊的部分內(nèi)容,當(dāng)后續(xù)的readdir操作讀取該目錄項(xiàng)塊的剩余部分內(nèi)容時(shí),需要對(duì)訪(fǎng)問(wèn)者提供的二元組進(jìn)行判斷如果orig_b等于當(dāng)前的目錄項(xiàng)塊的hash有效值,并且orig_depth也等于該目錄項(xiàng)塊的當(dāng)前局部深度,說(shuō)明該目錄項(xiàng)塊在兩次讀操作之間沒(méi)有被分裂,則直接讀取剩余內(nèi)容即可;如果orig_depth小于該目錄項(xiàng)塊的當(dāng)前局部深度,說(shuō)明在該readdir操作之前已經(jīng)進(jìn)行了分裂,則將所有本目錄項(xiàng)塊分裂后生成的目錄項(xiàng)塊中其索引結(jié)構(gòu)中的off_within_bucket指定位置之前的所有目錄項(xiàng)組成一個(gè)臨時(shí)的目錄項(xiàng)塊,將該臨時(shí)目錄項(xiàng)塊中本次readdir指定位置之后的目錄項(xiàng)傳送給訪(fǎng)問(wèn)者。


為進(jìn)一步說(shuō)明本發(fā)明的技術(shù)特征,以下結(jié)合實(shí)施實(shí)例及附圖詳細(xì)說(shuō)明于后,其中圖1是典型分布式文件系統(tǒng)結(jié)構(gòu)圖。
圖2是本發(fā)明的目錄項(xiàng)塊分裂的過(guò)程圖。
具體實(shí)施例方式
圖1的分布式文件系統(tǒng)的典型結(jié)構(gòu),分布式文件系統(tǒng)由多個(gè)服務(wù)器和多個(gè)客戶(hù)端組成。按照功能,從邏輯上可以將服務(wù)器劃分為元數(shù)據(jù)管理服務(wù)器和存儲(chǔ)服務(wù)器。
圖2索引文件中的標(biāo)號(hào)都是二進(jìn)制數(shù)。下文中給出的目錄項(xiàng)塊的標(biāo)號(hào)也為二進(jìn)制數(shù)。
圖2給出了目錄塊分裂過(guò)程的示意圖。圖2(1)子圖為有效位為1位時(shí)索引文件和目錄項(xiàng)文件結(jié)構(gòu),其中序號(hào)為1的索引結(jié)構(gòu)對(duì)應(yīng)的深灰色塊Blk1表示該目錄項(xiàng)塊已滿(mǎn),此時(shí)需要將它分裂為兩塊,新增的塊Blk2直接從目錄項(xiàng)文件的末尾分配存儲(chǔ)空間(對(duì)目錄項(xiàng)文件執(zhí)行append操作),并將它在目錄項(xiàng)文件中的偏移賦給圖2(2)中標(biāo)號(hào)為11的索引結(jié)構(gòu),global_depth增加為2,塊號(hào)為11的目錄塊的local_depth也置為2,而標(biāo)號(hào)為10的索引結(jié)構(gòu)此時(shí)在索引文件中為一個(gè)大小等于單個(gè)索引結(jié)構(gòu)長(zhǎng)度的空洞,因?yàn)樗谀夸涰?xiàng)文件中還沒(méi)有分配對(duì)應(yīng)的目錄項(xiàng)塊。如果經(jīng)過(guò)一段時(shí)間后圖2(2)中標(biāo)號(hào)為11的索引結(jié)構(gòu)對(duì)應(yīng)的塊Blk2也滿(mǎn),則再次分裂,得到圖2(3)所示的索引文件結(jié)構(gòu),此時(shí)在文件內(nèi)部只有四個(gè)索引結(jié)構(gòu)的值有效,并且Hash表中有三種不同的有效位數(shù),比如第0號(hào)對(duì)應(yīng)的塊Blk0中存放的是Hash值形如xx0的,也就是010、100、110的目錄項(xiàng),這些目錄項(xiàng)本該分別移入對(duì)應(yīng)010、100、110所對(duì)應(yīng)的塊中,也就是圖2(3)所示空白索引結(jié)構(gòu)所對(duì)應(yīng)的目錄項(xiàng)塊,但是,在此,為了提高系統(tǒng)的效率,采用延遲分裂的策略,只有在這些有效位較低的Hash值所指的目錄項(xiàng)塊被存滿(mǎn)時(shí),才一次性將各個(gè)目錄項(xiàng)移到相應(yīng)的塊中,例如,假設(shè)標(biāo)號(hào)為0所對(duì)應(yīng)的Blk0已滿(mǎn),則將所有的低三位Hash值為100的目錄項(xiàng)都移到標(biāo)號(hào)為100的索引結(jié)構(gòu)所對(duì)應(yīng)的塊中,因?yàn)榇藭r(shí)索引結(jié)構(gòu)為空,沒(méi)有對(duì)應(yīng)的塊,則為它在目錄項(xiàng)文件的末尾分配一塊,并用該塊的位置值初始化索引結(jié)構(gòu)。此時(shí)global_depth變?yōu)?,而標(biāo)號(hào)為11的塊剛剛被分裂,其中的目錄項(xiàng)有部分移到111號(hào)所對(duì)應(yīng)的塊中,因此11和111所對(duì)應(yīng)的索引結(jié)構(gòu)中的local_depth都為3,與global_depth相同。此時(shí)如果往附圖2第3個(gè)圖中增加一個(gè)hash值為110或者10的目錄項(xiàng),由于110和10對(duì)應(yīng)的索引結(jié)構(gòu)都為空,最后定位到序號(hào)為0所對(duì)應(yīng)的索引結(jié)構(gòu)上。
權(quán)利要求
1.一種組織和訪(fǎng)問(wèn)分布式文件系統(tǒng)目錄的方法,該方法采用可擴(kuò)展的Hash技術(shù)來(lái)組織計(jì)算機(jī)文件系統(tǒng)的目錄,一個(gè)目錄項(xiàng)塊對(duì)應(yīng)一個(gè)有效的Hash值,隨著目錄規(guī)模的增大,Hash值的有效位數(shù)不斷增加,Hash表的規(guī)模也不斷增長(zhǎng);針對(duì)分布式文件系統(tǒng)的任何一個(gè)目錄使用分布式文件系統(tǒng)元數(shù)據(jù)管理服務(wù)器所在計(jì)算機(jī)的本地文件系統(tǒng)中的兩個(gè)獨(dú)立的文件分別存放目錄的索引結(jié)構(gòu)和目錄的內(nèi)容;該方法采用的是多層次的Hash表,允許不同的目錄項(xiàng)塊對(duì)應(yīng)的Hash值的有效位數(shù)可以不同;為避免Hash表的不斷膨脹,限制有效位數(shù)增長(zhǎng)的上限值;針對(duì)順序讀取目錄項(xiàng)內(nèi)容提出了按目錄項(xiàng)有效位的寬度串行搜索方法,避免重復(fù)讀取目錄項(xiàng)或者遺漏目錄項(xiàng);該方法在元數(shù)據(jù)管理服務(wù)器內(nèi)部實(shí)現(xiàn)為一個(gè)模塊,向元數(shù)據(jù)管理服務(wù)器提供修改和讀取目錄內(nèi)容的函數(shù),完成任何針對(duì)目錄內(nèi)容的操作,該方法由四個(gè)子方法構(gòu)成,分別為1)增加目錄項(xiàng)的方法,該子方法提供給元數(shù)據(jù)服務(wù)器,用于往指定的目錄中增加一個(gè)目錄項(xiàng);2)目錄項(xiàng)查詢(xún)方法,該子方法由元數(shù)據(jù)服務(wù)器調(diào)用,用于在指定的目錄下查找一個(gè)指定名字的目錄項(xiàng);3)順序讀取目錄內(nèi)容的處理方法,該子方法提供給元數(shù)據(jù)服務(wù)器,用于處理readdir等順序讀取目錄的方法;4)目錄項(xiàng)塊存放后的分裂方法,該子方法確定了在本發(fā)明中,針對(duì)目錄項(xiàng)塊存滿(mǎn)后所需要進(jìn)行的處理,該子方法被上述1)中增加目錄項(xiàng)的方法所調(diào)用。
2.根據(jù)權(quán)利要求1的組織和訪(fǎng)問(wèn)分布式文件系統(tǒng)目錄的方法,其特征在于,目錄項(xiàng)塊存放后的分裂方法,其分裂過(guò)程步驟如下a)如果目錄項(xiàng)塊blk的local_depth小于global_depthI.將目錄項(xiàng)塊blk的local_depth的值直接設(shè)為global_depth;II.針對(duì)目錄項(xiàng)塊blk中的每一個(gè)目錄項(xiàng)作如下操作重新計(jì)算目錄項(xiàng)的hash值,取hash值的低local_depth位,記為cur_value,判斷cur_value是否與目錄項(xiàng)塊blk所對(duì)應(yīng)的索引結(jié)構(gòu)在hash表中序號(hào)相同,如果相同,則無(wú)需做任何處理,如果不同,則需要將該目錄項(xiàng)移到其他目錄項(xiàng)塊中,根據(jù)cur_value值,找到對(duì)應(yīng)的索引結(jié)構(gòu),此時(shí)分為兩種情況i.如果索引結(jié)構(gòu)中指定了對(duì)應(yīng)的目錄項(xiàng)塊在目錄項(xiàng)文件中的偏移地址,說(shuō)明目標(biāo)目錄項(xiàng)塊已經(jīng)存在,則直接將該目錄項(xiàng)從原目錄項(xiàng)塊中刪除,加入到目標(biāo)目錄項(xiàng)塊中,這樣對(duì)這個(gè)目錄項(xiàng)的處理完成;ii.如果索引結(jié)構(gòu)沒(méi)有指定對(duì)應(yīng)的目錄項(xiàng)塊在目錄項(xiàng)文件中的偏移地址,則說(shuō)明目標(biāo)目錄項(xiàng)塊不存在,這時(shí)從目錄項(xiàng)文件末尾分配一個(gè)目錄項(xiàng)塊,將目錄項(xiàng)塊在目錄項(xiàng)文件中的偏移地址記錄到索引結(jié)構(gòu)中,新增的目錄項(xiàng)塊的local_depth等于global_depth,然后將目錄項(xiàng)從原目錄項(xiàng)塊blk中移到新增的目錄項(xiàng)塊中,III.分裂結(jié)束;b)如果目錄項(xiàng)塊blk的local_depth等于global_depth,此時(shí)分兩種情況I.global_depth已經(jīng)達(dá)到最大所允許的有效位數(shù)的上限值,如果已經(jīng)存在有一個(gè)以上的目錄項(xiàng)塊由于與目錄項(xiàng)塊blk具有相同的hash值,而構(gòu)成一個(gè)隊(duì)列,則查詢(xún)?cè)撽?duì)列的最后一個(gè)目錄項(xiàng)塊中是否有空閑的空間足夠容納新增的目錄項(xiàng),如果有,則將該新增的目錄項(xiàng)加入即可,如果沒(méi)有該隊(duì)列的存在或者隊(duì)列末尾的目錄項(xiàng)塊也已經(jīng)存滿(mǎn),則在目錄項(xiàng)文件的末尾分配一個(gè)新的目錄項(xiàng)塊,與目錄項(xiàng)塊blk連成一個(gè)隊(duì)列,新增目錄項(xiàng)塊放在隊(duì)列的末尾,隊(duì)列指針,即隊(duì)列中后一個(gè)目錄項(xiàng)塊在目錄項(xiàng)文件中的偏移地址,存放在隊(duì)列前一個(gè)目錄項(xiàng)塊的最末尾8個(gè)字節(jié)中,新增的目錄項(xiàng)加入到該新的目錄項(xiàng)塊中;II.如果global_depth小于最大所允許的有效位數(shù)的上限值i.將global_depth的值增一,并將新的global_depth值賦給目錄項(xiàng)塊blk的local_depth;ii.針對(duì)目錄項(xiàng)塊blk中的每一個(gè)目錄項(xiàng),做如下操作重新計(jì)算目錄項(xiàng)的hash值,取hash值的低local_depth位,記為cur_value,判斷cur_value是否與目錄項(xiàng)塊blk所對(duì)應(yīng)的索引結(jié)構(gòu)在hash表中序號(hào)相同,如果相同,則無(wú)需做任何處理,如果不同,則需要將該目錄項(xiàng)移到其他目錄項(xiàng)塊中,根據(jù)cur_value值,找到對(duì)應(yīng)的索引結(jié)構(gòu),此時(shí)將分兩種情況i)如果索引結(jié)構(gòu)中指定了對(duì)應(yīng)的目錄項(xiàng)塊在目錄項(xiàng)文件中的偏移地址,說(shuō)明目標(biāo)目錄項(xiàng)塊已經(jīng)存在,則直接將該目錄項(xiàng)從原目錄項(xiàng)塊中刪除,加入到目標(biāo)目錄項(xiàng)塊中,這樣對(duì)這個(gè)目錄項(xiàng)的處理完成;ii)如果索引結(jié)構(gòu)沒(méi)有指定對(duì)應(yīng)的目錄項(xiàng)塊在目錄項(xiàng)文件中的偏移地址,則說(shuō)明目標(biāo)目錄項(xiàng)塊不存在,這時(shí)從目錄項(xiàng)文件末尾分配一個(gè)目錄項(xiàng)塊,將目錄項(xiàng)塊在目錄項(xiàng)文件中的偏移地址記錄到索引結(jié)構(gòu)中,新增的目錄項(xiàng)塊的local_depth等于global_depth,然后將目錄項(xiàng)從原目錄項(xiàng)塊blk中移到新增的目錄項(xiàng)塊中。
3.根據(jù)權(quán)利要求1的組織和訪(fǎng)問(wèn)分布式文件系統(tǒng)目錄的方法,其特征在于,增加目錄項(xiàng)的方法,其步驟如下a)計(jì)算指定目錄項(xiàng)名字的Hash值;b)從索引文件中獲得此時(shí)該目錄的全局深度global_depth,將它存放到一個(gè)臨時(shí)變量tmp_depth中;c)取a)中計(jì)算的hash值的二進(jìn)制數(shù)的低tmp_depth位為當(dāng)前的有效位,記為eff_value;d)從索引文件中偏移為eff_value的位置取出相應(yīng)的索引結(jié)構(gòu);e)如果所取到的索引結(jié)構(gòu)為空,tmp_depth的值減一,回到c);否則,從索引結(jié)構(gòu)中獲得對(duì)應(yīng)目錄項(xiàng)塊在目錄項(xiàng)文件中的地址,取出目錄項(xiàng)塊blk;f)如果blk已滿(mǎn),則調(diào)用分裂函數(shù),進(jìn)行分裂操作,分裂結(jié)束后將tmp_depth的值增1,轉(zhuǎn)到c)處,如果blk未滿(mǎn),還有能夠容納該目錄項(xiàng)的空閑空間,則繼續(xù)往下執(zhí)行;g)如果當(dāng)前目錄項(xiàng)塊blk的局部深度local_depth等于全局深度global_depth,則將目錄項(xiàng)存放在blk中合適的位置,本函數(shù)結(jié)束;如果local_depth<global_depth,則對(duì)blk塊調(diào)用分裂函數(shù)進(jìn)行分裂操作。分裂結(jié)束后,將blk的local_depth設(shè)為global_depth,tmp_depth的值設(shè)為此時(shí)global_depth的值,轉(zhuǎn)到c)處執(zhí)行。
4.根據(jù)權(quán)利要求1的組織和訪(fǎng)問(wèn)分布式文件系統(tǒng)目錄的方法,其特征在于,目錄項(xiàng)查詢(xún)方法,其具體步驟如下a)計(jì)算指定文件名的Hash值;b)從索引文件中獲取要查找的文件系統(tǒng)對(duì)象所在目錄的全局深度global_depth,并將它記錄在tmp_depth中;c)取a)中計(jì)算的Hash值對(duì)應(yīng)的二進(jìn)制數(shù)的低tmp_depth位的值作為有效值,賦給eff_value;d)從索引文件中偏移為eff_value的位置處取出索引結(jié)構(gòu);h)如果索引結(jié)構(gòu)的內(nèi)容為空,則將tmp_depth的值減一,回到c);否則,從索引結(jié)構(gòu)中獲得對(duì)應(yīng)目錄項(xiàng)塊在目錄項(xiàng)文件中的地址,取出目錄項(xiàng)塊blk;e)從blk中搜索文件名等于指定名字的目錄項(xiàng),如果找到則返回找到的目錄項(xiàng),該函數(shù)結(jié)束;否則,如果目錄項(xiàng)塊blk的局部深度local_depth的值小于全局深度global_depth,說(shuō)明指定名字的目錄項(xiàng)在該目錄下不存在,該函數(shù)結(jié)束;如果目錄項(xiàng)塊blk的局部深度local_depth的值等于全局深度global_depth,并且global_depth已經(jīng)達(dá)到了上限,此時(shí),如果blk之后還有其它與blk具有相同的hash值構(gòu)成的鏈表,則依次搜索該鏈表上的所有目錄項(xiàng)塊,如果找到則返回目錄項(xiàng),搜索完畢,該函數(shù)結(jié)束。
5.根據(jù)權(quán)利要求1的組織和訪(fǎng)問(wèn)分布式文件系統(tǒng)目錄的方法,其特征在于,順序讀取目錄內(nèi)容的處理方法,其具體步驟如下a)如果某個(gè)訪(fǎng)問(wèn)過(guò)的目錄項(xiàng)塊的局部深度小于全局深度,則在此次順序讀取目錄內(nèi)容的操作中,不訪(fǎng)問(wèn)其分裂后生成的目錄項(xiàng)塊;b)為最后訪(fǎng)問(wèn)的目錄項(xiàng)塊定義一個(gè)二元組(orig_b,orig_depth),其中,orig_b表示最后一次訪(fǎng)問(wèn)該目錄項(xiàng)塊時(shí)的hash有效值,orig_depth表示最后一次訪(fǎng)問(wèn)該目錄項(xiàng)塊時(shí)的局部深度,如果最后一次只是訪(fǎng)問(wèn)目錄項(xiàng)塊的部分內(nèi)容而不是讀取整個(gè)塊,則需要將該二元組傳送給訪(fǎng)問(wèn)者;c)在索引結(jié)構(gòu)中增加一項(xiàng)off_within_bucket用于記錄分裂后生成的目錄項(xiàng)塊從被分裂的目錄項(xiàng)塊中移過(guò)來(lái)的最后一個(gè)目錄項(xiàng)所存放的位置;d)如果最后一次readdir操作只讀取了某個(gè)目錄項(xiàng)塊的部分內(nèi)容,當(dāng)后續(xù)的readdir操作讀取該目錄項(xiàng)塊的剩余部分內(nèi)容時(shí),需要對(duì)訪(fǎng)問(wèn)者提供的二元組進(jìn)行判斷如果orig_b等于當(dāng)前的目錄項(xiàng)塊的hash有效值,并且orig_depth也等于該目錄項(xiàng)塊的當(dāng)前局部深度,說(shuō)明該目錄項(xiàng)塊在兩次讀操作之間沒(méi)有被分裂,則直接讀取剩余內(nèi)容即可;如果orig_depth小于該目錄項(xiàng)塊的當(dāng)前局部深度,說(shuō)明在該readdir操作之前已經(jīng)進(jìn)行了分裂,則將所有本目錄項(xiàng)塊分裂后生成的目錄項(xiàng)塊中其索引結(jié)構(gòu)中的off_within_bucket指定位置之前的所有目錄項(xiàng)組成一個(gè)臨時(shí)的目錄項(xiàng)塊,將該臨時(shí)目錄項(xiàng)塊中本次readdir指定位置之后的目錄項(xiàng)傳送給訪(fǎng)問(wèn)者。
全文摘要
本發(fā)明涉及計(jì)算機(jī)存儲(chǔ)系統(tǒng)技術(shù)領(lǐng)域,特別是一種組織和訪(fǎng)問(wèn)分布式文件系統(tǒng)目錄的方法。該方法采用動(dòng)態(tài)可擴(kuò)展Hash技術(shù)來(lái)組織文件系統(tǒng)的目錄分別使用兩個(gè)本地文件系統(tǒng)中的文件存放索引結(jié)構(gòu)(Hash表)和目錄的內(nèi)容,Hash表可以動(dòng)態(tài)擴(kuò)展;本發(fā)明中的Hash表是多層次的,不同的目錄項(xiàng)塊可以對(duì)應(yīng)不同位數(shù)的Hash值有效位;為避免索引結(jié)構(gòu)的過(guò)于膨脹超出本地文件系統(tǒng)的限制,限定Hash值有效位的上限;針對(duì)順序讀取目錄內(nèi)容,提出了一個(gè)按目錄項(xiàng)有效位的寬度串行搜索方法,避免重復(fù)讀取或者漏讀某些目錄項(xiàng)。這種方法適用于任何利用本地文件系統(tǒng)存放元數(shù)據(jù)的分布式文件系統(tǒng)。
文檔編號(hào)G06F17/30GK1614591SQ20041000992
公開(kāi)日2005年5月11日 申請(qǐng)日期2004年12月2日 優(yōu)先權(quán)日2004年12月2日
發(fā)明者唐榮鋒, 孟丹, 吳思寧 申請(qǐng)人:中國(guó)科學(xué)院計(jì)算技術(shù)研究所
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1