本發(fā)明涉及非易失性主存存儲技術(shù)領(lǐng)域,特別涉及一種基于非易失性主存的高效事務(wù)文件系統(tǒng)構(gòu)建方法。
背景技術(shù):
新興的快速非易失性存儲器(non-volatilememory,nvm)技術(shù),如相變存儲器(phasechangememory,pcm)、自旋矩存儲器(spin-torquetransferram,stt-ram)、以及阻變存儲器(resistiveram,rram),具有非易失性、高訪問速度、字節(jié)尋址等特性。把這些非易失性存儲器連接到主存總線上將產(chǎn)生非易失性主存(non-volatilemainmemory,nvmm),并使得存儲設(shè)備能夠具有內(nèi)存級別的性能。
相關(guān)技術(shù)中的應(yīng)用程序(例如文本編輯器,傳統(tǒng)關(guān)系型數(shù)據(jù)庫,以及key-value存儲系統(tǒng)等)均需要保證他們的數(shù)據(jù)一致性。此外,這些應(yīng)用程序大多數(shù)都是在文件系統(tǒng)之上實現(xiàn)。因此,為了使得應(yīng)用程序能夠運行在高速的非易失性主存上,已有不少研究單位或機構(gòu)提出了基于非易失性主存的文件系統(tǒng)構(gòu)建方法。
然而,已有的非易失性主存文件系統(tǒng)僅僅提供保證文件系統(tǒng)自身元數(shù)據(jù)或者數(shù)據(jù)一致性的相關(guān)機制,而忽略了對上層應(yīng)用程序數(shù)據(jù)一致性的保障,即這些文件系統(tǒng)均不提供任何機制保證上層應(yīng)用程序的數(shù)據(jù)一致性。為此,大多數(shù)應(yīng)用程序需要設(shè)計并實現(xiàn)自己的一致性保證協(xié)議來防止數(shù)據(jù)丟失或者損壞。然而,威斯康辛大學(xué)麥迪遜分校已有研究表明,由于應(yīng)用程序無法感知下層文件系統(tǒng)的持久性特性,應(yīng)用程序?qū)訉崿F(xiàn)的一致性協(xié)議通常非常復(fù)雜并且容易出錯。例如,由cpu亂序?qū)憣?dǎo)致的亂序持久化操作或者非易失性文件系統(tǒng)中無法保證sector粒度的原子性更新將都會導(dǎo)致應(yīng)用程序在發(fā)生系統(tǒng)錯誤時仍然丟失或者損壞數(shù)據(jù)。此外,大部分應(yīng)用程序使用基于磁盤而優(yōu)化的日志機制來保證數(shù)據(jù)一致性,這些機制會進一步損害應(yīng)用程序運行在非易失性主存上時的性能,因為它們將產(chǎn)生過多的數(shù)據(jù)拷貝。
技術(shù)實現(xiàn)要素:
本發(fā)明旨在至少在一定程度上解決相關(guān)技術(shù)中的技術(shù)問題之一。
為此,本發(fā)明的目的在于提出一種基于非易失性主存的高效事務(wù)文件系統(tǒng)構(gòu)建方法, 該方法可以保證事務(wù)處理過程中的高效性和正確性。
為達到上述目的,本發(fā)明實施例提出了一種基于非易失性主存的高效事務(wù)文件系統(tǒng)構(gòu)建方法,包括以下步驟:文件系統(tǒng)給上層應(yīng)用程序提供相應(yīng)的文件操作事務(wù)接口,從而所述上層應(yīng)用程序利用所述事務(wù)接口執(zhí)行相關(guān)事務(wù),以保證應(yīng)用程序所需的一致性;在事務(wù)開始時,所述文件系統(tǒng)給事務(wù)分配事務(wù)id,以跟蹤和執(zhí)行應(yīng)用程序發(fā)出的事務(wù)操作,并保證事務(wù)操作的原子性和持久性;在事務(wù)執(zhí)行時,所述文件系統(tǒng)將日志區(qū)域分割成元數(shù)據(jù)日志區(qū)域和數(shù)據(jù)日志區(qū)域,并針對元數(shù)據(jù)更新和數(shù)據(jù)更新采用不同的日志處理方法;在事務(wù)提交時,所述文件系統(tǒng)強制將與事務(wù)相關(guān)的元數(shù)據(jù)內(nèi)容和與事務(wù)相關(guān)數(shù)據(jù)日志內(nèi)容持久化至非易失性主存,并寫入提交日志條目代表該事務(wù)已完成;已提交的數(shù)據(jù)日志內(nèi)容被周期性地寫回至所述文件系統(tǒng)中,數(shù)據(jù)日志內(nèi)容的寫回采用并發(fā)選擇寫回機制。
本發(fā)明實施例的基于非易失性主存的高效事務(wù)文件系統(tǒng)構(gòu)建方法,文件系統(tǒng)為上層應(yīng)用程序提供一系列基于文件操作的事務(wù)接口。應(yīng)用程序可以直接利用這些事務(wù)接口有選擇性地執(zhí)行相關(guān)事務(wù)以保證其所需的一致性,而無需單獨實現(xiàn)一套一致性保證機制,并且可以保證事務(wù)處理過程中的高效性和正確性。
另外,根據(jù)本發(fā)明上述實施例的基于非易失性主存的高效事務(wù)文件系統(tǒng)構(gòu)建方法還可以具有以下附加的技術(shù)特征:
進一步地,在本發(fā)明的一個實施例中,當(dāng)發(fā)生錯誤或者故障時,所述文件系統(tǒng)采用快速恢復(fù)機制進行系統(tǒng)故障恢復(fù)。
進一步地,在本發(fā)明的一個實施例中,對于元數(shù)據(jù)更新,所述文件系統(tǒng)使用字級別的回滾日志記錄方法來記錄元數(shù)據(jù)更新的日志,并且對于數(shù)據(jù)更新,所述文件系統(tǒng)使用cacheline粒度的重做日志記錄方法來記錄數(shù)據(jù)更新的日志。
進一步地,在本發(fā)明的一個實施例中,所述數(shù)據(jù)日志進一步分離日志頭部和日志數(shù)據(jù),其中,所述日志頭部包括日志元數(shù)據(jù),并存儲在非易失性主存的全局可見區(qū)域,而所述日志數(shù)據(jù)存放于待定塊中,所述待定塊的空間由所述文件系統(tǒng)動態(tài)分配,所述日志元數(shù)據(jù)中包含相應(yīng)指針指向與其對應(yīng)的待定塊。
進一步地,在本發(fā)明的一個實施例中,所述文件系統(tǒng)采用高效的兩級易失性索引來檢索數(shù)據(jù)日志區(qū)域內(nèi)已提交但未寫回的數(shù)據(jù),以有效地跟蹤數(shù)據(jù)日志區(qū)域的最新數(shù)據(jù)。
進一步地,在本發(fā)明的一個實施例中,所述兩級易失性索引完全位于dram中以提供高效的索引操作,其中,首先給定一個邏輯塊號和所述邏輯塊號內(nèi)的cacheline編號,索引將返回包含cacheline最新數(shù)據(jù)的物理塊號,并且所述索引將和同一個邏輯塊相關(guān)的待定塊通過事務(wù)提交順序組成待定鏈表。
進一步地,在本發(fā)明的一個實施例中,在每個待定塊中,所述文件系統(tǒng)使用cacheline 位圖來識別在事務(wù)執(zhí)行過程中所更新的cacheline。
進一步地,在本發(fā)明的一個實施例中,所述兩級易失性索引具體包括以下兩層索引:第一層索引,使用linux內(nèi)核中的基數(shù)樹(radixtree)結(jié)構(gòu)將每個文件中所有邏輯塊對應(yīng)的待定鏈表表頭組織成一個基數(shù)樹結(jié)構(gòu),以通過給定的邏輯塊號,索引出對應(yīng)該邏輯塊號的待定鏈表表頭;第二層索引,根據(jù)所述第一層索引得到的待定鏈表表頭,從鏈表頭部開始順序遍歷所述待定鏈表中的每個待定塊,直到在其中一個待定塊的cacheline位圖中,和所要查詢的cacheline編號對應(yīng)的位顯示為1時,退出并返回該待定塊的塊號,反之,相應(yīng)位在所述待定鏈表中所有待定塊的cacheline位圖中都顯示為0,則使用文件系統(tǒng)塊索引機制,返回和該查詢邏輯塊對應(yīng)的文件系統(tǒng)數(shù)據(jù)塊的塊號。
進一步地,在本發(fā)明的一個實施例中,所述并發(fā)選擇寫回機制將數(shù)據(jù)日志中屬于不同邏輯塊的已提交待定塊并發(fā)地寫回至所述文件系統(tǒng)中以提高寫回操作的并發(fā)性,而屬于同一邏輯塊的不同版本的已提交待定塊則在同一組中進行寫回處理以保證寫回操作的正確性,并且已提交待定塊的寫回操作采用選擇寫回算法以減少數(shù)據(jù)拷貝。
進一步地,在本發(fā)明的一個實施例中,所述選擇寫回算法為屬于同一組已提交的待定塊被寫回至一個挑選的塊中,所述挑選的塊從屬于該組的所有已提交待定塊和與該組相對應(yīng)的原始數(shù)據(jù)塊中選出,其中該塊含有的最新的cacheline數(shù)據(jù)在以上數(shù)據(jù)塊中最多。
本發(fā)明附加的方面和優(yōu)點將在下面的描述中部分給出,部分將從下面的描述中變得明顯,或通過本發(fā)明的實踐了解到。
附圖說明
本發(fā)明上述的和/或附加的方面和優(yōu)點從下面結(jié)合附圖對實施例的描述中將變得明顯和容易理解,其中:
圖1為根據(jù)本發(fā)明一個實施例的基于非易失性主存的高效事務(wù)文件系統(tǒng)構(gòu)建方法的流程圖;
圖2為根據(jù)本發(fā)明一個實施例的使用事務(wù)文件系統(tǒng)接口執(zhí)行事務(wù)的示例圖;
圖3為根據(jù)本發(fā)明一個實施例的事務(wù)文件系統(tǒng)的數(shù)據(jù)布局和事務(wù)數(shù)據(jù)結(jié)構(gòu)圖;
圖4為根據(jù)本發(fā)明一個實施例的日志條目結(jié)構(gòu)在事務(wù)執(zhí)行過程中的狀態(tài)轉(zhuǎn)換示意圖;
圖5為根據(jù)本發(fā)明一個實施例的文件系統(tǒng)塊在事務(wù)執(zhí)行過程中的狀態(tài)轉(zhuǎn)換示意圖;
圖6為根據(jù)本發(fā)明一個實施例的兩級易失性索引結(jié)構(gòu)示意圖;
圖7為根據(jù)本發(fā)明一個實施例的使用選擇寫回算法進行已提交待定塊的寫回操作的示意圖;以及
圖8為根據(jù)本發(fā)明一個實施例的日志條目的結(jié)構(gòu)體設(shè)計示意圖。
具體實施方式
下面詳細描述本發(fā)明的實施例,所述實施例的示例在附圖中示出,其中自始至終相同或類似的標(biāo)號表示相同或類似的元件或具有相同或類似功能的元件。下面通過參考附圖描述的實施例是示例性的,旨在用于解釋本發(fā)明,而不能理解為對本發(fā)明的限制。
下面參照附圖描述根據(jù)本發(fā)明實施例提出的基于非易失性主存的高效事務(wù)文件系統(tǒng)構(gòu)建方法。
圖1是本發(fā)明一個實施例的基于非易失性主存的高效事務(wù)文件系統(tǒng)構(gòu)建方法的流程圖。
如圖1所示,該基于非易失性主存的高效事務(wù)文件系統(tǒng)構(gòu)建方法包括以下步驟:
在步驟s101中,文件系統(tǒng)給上層應(yīng)用程序提供相應(yīng)的文件操作事務(wù)接口,從而上層應(yīng)用程序利用事務(wù)接口執(zhí)行相關(guān)事務(wù),以保證應(yīng)用程序所需的一致性。
舉例而言,本發(fā)明實施例的基于非易失性主存的高效事務(wù)文件系統(tǒng)可以為應(yīng)用程序提供如下四種事務(wù)訪問接口:1、tx_begin(txinfo);2、tx_add(txid,fd);3、tx_commit(txid);4、tx_abort(txid)。其中,tx_begin(txinfo)創(chuàng)建一個新的事務(wù),并把事務(wù)信息通過txinfo參數(shù)傳遞給文件系統(tǒng);tx_add(txid,fd)將一個指定的文件描述符fd關(guān)聯(lián)到與其相關(guān)的事務(wù)上,該事務(wù)編號為txid;tx_commit(txid)提交一個事務(wù),該事務(wù)編號為txid;tx_abort(txid)中止一個事務(wù),該事務(wù)編號為txid。因此,應(yīng)用程序可以通過使用以上四種事務(wù)接口來執(zhí)行事務(wù)操作,而不需要實現(xiàn)一套復(fù)雜的事務(wù)處理機制。
進一步地,為了保證一組文件操作的原子性,應(yīng)用程序需要在這組文件操作執(zhí)行之前使用tx_begin()接口來創(chuàng)建一個新的事務(wù),并且需要在這組文件操作執(zhí)行完之后,調(diào)用tx_commit()/tx_abort()接口來提交/中止這個事務(wù)。為了讓文件系統(tǒng)知道哪些操作屬于一個特定的事務(wù),應(yīng)用程序開發(fā)者需要將相應(yīng)的文件描述符關(guān)聯(lián)到相關(guān)的事務(wù)id上,并通過tx_begin()中的txinfo參數(shù)或者通過tx_add()接口將相應(yīng)的事務(wù)信息傳遞給文件系統(tǒng)。隨后,所有和這些關(guān)聯(lián)之后的文件描述符相關(guān)的文件操作均屬于這個事務(wù)。為了結(jié)束一個事務(wù),tx_commit()會將所有相關(guān)的更新持久化到非易失性主存上;相反,tx_abort()則會回滾所有已經(jīng)執(zhí)行的事務(wù)操作。需要注意的是,本發(fā)明中所述的事務(wù)文件系統(tǒng)所提供的接口并不會改變已有的文件i/o操作接口,從而極大地簡化了本發(fā)明中所述事務(wù)文件系統(tǒng)的接口的使用。
如圖2所示,圖2顯示了應(yīng)用程序如何使用以上事務(wù)接口執(zhí)行一個事務(wù)。該程序首先打開兩個文件,然后使用tx_begin()接口開始一個新的事務(wù);其中,tx_begin()中的參數(shù)info表明有兩個文件描述符(fd1和fd2)屬于該事務(wù);接著,該程序執(zhí)行兩個文 件寫操作,并通過tx_commit()接口來持久化這兩個寫操作;最后,tx_commit()保證這兩個寫操作要么全部成功持久化至非易失性主存,或者兩個都不成功,從而保證應(yīng)用程序所需的原子性特點。
在步驟s102中,在事務(wù)開始時,文件系統(tǒng)給事務(wù)分配事務(wù)id,以跟蹤和執(zhí)行應(yīng)用程序發(fā)出的事務(wù)操作,并保證事務(wù)操作的原子性和持久性。
在步驟s103中,在事務(wù)執(zhí)行時,文件系統(tǒng)將日志區(qū)域分割成元數(shù)據(jù)日志區(qū)域和數(shù)據(jù)日志區(qū)域,并針對元數(shù)據(jù)更新和數(shù)據(jù)更新采用不同的日志處理方法。
其中,在本發(fā)明的一個實施例中,數(shù)據(jù)日志進一步分離日志頭部和日志數(shù)據(jù),其中,日志頭部包括日志元數(shù)據(jù),并存儲在非易失性主存的全局可見區(qū)域,而日志數(shù)據(jù)存放于待定塊中,待定塊的空間由文件系統(tǒng)動態(tài)分配,日志元數(shù)據(jù)中包含相應(yīng)指針指向與其對應(yīng)的待定塊。
進一步地,在本發(fā)明的一個實施例中,對于元數(shù)據(jù)更新,文件系統(tǒng)使用字級別的回滾日志記錄方法來記錄元數(shù)據(jù)更新的日志,并且對于數(shù)據(jù)更新,文件系統(tǒng)使用cacheline粒度的重做日志記錄方法來記錄數(shù)據(jù)更新的日志。
具體地,如圖3所示,本發(fā)明實施例的事務(wù)文件系統(tǒng)的數(shù)據(jù)布局由三部分組成:文件系統(tǒng)超級塊、全局日志區(qū)域、以及動態(tài)分配的數(shù)據(jù)塊和待定塊區(qū)域。其中,全局日志區(qū)域進一步分為元數(shù)據(jù)日志區(qū)域和數(shù)據(jù)日志區(qū)域,全局日志區(qū)域的空間分配基于數(shù)據(jù)結(jié)構(gòu)(即日志條目),而數(shù)據(jù)塊和待定塊區(qū)域的空間分配是基于塊粒度。此外,為了避免高額的日志記錄和順序執(zhí)行開銷,所有用于空間分配的數(shù)據(jù)結(jié)構(gòu)均位于易失性內(nèi)存中。
其中,結(jié)合圖4與圖5所示,在事務(wù)執(zhí)行過程中,所有的日志數(shù)據(jù)直接寫入位于非易失性主存上的全局日志區(qū)域和待定塊中。為此,對于文件系統(tǒng)元數(shù)據(jù)更新,本發(fā)明實施例的事務(wù)文件系統(tǒng)會首先將該元數(shù)據(jù)的老版本寫入元數(shù)據(jù)日志區(qū)域,并在將新版本元數(shù)據(jù)原地更新到文件系統(tǒng)之前持久化這些相應(yīng)的元數(shù)據(jù)日志條目;相反,對于文件系統(tǒng)數(shù)據(jù)更新,事務(wù)文件系統(tǒng)則將新版本數(shù)據(jù)按照cacheline粒度的異地更新方式將其寫入新分配的待定塊中,而其相關(guān)聯(lián)的日志頭部則被記錄到全局可見的數(shù)據(jù)日志區(qū)域;日志頭部包含相應(yīng)的指針指向與其對應(yīng)的待定塊,從而使得待定塊能在故障恢復(fù)過程中被找到。這種分離日志頭部和日志數(shù)據(jù)的技術(shù)也同時使得本發(fā)明中所述的事務(wù)文件系統(tǒng)能夠支持執(zhí)行大事務(wù),因為事務(wù)更新的大小由文件系統(tǒng)的空閑空間決定,而并非由一個固定的日志區(qū)域大小所決定。
另外,為了使得文件系統(tǒng)能夠在故障恢復(fù)過程中識別出未完整寫入的日志條目, 本發(fā)明實施例的事務(wù)文件系統(tǒng)在日志條目中包含了一個有效字段,文件系統(tǒng)強制使得一個日志條目僅位于一個cacheline中,并且利用cpu緩存中同一個cacheline內(nèi)的寫入操作不會亂序的結(jié)構(gòu)保證來寫入一個日志條目。為此,在向全局日志區(qū)域?qū)懭胍粋€日志條目時,有效字段將會在最后被寫入,以保證其不會在日志條目中其它數(shù)據(jù)字段持久化至非易失性主存之前被持久化。當(dāng)釋放一個日志條目時,文件系統(tǒng)會利用處理器中8字節(jié)原子寫的特性來原子性地將該條目中的有效字段從1修改為0。
在步驟s104中,在事務(wù)提交時,文件系統(tǒng)強制將與事務(wù)相關(guān)的元數(shù)據(jù)內(nèi)容和與事務(wù)相關(guān)數(shù)據(jù)日志內(nèi)容持久化至非易失性主存,并寫入提交日志條目代表該事務(wù)已完成。
在步驟s105中,已提交的數(shù)據(jù)日志內(nèi)容被周期性地寫回至文件系統(tǒng)中,數(shù)據(jù)日志內(nèi)容的寫回采用并發(fā)選擇寫回機制。
另外,在本發(fā)明的一個實施例中,當(dāng)發(fā)生錯誤或者故障時,文件系統(tǒng)采用快速恢復(fù)機制進行系統(tǒng)故障恢復(fù)。
具體地,在本發(fā)明的一個實施例中,文件系統(tǒng)采用高效的兩級易失性索引來檢索數(shù)據(jù)日志區(qū)域內(nèi)已提交但未寫回的數(shù)據(jù),以有效地跟蹤數(shù)據(jù)日志區(qū)域的最新數(shù)據(jù)。
進一步地,在本發(fā)明的一個實施例中,如圖6所示,兩級易失性索引完全位于dram中以提供高效的索引操作,其中,首先給定一個邏輯塊號和邏輯塊號內(nèi)的cacheline編號,索引將返回包含cacheline最新數(shù)據(jù)的物理塊號,并且索引將和同一個邏輯塊相關(guān)的待定塊通過事務(wù)提交順序組成待定鏈表。
進一步地,在本發(fā)明的一個實施例中,在每個待定塊中,文件系統(tǒng)使用cacheline位圖來識別在事務(wù)執(zhí)行過程中所更新的cacheline。
也就是說,所述的兩級易失性索引完全位于dram中以提供高效的索引操作。給定要檢索的邏輯塊號和該邏輯塊號內(nèi)的cacheline編號,該索引將返回包含該cacheline最新數(shù)據(jù)的物理塊號。此外,該索引將和同一個邏輯塊相關(guān)的待定塊通過事務(wù)提交順序組成一個待定鏈表。在每個待定塊中,文件系統(tǒng)使用cacheline位圖來識別在事務(wù)執(zhí)行過程中所更新的cacheline。
進一步地,在本發(fā)明的一個實施例中,兩級易失性索引具體包括以下兩層索引:第一層索引,使用linux內(nèi)核中的基數(shù)樹(radixtree)結(jié)構(gòu)將每個文件中所有邏輯塊對應(yīng)的待定鏈表表頭組織成一個基數(shù)樹結(jié)構(gòu),以通過給定的邏輯塊號,索引出對應(yīng)該邏輯塊號的待定鏈表表頭;第二層索引,根據(jù)第一層索引得到的待定鏈表表頭,從鏈表頭部開始順序遍歷待定鏈表中的每個待定塊,直到在其中一個待定塊的cacheline位圖中,和所要查詢的cacheline編號對應(yīng)的位顯示為1時,退出并返回該待定塊的塊號,反之,相應(yīng)位在待定鏈表中所有待定塊的cacheline位圖中都顯示為0,則使用文件系 統(tǒng)塊索引機制,返回和該查詢邏輯塊對應(yīng)的文件系統(tǒng)數(shù)據(jù)塊的塊號。
進一步地,在本發(fā)明的一個實施例中,并發(fā)選擇寫回機制將數(shù)據(jù)日志中屬于不同邏輯塊的已提交待定塊并發(fā)地寫回至文件系統(tǒng)中以提高寫回操作的并發(fā)性,而屬于同一邏輯塊的不同版本的已提交待定塊則在同一組中進行寫回處理以保證寫回操作的正確性,并且已提交待定塊的寫回操作采用選擇寫回算法以減少數(shù)據(jù)拷貝。
進一步地,在本發(fā)明的一個實施例中,選擇寫回算法為屬于同一組已提交的待定塊被寫回至一個挑選的塊中,挑選的塊從屬于該組的所有已提交待定塊和與該組相對應(yīng)的原始數(shù)據(jù)塊中選出,其中,該塊含有的最新的cacheline數(shù)據(jù)在以上數(shù)據(jù)塊中最多。
具體地,在事務(wù)已提交之后,已提交的數(shù)據(jù)日志內(nèi)容將被周期性地寫回至文件系統(tǒng)中。在寫回過程中,文件系統(tǒng)需要保證寫回過程的正確性,即不能將老版本的數(shù)據(jù)覆蓋寫回到新版的數(shù)據(jù)上,否則將導(dǎo)致數(shù)據(jù)不一致。為了解決這個問題,相關(guān)技術(shù)中采用同步寫回機制或者使用順序異步寫回機制。然而,同步寫回機制使得寫回過程的延遲始終處于關(guān)鍵i/o路徑上;而順序異步寫回機制則不能充分開發(fā)非易失性主存的高并發(fā)特性,從而影響系統(tǒng)的擴展性。更重要的是,這兩類方法都使用固定寫回算法,增加了寫回過程中的拷貝開銷。為了提高寫回過程的效率,本發(fā)明實施例的并發(fā)選擇寫回機制將已提交的數(shù)據(jù)日志內(nèi)容周期性地寫回至文件系統(tǒng)中。
在本發(fā)明的實施例中,并發(fā)選擇寫回機制將數(shù)據(jù)日志中屬于不同邏輯塊的已提交待定塊并發(fā)地寫回至文件系統(tǒng)中以提高寫回操作的并發(fā)性,而屬于同一邏輯塊的不同版本的已提交待定塊則在同一組中進行寫回處理以保證寫回操作的正確性,并且該組已提交待定塊的寫回操作采用選擇寫回算法。
如上所述,兩級易失性索引已經(jīng)將屬于同一邏輯塊的所有已提交待定塊鏈接到了同一個待定鏈表中,并發(fā)選擇寫回機制將位于不同待定鏈表中的已提交待定塊的寫回操作使用多線程并發(fā)地執(zhí)行,而位于同一待定鏈表中的所有已提交待定塊組成一個組,并且該組待定塊的寫回操作采用選擇寫回算法以減少數(shù)據(jù)拷貝。
對于選擇寫回算法,屬于同一組已提交的待定塊被寫回至一個挑選的塊中,該塊從屬于該組的所有已提交待定塊和與該組相對應(yīng)的原始數(shù)據(jù)塊中選出,其中該塊含有的最新的cacheline數(shù)據(jù)在以上數(shù)據(jù)塊中最多。
具體而言,選擇寫回算法具體包括以下步驟:
s1,從屬于同一組的所有已提交待定塊和它們共同關(guān)聯(lián)的原始數(shù)據(jù)塊中選出一個包含有最新的cacheline數(shù)據(jù)最多的塊,該塊將替換原始數(shù)據(jù)塊成為新的文件系統(tǒng)數(shù)據(jù)塊;
s2,將位于該組中其它數(shù)據(jù)塊中(即非新選出的文件系統(tǒng)數(shù)據(jù)塊)的最新數(shù)據(jù)分別拷貝至上一步中新選出的文件系統(tǒng)數(shù)據(jù)塊中;
s3,如果第一步新選出的文件系統(tǒng)數(shù)據(jù)塊和原始數(shù)據(jù)塊不是同一個數(shù)據(jù)塊,則原子性地更新文件系統(tǒng)中的8字節(jié)大小的塊指針,將該指針從原來指向原始數(shù)據(jù)塊改變成為指向新選出的數(shù)據(jù)塊。
進一步地,如圖7所示,假設(shè)文件系統(tǒng)中每個數(shù)據(jù)塊包含6個cacheline,每個cacheline的大小為64字節(jié)。圖中
d1、d2、d3表示邏輯塊d的不同版本的待定塊,d0表示邏輯塊d對應(yīng)的文件系統(tǒng)原始數(shù)據(jù)塊。cij表示位于塊di中的第j個cacheline。加粗顯示的cacheline表示該cacheline中包含有最新的數(shù)據(jù)。在該例中,本發(fā)明提出的選擇寫回算法將具體包含以下步驟:1)從d0、d1、d2、d3選出一個包含有最新的cacheline數(shù)據(jù)最多的塊,根據(jù)示例可以看出,d3在該步驟中被選出;2)將d0、d1、d2中的包含有最新數(shù)據(jù)的cacheline拷貝至d3中,為此,c22、c13、c05將分別從d2、d1、d0中拷貝至d3;3)利用處理器中8字節(jié)原子寫的特性將指向d0的文件系統(tǒng)塊指針改為指向d3。在該例中,本發(fā)明實施例的選擇寫回算法在寫回過程中總共產(chǎn)生了3個cacheline大小的數(shù)據(jù)拷貝以及一個8字節(jié)的指針更改,因此,總共產(chǎn)生200字節(jié)的數(shù)據(jù)寫入。相比之下,傳統(tǒng)固定寫回算法需要把d1、d2、d3中的所有數(shù)據(jù)順序拷貝至d0,該過程將總共產(chǎn)生1152字節(jié)的數(shù)據(jù)寫入。因此,可以看出,本發(fā)明實施例的選擇寫回算法比傳統(tǒng)固定寫回算法減少了很多不必要的數(shù)據(jù)寫入,減少了寫回操作的開銷,從而提升了系統(tǒng)性能。
另外,快速恢復(fù)能幫助提升系統(tǒng)的可用性。當(dāng)系統(tǒng)發(fā)生錯誤或者故障時,本發(fā)明實施例的基于非易失性主存的高效事務(wù)文件系統(tǒng)采用一種快速恢復(fù)機制進行系統(tǒng)故障恢復(fù)。
當(dāng)系統(tǒng)發(fā)生故障重啟之后,位于全局日志區(qū)域的日志條目包含有以下三種狀態(tài):無效態(tài)(空閑態(tài))、未提交態(tài)(待定態(tài))、已提交態(tài);為了提供快速恢復(fù),本發(fā)明實施例的快速恢復(fù)機制僅回滾未提交的元數(shù)據(jù)日志,而延遲對已提交的數(shù)據(jù)日志的寫回操作;對于數(shù)據(jù)日志,該算法會為其重建必要的數(shù)據(jù)結(jié)構(gòu)。
具體地,快速恢復(fù)機制進一步包括以下步驟:
s1,掃描位于非易失性主存上的全局日志區(qū)域,通過日志條目結(jié)構(gòu)體中的類型字段識別出提交日志條目,并通過提交日志條目識別出所有已經(jīng)提交的事務(wù)id,并為其建立有效的索引。
s2,根據(jù)步驟s1建立的已提交事務(wù)id的索引,掃描數(shù)據(jù)日志區(qū)域,識別出所有已提交的數(shù)據(jù)日志條目,并釋放所有未提交的數(shù)據(jù)日志條目;然后,將所有已提交的日志條目根據(jù)txid使用排序算法進行排序;最后,所有已提交的數(shù)據(jù)日志根據(jù)排序的順序被依次加入已提交事務(wù)鏈表(如圖3)和相應(yīng)的二級易失性索引中。
可以理解為,根據(jù)步驟s1建立的已提交事務(wù)id的索引,掃描數(shù)據(jù)日志區(qū)域,為所有 已提交的數(shù)據(jù)日志條目恢復(fù)出相應(yīng)的二級易失性索引,并丟棄未提交的數(shù)據(jù)日志條目。
s3,根據(jù)步驟s1建立的已提交事務(wù)id的索引,掃描元數(shù)據(jù)日志區(qū)域,識別出所有未提交的元數(shù)據(jù)日志條目,并釋放所有已提交的元數(shù)據(jù)日志條目;將屬于同一元數(shù)據(jù)的所有不同版本的元數(shù)據(jù)日志條目按照元數(shù)據(jù)日志條目結(jié)構(gòu)體中的sequence_id字段進行排序,并將這些不同版本的元數(shù)據(jù)日志條目按照反序?qū)懟刂廖募到y(tǒng)中以回滾未提交的事務(wù)。
可以理解為,根據(jù)步驟s1建立的已提交事務(wù)id的索引,掃描元數(shù)據(jù)日志區(qū)域,按正確順序回滾未提交的元數(shù)據(jù)日志條目,并釋放已提交的元數(shù)據(jù)日志條目。
完成以上三個步驟之后,雖然有些已提交的日志數(shù)據(jù)未被寫回至文件系統(tǒng)中,這些未寫回的日志數(shù)據(jù)仍然可以使用所述的二級易失性索引進行檢索。此外,寫回操作也可以通過所述的二級易失性索引中的待定鏈表以及相應(yīng)的選擇寫回算法延遲地進行寫回。而且,所有未提交的元數(shù)據(jù)日志條目都已經(jīng)按照正確的順序進行了回滾操作;因此,此時數(shù)據(jù)都處于一致性的狀態(tài),保證了發(fā)生故障之后數(shù)據(jù)的一致性。
進一步地,如圖8所示,圖8為本發(fā)明中日志條目的結(jié)構(gòu)體設(shè)計圖。對于本發(fā)明實施例的元數(shù)據(jù)日志條目,其日志數(shù)據(jù)和日志頭部存放在一起。對于元數(shù)據(jù)日志條目結(jié)構(gòu)體中的每個字段含義如下所示:
1、type字段表示日志條目的類型。其中日志條目的類型包含三種:元數(shù)據(jù)日志條目、數(shù)據(jù)日志條目、提交日志條目;
2、txid字段表示事務(wù)的唯一編號;
3、addr字段表示和該日志條目對應(yīng)的文件系統(tǒng)數(shù)據(jù)區(qū)域的元數(shù)據(jù)的地址;
4、sequence_id字段表示同一個事務(wù)中元數(shù)據(jù)的更新順序;
5、size字段表示日志條目中日志數(shù)據(jù)的有效大??;
6、valid_flag字段表示該日志條目是否有效,如果為1則表示為有效日志條目,否則為0則表示為無效日志條目;
7、data數(shù)組用于存放該日志條目中的實際日志數(shù)據(jù)。
和元數(shù)據(jù)日志條目不同的是,數(shù)據(jù)日志條目分離日志頭部和日志數(shù)據(jù),即數(shù)據(jù)日志條目中僅僅包含日志頭部(也即日志元數(shù)據(jù));數(shù)據(jù)日志中實際的日志數(shù)據(jù)存放在由文件系統(tǒng)動態(tài)分配的待定塊中。對于數(shù)據(jù)日志條目結(jié)構(gòu)體中的每個字段含義如下所示:
1、type字段表示日志條目的類型。其中日志條目的類型包含三種:元數(shù)據(jù)日志條目、數(shù)據(jù)日志條目、提交日志條目;
2、txid字段表示事務(wù)的唯一編號;
3、ino字段表示該日志條目所關(guān)聯(lián)的文件inode結(jié)構(gòu)編號;
4、logic_block_no表示該日志條目所關(guān)聯(lián)的邏輯塊號;
5、pointer_addr表示指向邏輯塊號所對應(yīng)的數(shù)據(jù)塊的塊指針的存放地址;
6、bitmap表示cacheline位圖,用來標(biāo)識在事務(wù)執(zhí)行過程中在該邏輯塊中所更新的cacheline;
7、valid_flag字段表示該日志條目是否有效,如果為1則表示為有效日志條目,否則為0則表示為無效日志條目;
8、reserve數(shù)組不存儲有效數(shù)據(jù),但是可以保證數(shù)據(jù)日志條目結(jié)構(gòu)體的大小為一個cacheline大小(即64字節(jié)),從而使得一個日志條目僅位于一個cacheline中,而不會跨越兩個不同的cacheline。
根據(jù)本發(fā)明實施例的基于非易失性主存的高效事務(wù)文件系統(tǒng)構(gòu)建方法,文件系統(tǒng)為上層應(yīng)用程序提供一系列基于文件操作的事務(wù)接口。應(yīng)用程序可以直接利用這些事務(wù)接口有選擇性地執(zhí)行相關(guān)事務(wù)以保證其所需的一致性,而無需單獨實現(xiàn)一套一致性保證機制,并且可以保證事務(wù)處理過程中的高效性和正確性。
在本發(fā)明的描述中,需要理解的是,術(shù)語“中心”、“縱向”、“橫向”、“長度”、“寬度”、“厚度”、“上”、“下”、“前”、“后”、“左”、“右”、“豎直”、“水平”、“頂”、“底”“內(nèi)”、“外”、“順時針”、“逆時針”、“軸向”、“徑向”、“周向”等指示的方位或位置關(guān)系為基于附圖所示的方位或位置關(guān)系,僅是為了便于描述本發(fā)明和簡化描述,而不是指示或暗示所指的裝置或元件必須具有特定的方位、以特定的方位構(gòu)造和操作,因此不能理解為對本發(fā)明的限制。
此外,術(shù)語“第一”、“第二”僅用于描述目的,而不能理解為指示或暗示相對重要性或者隱含指明所指示的技術(shù)特征的數(shù)量。由此,限定有“第一”、“第二”的特征可以明示或者隱含地包括至少一個該特征。在本發(fā)明的描述中,“多個”的含義是至少兩個,例如兩個,三個等,除非另有明確具體的限定。
在本發(fā)明中,除非另有明確的規(guī)定和限定,術(shù)語“安裝”、“相連”、“連接”、“固定”等術(shù)語應(yīng)做廣義理解,例如,可以是固定連接,也可以是可拆卸連接,或成一體;可以是機械連接,也可以是電連接;可以是直接相連,也可以通過中間媒介間接相連,可以是兩個元件內(nèi)部的連通或兩個元件的相互作用關(guān)系,除非另有明確的限定。對于本領(lǐng)域的普通技術(shù)人員而言,可以根據(jù)具體情況理解上述術(shù)語在本發(fā)明中的具體含義。
在本發(fā)明中,除非另有明確的規(guī)定和限定,第一特征在第二特征“上”或“下”可以是第一和第二特征直接接觸,或第一和第二特征通過中間媒介間接接觸。而且,第一特征在第二特征“之上”、“上方”和“上面”可是第一特征在第二特征正上方或斜上方,或僅僅表示第一特征水平高度高于第二特征。第一特征在第二特征“之下”、“下方”和“下面”可以是第一特征在第二特征正下方或斜下方,或僅僅表示第一特征水平高度小于第二特征。
在本說明書的描述中,參考術(shù)語“一個實施例”、“一些實施例”、“示例”、“具體示例”、或“一些示例”等的描述意指結(jié)合該實施例或示例描述的具體特征、結(jié)構(gòu)、材料或者特點包含于本發(fā)明的至少一個實施例或示例中。在本說明書中,對上述術(shù)語的示意性表述不必須針對的是相同的實施例或示例。而且,描述的具體特征、結(jié)構(gòu)、材料或者特點可以在任一個或多個實施例或示例中以合適的方式結(jié)合。此外,在不相互矛盾的情況下,本領(lǐng)域的技術(shù)人員可以將本說明書中描述的不同實施例或示例以及不同實施例或示例的特征進行結(jié)合和組合。
盡管上面已經(jīng)示出和描述了本發(fā)明的實施例,可以理解的是,上述實施例是示例性的,不能理解為對本發(fā)明的限制,本領(lǐng)域的普通技術(shù)人員在本發(fā)明的范圍內(nèi)可以對上述實施例進行變化、修改、替換和變型。