两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

事務(wù)文件系統(tǒng)的制作方法

文檔序號(hào):6647153閱讀:174來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):事務(wù)文件系統(tǒng)的制作方法
技術(shù)領(lǐng)域
本發(fā)明一般針對(duì)計(jì)算機(jī)和文件系統(tǒng)。
背景技術(shù)
通常的文件系統(tǒng)提供操縱文件層次結(jié)構(gòu)的機(jī)制,包括建立新的文件或目錄,刪除或重命名文件或目錄,和對(duì)文件內(nèi)容的操作。某些文件系統(tǒng)提供有關(guān)單個(gè)低級(jí)操作(即原語(yǔ))的完整性的確定保證。例如,建立新文件的原語(yǔ)或者是成功地完成,或者該建立文件操作的任意部分作用被系統(tǒng)撤消。
然而,在用戶(hù)級(jí)的多穩(wěn)健系統(tǒng)的操作卻沒(méi)有與該文件系統(tǒng)有聯(lián)系。例如,對(duì)于一個(gè)文件系統(tǒng)現(xiàn)在沒(méi)有方法建立四個(gè)文件,刪除三個(gè)其他文件并改名另外的文件,但如果這些操作中的任一個(gè)失敗,就撤消任何其他操作。因此,要使用如應(yīng)用程序這樣的更高級(jí)(用戶(hù)級(jí))處理來(lái)管理這種多操作,即對(duì)該文件系統(tǒng)指定哪個(gè)動(dòng)作可應(yīng)用于哪個(gè)文件和/或目錄。
然而,此解決方法有其本身的缺陷??紤]一個(gè)例子,其中一個(gè)網(wǎng)站具有20個(gè)網(wǎng)頁(yè),以給予此網(wǎng)站一致的外觀(guān)及感覺(jué)的方法彼此鏈接。在更新該網(wǎng)站時(shí),系統(tǒng)失敗導(dǎo)致不一致的狀態(tài)。例如,執(zhí)行更新的應(yīng)用程序可以已刪除了某些文件但在失敗時(shí)未刪除來(lái)自其他文件指向這些文件的鏈接。一個(gè)觀(guān)看此網(wǎng)站的用戶(hù)將看到某些網(wǎng)頁(yè),而當(dāng)點(diǎn)擊與已刪除網(wǎng)頁(yè)的鏈接時(shí)會(huì)收到的錯(cuò)誤的消息。
為防止引起在不一致?tīng)顟B(tài)的可能性,在層次結(jié)構(gòu)中的任何文件被改變之前整個(gè)網(wǎng)頁(yè)的文件層次通常已經(jīng)進(jìn)行復(fù)制。在發(fā)生失敗時(shí),被保存的層次結(jié)構(gòu)復(fù)制回來(lái)。然而,文件的這種復(fù)制是慢的,而且相對(duì)笨拙,因?yàn)閺?fù)制程序需要事先知道系統(tǒng)哪個(gè)部分將要更新,且易于出錯(cuò),因?yàn)槿绻魏挝募皇韬龆磸?fù)制,它就不能再恢復(fù)。
如果文件在使用更高級(jí)的處理以更新文件時(shí)進(jìn)行適當(dāng)改變的話(huà),則任何在進(jìn)行中的改變?yōu)橛^(guān)看此網(wǎng)站的用戶(hù)可見(jiàn)。例如,對(duì)于上述的網(wǎng)站,在文件(和名字層次結(jié)構(gòu))由應(yīng)用程序改變時(shí),任何改變對(duì)該系統(tǒng)的現(xiàn)有用戶(hù)是可見(jiàn)的。因?yàn)樵谒懈淖兺瓿梢郧跋到y(tǒng)狀態(tài)通常是不一致的,因此,用戶(hù)可以看到此不一致性。例如,當(dāng)出現(xiàn)應(yīng)用程序已刪除一個(gè)網(wǎng)頁(yè)但尚未去除指向該頁(yè)的鏈接的情況時(shí),現(xiàn)有的用戶(hù)可以在網(wǎng)頁(yè)上看到一個(gè)鏈接(URL),點(diǎn)擊它并在已被刪除的網(wǎng)頁(yè)上結(jié)束。
除了網(wǎng)頁(yè)更新以外,其他程序在它們一致地保存信息方面的能力中也受到類(lèi)似的限制。例如,典型的文字處理應(yīng)用程序或電子表格應(yīng)用程序通過(guò)改名和刪除操作執(zhí)行所有保存,使用臨時(shí)文件以防止引起后續(xù)系統(tǒng)失敗的不一致?tīng)顟B(tài)。這種應(yīng)用程序也可以需要在不同數(shù)據(jù)源之間分配信息。例如,應(yīng)用程序可能希望在SQL Server中存儲(chǔ)表格數(shù)據(jù),在文件服務(wù)器和/或在因特網(wǎng)服務(wù)器中存儲(chǔ)文件,例如,這種文件可以包括文字處理文檔、演示圖表和/或網(wǎng)頁(yè)。但是,現(xiàn)在并不存在一種機(jī)制以協(xié)調(diào)一致、統(tǒng)一的方式支持這種信息的保存。例如,若在保存這種信息期間系統(tǒng)失敗,將保存某些信息,而其他則不保存,再次導(dǎo)致不一致?tīng)顟B(tài)。

發(fā)明內(nèi)容
簡(jiǎn)而言之,本發(fā)明提供一種系統(tǒng)和方法,通過(guò)本發(fā)明多文件系統(tǒng)操作能作為單個(gè)用戶(hù)級(jí)事務(wù)的部分執(zhí)行。本發(fā)明的事務(wù)文件系統(tǒng)使用戶(hù)能可選地控制在文件系統(tǒng)中事務(wù)的范圍(context)和.持續(xù)時(shí)間。
在文件打開(kāi)或建立期間,應(yīng)用程序規(guī)定文件打開(kāi)情況的操作是否應(yīng)作為事務(wù)的一部分處理。此外,系統(tǒng)有能力永久性地標(biāo)記只能被事務(wù)性地操作的文件,而應(yīng)用程序在打開(kāi)/建立的時(shí)間通過(guò)全局唯一的id(GUID)指定該事務(wù)。對(duì)于新文件建立,其父目錄被標(biāo)記為事務(wù)處理的,而應(yīng)用程序能將一個(gè)事務(wù)與線(xiàn)程/處理相關(guān)聯(lián),從而通過(guò)這種線(xiàn)程/處理的文件操作在指定的事務(wù)的范圍內(nèi)進(jìn)行事務(wù)處理。此外,應(yīng)用程序可選擇(如通過(guò)API)指令系統(tǒng)子線(xiàn)程/處理繼承事務(wù)的上下文關(guān)系,使應(yīng)用程序能利用事務(wù)而不必對(duì)應(yīng)用程序源代碼作任何明顯的修改。
一旦事務(wù)性地打開(kāi)文件,系統(tǒng)自動(dòng)地包括在文件處理上的如讀、寫(xiě)、刪除或改名操作,作為事務(wù)的一部分。因此,應(yīng)用程序能調(diào)用現(xiàn)有的文件系統(tǒng)API,繼續(xù)查看現(xiàn)有的每次操作的語(yǔ)義,還將操作作為事務(wù)的一部分包括起來(lái)。一個(gè)應(yīng)用程序能夠自由地想用多少事務(wù)就用多少,自由地與其他應(yīng)用程序共享一個(gè)事務(wù),具有同樣多的線(xiàn)程/處理共享一個(gè)事務(wù)等。對(duì)駐留在不同機(jī)器上的文件所做的文件打開(kāi)指定該事務(wù)。
本發(fā)明的其他方面針對(duì)記錄,使得能從失敗的事務(wù)恢復(fù)。在事務(wù)下,如果事務(wù)由于包括系統(tǒng)失敗和應(yīng)用程序失敗等任何原因而失敗,由系統(tǒng)作出的改變撤消,而且如果系統(tǒng)成功地提交代表該應(yīng)用程序的事務(wù),則由系統(tǒng)對(duì)該事務(wù)作出的改變保證能經(jīng)受得住系統(tǒng)失敗(如電源斷電)。這是借助多級(jí)記錄機(jī)制和另一個(gè)機(jī)制實(shí)現(xiàn)的,所述另一種機(jī)制對(duì)低級(jí)記錄操作是否被成功地提交進(jìn)行判定,從而確定較高級(jí)記錄操作是否實(shí)際上發(fā)生。
通過(guò)將操作事件分隔成一個(gè)日志,并且將事務(wù)的實(shí)際數(shù)據(jù)寫(xiě)入細(xì)節(jié)分隔到另一個(gè)中,來(lái)記錄數(shù)據(jù)的改變。一個(gè)機(jī)制寫(xiě)入一個(gè)簽名并隨后將其與已記錄的日志及數(shù)據(jù)一起比較以判定已記錄的日志是否與其相應(yīng)的數(shù)據(jù)頁(yè)同步,消除了將該日志以相對(duì)于數(shù)據(jù)的特定次序?qū)懭氡P(pán)中的要求。
本發(fā)明的另外方面包括在事務(wù)和其他文件系統(tǒng)操作之間提供名字空間和文件數(shù)據(jù)的隔離。名字空間隔離借助使用隔離目錄實(shí)現(xiàn),以跟蹤哪個(gè)名字屬于哪個(gè)事務(wù)。因此,對(duì)給定事務(wù)由系統(tǒng)作出的變化對(duì)其他事務(wù)不可見(jiàn),而且修改事務(wù)仍然有效,且只有在修蓋事務(wù)成功地提交后成為可見(jiàn)。事務(wù)未覺(jué)察的文件句柄在變化發(fā)生時(shí)看到所述改變。因此,在第一事務(wù)過(guò)程中刪除的文件將不再被該第一事務(wù)看到或沒(méi)有事務(wù)會(huì)看到,但在第一事務(wù)完成之前對(duì)其他事務(wù)仍然可見(jiàn)。
為實(shí)現(xiàn)這種名字空間隔離,建立隔離目錄,它們鏈接到原始NTFS目錄,并將適當(dāng)?shù)奈募旨拥皆摳綦x目錄以替代普通的NTFS父目錄。例如,對(duì)于刪除操作,被刪除文件的名字在文件從NTFS父目錄中除去的同時(shí)被加到該隔離目錄。在提交以前,隨后由不同的事務(wù)對(duì)此文件的訪(fǎng)問(wèn)使用隔離目錄來(lái)應(yīng)付,因此該文件被找到并認(rèn)為未被刪除。類(lèi)似地,如果一個(gè)事務(wù)建立一個(gè)文件,名字被加到NTFS目錄以及鏈接到父NTFS目錄的隔離目錄。建立該文件的事務(wù)能看到它,但對(duì)于其他事務(wù),該名字針對(duì)打開(kāi)此文件和列出父NTFS目錄的目的而被濾去。當(dāng)事務(wù)提交或中斷時(shí),隔離目錄項(xiàng)從該隔離目錄中被去除。
因此,本發(fā)明加入事務(wù)機(jī)制到文件系統(tǒng)中,使得應(yīng)用程序能容易執(zhí)行對(duì)一個(gè)或多個(gè)文件的多重事務(wù)操作,克服了與外事務(wù)機(jī)制相關(guān)的問(wèn)題。以這樣的方法,在文件系統(tǒng)中多個(gè)文件系統(tǒng)的操作以事務(wù)方式互相聯(lián)系,這樣,這些操作要么一起提交,要么就撤消任何部分的動(dòng)作。此外,一個(gè)事務(wù)的操作和數(shù)據(jù)改變與另一事務(wù)的操作和數(shù)據(jù)相隔離。
從下面結(jié)合附圖的詳細(xì)描述中,其它的優(yōu)點(diǎn)變得顯而易見(jiàn)。
附圖簡(jiǎn)述

圖1是方框圖,表示可以加入本發(fā)明的一個(gè)計(jì)算機(jī)系統(tǒng);圖2是方框圖,表示按本發(fā)明的一個(gè)方面實(shí)現(xiàn)事務(wù)文件系統(tǒng)的通用結(jié)構(gòu);圖3是方框圖,表示按本發(fā)明的一個(gè)方面建立/打開(kāi)一個(gè)事務(wù)文件的請(qǐng)求;圖4是方框圖,表示按本發(fā)明的一個(gè)方面在一個(gè)打開(kāi)事務(wù)文件上執(zhí)行一個(gè)文件系統(tǒng)操作的請(qǐng)求。
圖5是方框圖,表示按本發(fā)明的一個(gè)方面在一個(gè)時(shí)間周期上事務(wù)文件的隔離;圖6是方框圖,表示按本發(fā)明的一個(gè)方面跟蹤文件版本的數(shù)據(jù)結(jié)構(gòu);圖7是方框圖,表示按本發(fā)明的一個(gè)方面隨時(shí)間維持多個(gè)文件版本;圖8是方框圖,表示為寫(xiě)入而事務(wù)性打開(kāi)的文件的數(shù)據(jù)頁(yè);圖9-10是方框圖,表示按本發(fā)明的一個(gè)方面用于支持為在事務(wù)中讀和寫(xiě)而打開(kāi)的文件的隔離的數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系;圖11是方框圖,表示按本發(fā)明的一個(gè)方面的兩級(jí)記錄機(jī)制和驗(yàn)證這些日志是否同步的機(jī)制;圖12是方框圖,表示按本發(fā)明的一個(gè)方面所記錄的頁(yè)數(shù)據(jù)和驗(yàn)證該頁(yè)數(shù)據(jù)是否與日志同步的機(jī)制;圖13是流程圖,表示按本發(fā)明的一個(gè)方面根據(jù)頁(yè)數(shù)據(jù)是否與所記錄的日志同步而采取的動(dòng)作;圖14是方框圖,表示按本發(fā)明的一個(gè)方面在另外的版本方案中隨時(shí)間維持多個(gè)文件版本;圖15是方框圖,表示按本發(fā)明的一個(gè)方面在網(wǎng)絡(luò)上的事務(wù)文件系統(tǒng)操作;圖16-18是方框圖,表示按本發(fā)明的一個(gè)方面的層次文件結(jié)構(gòu)和使用隔離目錄提供名字空間隔離;圖19-22是流程圖,表示按本發(fā)明的一個(gè)方面為提供名字空間隔離而使用隔離目錄的一般規(guī)則;和圖23是方塊圖,表示按本發(fā)明的一個(gè)方面存儲(chǔ)器映射段的浮動(dòng)。
具體實(shí)施例方式
圖1和下面討論試圖提供可應(yīng)用本發(fā)明的適合的計(jì)算環(huán)境的簡(jiǎn)明描述。雖然并非必要,但本發(fā)明以計(jì)算機(jī)可執(zhí)行指令的一般上下文范圍中描述,如由個(gè)人計(jì)算機(jī)執(zhí)行的程序模塊。通常,程序模塊包括例行程序、程序、對(duì)象、組件、數(shù)據(jù)結(jié)構(gòu)等,它們執(zhí)行特定的任務(wù)或?qū)崿F(xiàn)特定的抽象數(shù)據(jù)類(lèi)型。
此外,本領(lǐng)域熟練人員知道,本發(fā)明可以應(yīng)用其他計(jì)算機(jī)系統(tǒng)配置來(lái)實(shí)現(xiàn),包括手持式裝置、多處理器系統(tǒng)、基于微處理器或可編程消費(fèi)者電子設(shè)備、網(wǎng)絡(luò)PC、小型計(jì)算機(jī)、大型主機(jī)等。本發(fā)明也能在分布式計(jì)算環(huán)境中實(shí)現(xiàn),其中任務(wù)由通過(guò)通信網(wǎng)落鏈接的遠(yuǎn)程處理設(shè)備執(zhí)行。在分布式計(jì)算機(jī)環(huán)境中,程序模塊可以放置在本地或遠(yuǎn)程的存儲(chǔ)器儲(chǔ)存設(shè)備中,參考圖1,實(shí)現(xiàn)本發(fā)明的一個(gè)示例性系統(tǒng)包括以傳統(tǒng)的個(gè)人計(jì)算機(jī)20或類(lèi)似形式的通用計(jì)算設(shè)備,它包括處理單元21、系統(tǒng)存儲(chǔ)器22和耦合包括系統(tǒng)存儲(chǔ)器的各種系統(tǒng)部件到處理單元21的系統(tǒng)總線(xiàn)23。系統(tǒng)總線(xiàn)23可以是若干類(lèi)型總線(xiàn)結(jié)構(gòu)的任一種,包括存儲(chǔ)器總線(xiàn)或存儲(chǔ)器控制器、外圍總線(xiàn)和使用各種總線(xiàn)結(jié)構(gòu)的任一種的局部總線(xiàn)。系統(tǒng)存儲(chǔ)器包括只讀存儲(chǔ)器(ROM)24和隨機(jī)存取存儲(chǔ)器(RAM)25。在ROM 24中存儲(chǔ)基本輸入/輸出系統(tǒng)26(BIOS),它包括基本的例行程序,以幫助如在起動(dòng)過(guò)程中在個(gè)人計(jì)算機(jī)20中各單元之間傳遞信息。個(gè)人計(jì)算機(jī)20還可以包括硬盤(pán)驅(qū)動(dòng)器27,用于向硬盤(pán)(未示出)讀和寫(xiě);磁盤(pán)驅(qū)動(dòng)器28,用于可向可移動(dòng)磁盤(pán)29的讀和寫(xiě);和光盤(pán)驅(qū)動(dòng)器30用于向如CD-ROM或其他光媒體之類(lèi)的可移動(dòng)光盤(pán)31的讀和寫(xiě)。硬盤(pán)驅(qū)動(dòng)器27、磁盤(pán)驅(qū)動(dòng)器28和光盤(pán)驅(qū)動(dòng)器30分別通過(guò)硬盤(pán)驅(qū)動(dòng)器接口32,磁盤(pán)驅(qū)動(dòng)器接口33和光驅(qū)動(dòng)器接口34連接到系統(tǒng)總線(xiàn)23。這些驅(qū)動(dòng)器和與其相關(guān)的計(jì)算機(jī)可讀媒體提供計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊和用于個(gè)人計(jì)算機(jī)20的其他數(shù)據(jù)的非易失性存儲(chǔ)。雖然這里描述的示例性環(huán)境使用了硬盤(pán)、可移動(dòng)磁盤(pán)29和可移動(dòng)光盤(pán)31,本專(zhuān)業(yè)中熟悉人員應(yīng)理解,能儲(chǔ)存由計(jì)算機(jī)可訪(fǎng)問(wèn)的數(shù)據(jù)的其他類(lèi)型計(jì)算機(jī)可讀媒體在示例性操作環(huán)境中也能使用,如盒式磁帶、閃存卡、數(shù)字視頻盤(pán)、Bernoulli盒式盤(pán)帶,隨機(jī)存儲(chǔ)器(RAM),只讀存儲(chǔ)器(ROM)等。
包括操作系統(tǒng)35(最好是微軟公司的Windows2000,以前的WindowsNT)在內(nèi)的許多程序模塊能存入硬盤(pán)、磁盤(pán)29、光盤(pán)31、ROM24或RAM25。計(jì)算機(jī)20包括與操作系統(tǒng)35相關(guān)或包括在其中的文件系統(tǒng)36,如Windows NT文件系統(tǒng)(NTFS)、一個(gè)或多個(gè)應(yīng)用程序37、其他程序模塊38和程序數(shù)據(jù)39。用戶(hù)能通過(guò)如鍵盤(pán)40和指示設(shè)備42之類(lèi)的輸入設(shè)備將命令和信息輸入到個(gè)人計(jì)算機(jī)20中。其他輸入設(shè)備(未示出)可以包括麥克風(fēng)、游戲桿、游戲板、衛(wèi)星碟(satellite disk)、掃描器等。這些及其他輸入設(shè)備通常通過(guò)耦合到系統(tǒng)總線(xiàn)的串口接46連接到處理單元21,但也能通過(guò)如并行端口、游戲端口或通用串口總線(xiàn)(USB)之類(lèi)的其他接口連接。監(jiān)視器47或其他類(lèi)型的顯示設(shè)備也能通過(guò)如視頻適配器48這種接口連接到系統(tǒng)總線(xiàn)23。除了監(jiān)視器47外,個(gè)人計(jì)算機(jī)通常包括其他外圍輸出設(shè)備(未示出),如揚(yáng)聲器和打印機(jī)。
個(gè)人計(jì)算機(jī)20可使用與如遠(yuǎn)程計(jì)算機(jī)49之類(lèi)的一個(gè)或多個(gè)遠(yuǎn)程計(jì)算機(jī)的邏輯連接在網(wǎng)絡(luò)環(huán)境中運(yùn)行。遠(yuǎn)程計(jì)算機(jī)49可以是另一個(gè)人計(jì)算機(jī)、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對(duì)等設(shè)備或其他常用的網(wǎng)絡(luò)節(jié)點(diǎn),而且雖然在圖1中只示出存儲(chǔ)器存儲(chǔ)設(shè)備50,但通常包括許多或所有上述與個(gè)人計(jì)算機(jī)20相關(guān)的單元。在圖1畫(huà)出的邏輯連接包括局域網(wǎng)(LAN)51和廣域網(wǎng)(WAN)52。這種網(wǎng)絡(luò)環(huán)境在辦公室、企業(yè)范圍計(jì)算機(jī)網(wǎng)絡(luò)、企業(yè)網(wǎng)和因特網(wǎng)中是常見(jiàn)的。
當(dāng)在LAN網(wǎng)絡(luò)環(huán)境中使用時(shí),個(gè)人計(jì)算機(jī)20通過(guò)網(wǎng)絡(luò)接口或適配器53連到局域網(wǎng)51。當(dāng)在WAN網(wǎng)絡(luò)環(huán)境使用時(shí),個(gè)人計(jì)算機(jī)20通常包括調(diào)制解調(diào)器54或其他用于在如因特網(wǎng)之類(lèi)的廣域網(wǎng)52上建立通信的裝置。調(diào)制解調(diào)器54(可以是內(nèi)制或外制式的)通過(guò)串口接口46連接到系統(tǒng)總線(xiàn)23。在網(wǎng)絡(luò)環(huán)境中,相對(duì)于個(gè)人計(jì)算機(jī)20所描述的程序模塊或其一部分可以?xún)?chǔ)存在遠(yuǎn)程存儲(chǔ)器存儲(chǔ)設(shè)備中。應(yīng)該明白,示出的網(wǎng)絡(luò)連接是示例性的,可以使用在計(jì)算機(jī)之間建立通信鏈路的其他方法。
雖然本發(fā)明是相對(duì)于Windows2000操作系統(tǒng)和微軟的Windows NT文件系統(tǒng)(NTFS)描述,本專(zhuān)業(yè)熟悉人員明白,也能使用其他操作系統(tǒng)和/或文件系統(tǒng),并從本發(fā)明中得益。
事務(wù)文件系統(tǒng)的通用結(jié)構(gòu)通常,這里使用的術(shù)語(yǔ)“事務(wù)”、“事務(wù)的”等被認(rèn)為是具有某些共同屬性的操作,在本發(fā)明中是應(yīng)用于多重文件系統(tǒng)的操作。事務(wù)屬性常稱(chēng)之為“ACID”屬性,代表著原子性、一致性、隔離性和持續(xù)性。如在下面所理解,本發(fā)明實(shí)現(xiàn)了與文件系統(tǒng)相關(guān)的這些屬性,為應(yīng)用程序和一般計(jì)算提供許多益處。
如在圖2中通常所示,從應(yīng)用程序60等所發(fā)出的給如微軟Windows NT文件系統(tǒng)(NTFS)36(圖1)這種事務(wù)啟用文件系統(tǒng)62(如這里相對(duì)于本發(fā)明敘述)的文件系統(tǒng)請(qǐng)求58,經(jīng)過(guò)分派機(jī)制66達(dá)到NTFS部件64。對(duì)于傳統(tǒng)的文件系統(tǒng)已經(jīng)知道,為了產(chǎn)生例如可以導(dǎo)致由I/O管理器發(fā)送到文件系統(tǒng)的I/O請(qǐng)求包(IRP)的這些請(qǐng)求,應(yīng)用程序60可以作出應(yīng)用程序接口(API)調(diào)用。按本發(fā)明并如下所述,文件系統(tǒng)請(qǐng)求58的某些與事務(wù)相關(guān),而其他則不是。
在沒(méi)有事務(wù)情況,文件系統(tǒng)請(qǐng)求58被分派并直接由NTFS部件64處理,實(shí)際上用本發(fā)明以前的方法。類(lèi)似地,由事務(wù)發(fā)出的或指向如下述被打開(kāi)事務(wù)修改過(guò)的文件或目錄的請(qǐng)求58也繼續(xù)正常分派到NTFS部件64,或從NTFS部件分派。但是,這種事務(wù)請(qǐng)求導(dǎo)致在其他正常處理期間的策略點(diǎn)處調(diào)出(調(diào)回)到如在文件系統(tǒng)62內(nèi)部實(shí)現(xiàn)的TxF部件70。
如圖2所示并如下所述,TxF部件70包括到外部事務(wù)服務(wù)72和記錄服務(wù)74的接口,并與NTFS部件64一起工作處理事務(wù)請(qǐng)求。外部事務(wù)服務(wù)72可以包括微軟公司的分布式事務(wù)協(xié)調(diào)程序(MS DTC,或簡(jiǎn)稱(chēng)為MTC或DTC),其中一個(gè)客戶(hù)(如應(yīng)用程序60)調(diào)用啟用一個(gè)事務(wù),隨后的調(diào)用提交或中斷該操作。DTC有文檔已很好描述,在這里只作簡(jiǎn)單說(shuō)明而不作詳細(xì)描述,且說(shuō)明范圍只限于與TxF 70相關(guān)的部分。
通常如圖3所示,在MS DTC中,經(jīng)過(guò)COM/DLE如應(yīng)用程序60這樣的應(yīng)用程序借助調(diào)用事務(wù)協(xié)調(diào)程序76(圖3)的方法(即BeginTransaction方法)啟用事務(wù)。事務(wù)協(xié)調(diào)程序76可以是網(wǎng)絡(luò)中的事務(wù)服務(wù)器或其本地的代理。此調(diào)用建立了代表事務(wù)的事務(wù)對(duì)象/范圍78。然后應(yīng)用程序60調(diào)用一個(gè)或多個(gè)資源管理器做事務(wù)工作。在本發(fā)明中,TxF部件70作為了用于事務(wù)文件系統(tǒng)操作的資源管理器。在圖3所示及下面描述中,對(duì)文件系統(tǒng)62的API調(diào)用(如CreateFileEx 80和其他文件系統(tǒng)操作)產(chǎn)生調(diào)出到TxF部件70。
應(yīng)用程序?qū)ξ募到y(tǒng)62的第一次調(diào)用是對(duì)文件、目錄或具有與其相關(guān)的事務(wù)范圍78的應(yīng)用程序的當(dāng)前的線(xiàn)程/過(guò)程的識(shí)別。如果事務(wù)范圍是相關(guān)的,文件系統(tǒng)62調(diào)出到TxF 70。當(dāng)TxF 70首次代表事務(wù)執(zhí)行工作時(shí),它通過(guò)調(diào)用事務(wù)協(xié)調(diào)程序76列入該事務(wù),然后通知事務(wù)協(xié)調(diào)程序76該TxF 70是在此事務(wù)中用到的資源管理器。注意,其他資源管理器84(如數(shù)據(jù)庫(kù)部件的資源管理器)也能類(lèi)似地列入此事務(wù),因而數(shù)據(jù)庫(kù)的操作和文件系統(tǒng)的操作能在同一事務(wù)中一起提交(或中斷)。
為了判斷什么時(shí)候TxF 70需要列入事務(wù),如圖3所示使用與ITransaction對(duì)象78一起進(jìn)入的事務(wù)標(biāo)識(shí)符(ID),TxF部件70的事務(wù)管理器82層將ID與事務(wù)ID的事務(wù)表86中保持的已知列入的事務(wù)進(jìn)行校驗(yàn)。如果已經(jīng)列入,事務(wù)ID和事務(wù)參照被記錄在I/O請(qǐng)求包(IRP)中,而IRP繼續(xù)。IRP在NTFS中的使用有文檔已很好描述,為簡(jiǎn)單起見(jiàn)在后面不再描述。但是,如果該事務(wù)未被列入表86中,TxF通知事務(wù)協(xié)調(diào)程序76TxF 70是需要與此事務(wù)關(guān)聯(lián)的資源管理器,并將該事務(wù)標(biāo)識(shí)符存入獲得的事務(wù)表86中。
更具體說(shuō)來(lái),當(dāng)事務(wù)是未列入表86的新事務(wù)時(shí),需要用事務(wù)協(xié)調(diào)程序76列入。為此,TxF管理器82采用代88使用OLE事務(wù)或其他協(xié)議與事務(wù)協(xié)調(diào)程序76通信。適合本發(fā)明使用的替代協(xié)議等包括(X/OPEN的)XA,TIP(事務(wù)因特網(wǎng)協(xié)議)和/或在操作系統(tǒng)中的內(nèi)在事務(wù)控制。Create FileEX 80請(qǐng)求將ITransaction對(duì)象78(如通過(guò)DTC ItransactionTransmitter方法)安排到統(tǒng)一的字節(jié)集合。如果需要列入,這些字節(jié)發(fā)送到代理器88,它轉(zhuǎn)而調(diào)用DTC ItransactionReveiver方法取回列入需要的ITransaction對(duì)象78。代理88保持DTC對(duì)象的ITransactionResourceAsync和ITransactionEnlistmentAsync。ITransactionResourceAsync應(yīng)用TxF回調(diào)例行程序,使得事務(wù)協(xié)調(diào)程序76調(diào)用驅(qū)動(dòng)二階段提交,并具有列入調(diào)用。ItransactionEnlistmentAsyc通過(guò)IResourceManage∷enlist()返回,并包含TxF 70調(diào)用確認(rèn)二階段提交控制的方法。代理88作為在ItransactionResourceAsync和ItransactionEnlistmentAsync及基于文件系統(tǒng)控制(FSCTL)遠(yuǎn)程程序調(diào)用(RPC)的方法之間的中介,而RPC用于在TxF部件82和代理88之間的通信。
注意,具有以與DTC協(xié)調(diào)程序過(guò)程同樣的過(guò)程運(yùn)行的TxF調(diào)協(xié)程序代理是可行的,且將事務(wù)管理器移到核心程序中以消除過(guò)程切換額外開(kāi)銷(xiāo)也是可行的。DTC代理的占位程序(Stub)也能移到核心程序中使得在建立用戶(hù)模式代理中不需要TxF工作,同時(shí)也消除了從TxF代理到事務(wù)管理器的切換。TxF代理能以與DTC協(xié)調(diào)程序同樣的過(guò)程運(yùn)行,后者需要由TxF代理工作,但是其具有與以前解決方案相同數(shù)目的過(guò)程切換。
列入以后,當(dāng)事務(wù)進(jìn)行時(shí),事務(wù)協(xié)調(diào)程序76保持對(duì)包括列入在事務(wù)中的TxF 70的每個(gè)資源管理器(和可能其他資源管理器84,如其他的TxF或數(shù)據(jù)庫(kù)資源管理器)的跟蹤。注意,這就使得其他信息(如數(shù)據(jù)庫(kù)信息)作為還提交文件系統(tǒng)信息的事務(wù)的一部分被提交,而且使得多重事務(wù)啟用文件系統(tǒng)的文件(如在遠(yuǎn)程機(jī)器上)作為同一事務(wù)的一部分被提交。
通常,應(yīng)用程序60借助調(diào)用(通過(guò)COM)事務(wù)協(xié)調(diào)程序76的提交事務(wù)方法來(lái)完成該事務(wù)以提交該事務(wù)。事務(wù)協(xié)調(diào)程序76隨后通過(guò)二階段提交協(xié)議使每個(gè)列入的資源管理器得以提交。二階段提交協(xié)議保證所有資源提交該事務(wù),或均中斷該事務(wù)。在第一階段,事務(wù)協(xié)調(diào)程序76詢(xún)問(wèn)包括TxF部件70的每個(gè)資源管理器,是否準(zhǔn)備提交。如果這些資源管理器肯定地響應(yīng),則在第二階段,事務(wù)協(xié)調(diào)程序76向它們廣播一個(gè)提交消息。如果任何一個(gè)資源服務(wù)器否定地響應(yīng),或未能響應(yīng)此準(zhǔn)備請(qǐng)求,和/或事務(wù)任何部分失敗,則事務(wù)協(xié)調(diào)程序76通知資源管理器,事務(wù)中斷。而且,如果應(yīng)用程序不能完成,應(yīng)用程序60調(diào)用中斷事務(wù)方法。如果應(yīng)用程序失敗,事務(wù)協(xié)調(diào)程序76代表應(yīng)用程序中斷該事務(wù)。如下所述,包括TxF 70的各種資源管理器就撤消任何部分動(dòng)作。
因此,TxF部件70就作為在標(biāo)準(zhǔn)事務(wù)服務(wù)(如DTC)的范圍中的資源管理器,因而真正的用戶(hù)定義的事務(wù)支撐擴(kuò)展到文件系統(tǒng)。注意,如下所述,NTFS允許TxF將瞬態(tài)的每個(gè)文件和每個(gè)流的事務(wù)狀態(tài)鏈接到正常的NTFS結(jié)構(gòu)。
按照本發(fā)明的一個(gè)方面,應(yīng)用程序60可選擇包括在一個(gè)事務(wù)中的文件系統(tǒng)操作。這可對(duì)每個(gè)文件實(shí)現(xiàn),使得每個(gè)文件標(biāo)記為經(jīng)事務(wù)處理的,且這種的操作按事務(wù)方式完成,或者對(duì)每個(gè)線(xiàn)程/過(guò)程實(shí)現(xiàn),其中線(xiàn)程/過(guò)程標(biāo)記為經(jīng)事務(wù)處理的,而由該線(xiàn)程/過(guò)程所作的操作按事務(wù)方式完成。
為了在一個(gè)事務(wù)中包括在一個(gè)文件,定義一個(gè)事務(wù)處理模式標(biāo)志(即位),它能與CreateFileEx應(yīng)用程序編程接口(API)調(diào)用(下面描述)、CreateFile WIN32 API變化的一起使用。當(dāng)設(shè)置標(biāo)志時(shí),本發(fā)明的系統(tǒng)自動(dòng)將此文件包括在事務(wù)的范圍中。為此,如在圖3中表示,當(dāng)通過(guò)I/O請(qǐng)求包(IRP),一個(gè)建立請(qǐng)求80進(jìn)入文件系統(tǒng)(NTFS)62時(shí),現(xiàn)有的事務(wù)范圍78可以通過(guò)將一指針轉(zhuǎn)到該范圍78而附加到該請(qǐng)求上,從而該文件能作為現(xiàn)有事務(wù)范圍78的一部分被建立/打開(kāi)?;蛘?,如果在CreateFileEx API調(diào)用中指向Itransaction指針的指針是空,就如在MicrosoftTransaction Server(MTS)/Component Object Model(com)模型中那樣,該范圍被自動(dòng)地挑選出到該線(xiàn)程之外。響應(yīng)成功地建立/打開(kāi)請(qǐng)求80而返回的文件句柄90包括到該事務(wù)范圍78的指針。然后,用那個(gè)句柄90作出的調(diào)用通過(guò)此指針識(shí)別為具有與其關(guān)聯(lián)的事務(wù)范圍,由此識(shí)別出相關(guān)的事務(wù),而且使用該句柄的文件系統(tǒng)操作代表該事務(wù)被執(zhí)行,直到該事務(wù)結(jié)束。
CreateFileEx API是現(xiàn)有的CreateFile Win32 API的適當(dāng)擴(kuò)展集,并加上″dwAdditionalFlags″DWORD參數(shù)以取得標(biāo)志″FILE_FLAG_TRANSACTED″來(lái)設(shè)置該事務(wù)的模式。還定義的是指向事務(wù)范圍的對(duì)象(LPUNKNOWNpunkTrasction)的參數(shù),如上所述,如果參數(shù)為空,該對(duì)象就從當(dāng)前的MTS/COM范圍中挑出。
為了標(biāo)記一個(gè)線(xiàn)程/過(guò)程為經(jīng)事務(wù)處理的,提供SetTransactedFiles API,它有效地處理一組CreateFile/CreateFileEx調(diào)用,好象它們對(duì)經(jīng)事務(wù)處理模式標(biāo)志設(shè)定。如果特定的CreateFileEx指定非空ITransaction對(duì)象指針,該對(duì)象用作事務(wù)范圍78,否則該MTS事務(wù)對(duì)象被挑出該線(xiàn)程。
使用SetTransactedFiles API將線(xiàn)程/過(guò)程標(biāo)記為經(jīng)事務(wù)處理的,從而通過(guò)該線(xiàn)程/過(guò)程的任何文件系統(tǒng)訪(fǎng)問(wèn)都是經(jīng)事務(wù)處理的。能設(shè)置三個(gè)不同的標(biāo)志,即一個(gè)在設(shè)置時(shí)導(dǎo)致從當(dāng)前線(xiàn)程的任何文件系統(tǒng)訪(fǎng)問(wèn)都成為經(jīng)事務(wù)處理的標(biāo)志;一個(gè)在設(shè)置時(shí)導(dǎo)致從當(dāng)前過(guò)程中每個(gè)線(xiàn)程的任何文件系統(tǒng)訪(fǎng)問(wèn)都成為經(jīng)事務(wù)處理的標(biāo)志;以及一個(gè)在設(shè)置時(shí)導(dǎo)致從當(dāng)前過(guò)程衍生的子過(guò)程對(duì)這些標(biāo)志的第二和第三個(gè)標(biāo)志進(jìn)行設(shè)定。因此,有可能以衍生過(guò)程繼承這種模式的方式標(biāo)記該線(xiàn)程/過(guò)程,這是一種非常有效的機(jī)制,因它允許現(xiàn)有的應(yīng)用程序利用經(jīng)事務(wù)處理的NTFS。此外,它允許應(yīng)用程序作出不具有事務(wù)處理模式位的文件系統(tǒng)操作,如刪除文件和復(fù)制文件。也能將此特征用于允許經(jīng)事務(wù)處理命令行批處理腳本。下面描述SetTransactedFiles APISetTransactedFiles([in]DWORD dwMode,//零或來(lái)自列舉的TxFILEMODE更多值。此值//包含對(duì)標(biāo)志的新設(shè)置,它們將按照dwMask//參數(shù)所指示進(jìn)行設(shè)置。
DWORD dwMask,//零或來(lái)自列舉的TxFILEMODE的更多值。只//有出現(xiàn)在此掩碼中的那些標(biāo)志值會(huì)受//SetTransactedFiles調(diào)用的影響。
DWORD*pdwPrevMode,//可選。如果提供,則通過(guò)這里,將以//前的模式返回給調(diào)用者。
);合法的標(biāo)志值如下Enum TxFILEMODE{TxFILEMODE_THISTHREAD=0x00000001,//對(duì)當(dāng)前的線(xiàn)程TxFILEMODE_ALLTHREADS=0x00000002,//對(duì)該過(guò)程中所有線(xiàn)程TxFILEMODE_CHILDPROCESSES=0x00000004,//在設(shè)置此模式時(shí)//使從當(dāng)前過(guò)程衍//生的所有子過(guò)程//自動(dòng)將ALLTHREADS//和_CHILDPROCESSES//設(shè)置。
TxFILEMODE_ALL=0xFFFFFFFF};如圖4所示,對(duì)除建立/打開(kāi)以外的文件操作,應(yīng)用程序60為文件系統(tǒng)提供句柄90,如通過(guò)API調(diào)用92請(qǐng)求文件讀操作,從而通過(guò)事務(wù)范圍指針,文件系統(tǒng)能定位事務(wù)范圍。注意,如上所述TxF 70必須列入該事務(wù)。由于在文件句柄90中指出事務(wù)范圍,文件系統(tǒng)就知道此操作包括在事務(wù)之中,并知道特別相關(guān)事務(wù)的標(biāo)識(shí)符。將文件包括在事務(wù)范圍中意味著包括讀、寫(xiě)、文件建立和刪除的對(duì)該文件的操作將經(jīng)事務(wù)處理。任意數(shù)量的文件系統(tǒng)請(qǐng)求可組合在一個(gè)事務(wù)內(nèi)并原子地和持續(xù)地提交或中斷。此外,在任何時(shí)刻可以進(jìn)行任意數(shù)量的事務(wù)并互相隔離。
事務(wù)訪(fǎng)問(wèn)-讀和寫(xiě)隔離如上所述,為事務(wù)處理的訪(fǎng)問(wèn)可以打開(kāi)或建立文件。目前,為了提供直接的、安全的和可預(yù)測(cè)的性能,系統(tǒng)將在任意給定時(shí)間中在系統(tǒng)中更新(寫(xiě))程序事務(wù)數(shù)目限定到1,即如果多個(gè)事務(wù)試圖同時(shí)打開(kāi)文件進(jìn)行讀/寫(xiě)(RW)訪(fǎng)問(wèn),在文件打開(kāi)時(shí)刻就返回一個(gè)錯(cuò)誤。因此,這些限制配置在文件級(jí)(相對(duì)于流級(jí))。此限制伴隨該文件直至以后提交或中斷。
但是,另外可行的是用更精細(xì)的精度實(shí)現(xiàn)系統(tǒng),如文件可以由多個(gè)寫(xiě)入程序打開(kāi),但是沒(méi)有一個(gè)能改寫(xiě)文件中由另一個(gè)程序所寫(xiě)的(臟(dirty))頁(yè),即一旦某頁(yè)被寫(xiě)過(guò),該頁(yè)就被鎖定。而且,“最后-寫(xiě)入程序-成功”類(lèi)型的訪(fǎng)問(wèn)在這里也能實(shí)現(xiàn)。注意,在一個(gè)給定的系統(tǒng)中這些類(lèi)型的文件“寫(xiě)”訪(fǎng)問(wèn)不是互相排斥的,因?yàn)橄旅媲闆r是可行的,一個(gè)API打開(kāi)一個(gè)文件進(jìn)行寫(xiě)訪(fǎng)問(wèn)而鎖定整個(gè)文件,另一個(gè)API打開(kāi)一個(gè)文件(不是同時(shí)鎖定的文件)進(jìn)行寫(xiě)訪(fǎng)問(wèn)而鎖定每頁(yè)(或其他文件段),和/或又一個(gè)API是最后-寫(xiě)入程序-成功寫(xiě)訪(fǎng)問(wèn)。然而,這里為了簡(jiǎn)單起見(jiàn),本發(fā)明是以整個(gè)文件在給定時(shí)刻只能由事務(wù)打開(kāi)一次(即其他只能順次(serialize)打開(kāi))以讀/寫(xiě)訪(fǎng)問(wèn)來(lái)敘述。文件的非事務(wù)更新程序也可以與用于寫(xiě)入的事務(wù)打開(kāi)順序化。注意,這并沒(méi)有阻止屬于同一事務(wù)的多個(gè)線(xiàn)程同時(shí)打開(kāi)文件以寫(xiě)入。對(duì)于作只讀訪(fǎng)問(wèn)打開(kāi)文件的讀程序的數(shù)目未加以嚴(yán)格的限制。
繼續(xù)考慮本發(fā)明,由事務(wù)為讀訪(fǎng)問(wèn)打開(kāi)的文件與由另外的事務(wù)對(duì)此文件作出的同時(shí)改變隔離,而不管寫(xiě)程序是在讀程序之前還是在其后打開(kāi)該文件。而且,此隔離一直持續(xù)到只讀事務(wù)訪(fǎng)問(wèn)的結(jié)束而不管改變?cè)撐募氖聞?wù)是否提交該事務(wù)。例如,如圖5所示,考慮事務(wù)處理讀程序X它打開(kāi)頁(yè)面的文件V0用于只讀訪(fǎng)問(wèn),在圖5中在時(shí)間軸起點(diǎn)由X/RO表示。注意,文件中每頁(yè)的大寫(xiě)字符“O”表示在打開(kāi)時(shí)間的原始數(shù)據(jù)。如果寫(xiě)入程序Y在以后時(shí)間在另一個(gè)事務(wù)中打開(kāi)文件V1用于讀/寫(xiě)訪(fǎng)問(wèn)(Y/RW),并隨后作出改變(Y/Writes),事務(wù)處理的讀程序X將繼續(xù)看到在文件V0中的原始數(shù)據(jù),而不是寫(xiě)入程序Y在V1中的改變。注意,當(dāng)發(fā)生改變時(shí),非事務(wù)將看到文件發(fā)生的改變。
如下所述,為了實(shí)現(xiàn)事務(wù)的隔離,(至少)在讀程序X使文件打開(kāi)的時(shí)間內(nèi),為讀程序保留文件的V?!鞍姹尽?。即使當(dāng)事務(wù)的寫(xiě)程序Y提交時(shí)這仍然保持正確。注意,如下將詳述,寫(xiě)程序Y對(duì)文件本身作出改變,而被讀程序X看到的版本是在寫(xiě)入改變之前作出的原始數(shù)據(jù)的逐頁(yè)復(fù)制;但相反情況也是可行的,即對(duì)讀程序x保持原始數(shù)據(jù)完整而對(duì)寫(xiě)程序Y保持改變的頁(yè)面的版本。而且注意,這是使用的術(shù)語(yǔ)“版本”,“已成版本(versioned)”,“正作成版本(versioning)”等是指時(shí)間瞬間的點(diǎn)(并且不應(yīng)與源代碼控制系統(tǒng)中永久性的版本混淆)。此外注意,事務(wù)處理的讀程序能與非事務(wù)處理的寫(xiě)程序依次排序以便于實(shí)現(xiàn)。另外,非事務(wù)處理的寫(xiě)程序可僅為了隔離的目的包括在“系統(tǒng)擁有”的事務(wù)中。因此提供可預(yù)測(cè)的事務(wù)處理的讀語(yǔ)義,因而事務(wù)處理的讀程序在給定的時(shí)間點(diǎn)可以依賴(lài)文件的“靜止”圖像。
回到圖5,一旦事務(wù)處理的寫(xiě)程序提交文件V1,事務(wù)處理的寫(xiě)程序Z可以打開(kāi)文件V2(從V1沒(méi)有改變)用于讀一寫(xiě)訪(fǎng)問(wèn)(Z/RW),如圖9所示。寫(xiě)程序Z能看到寫(xiě)程序Y的提交的改變,并能作出進(jìn)一步的改變(Z寫(xiě)入)。但注意,此時(shí)讀程序X仍然看到在文件首次被X打開(kāi)時(shí)X所看到的原始文件頁(yè),而不是任何Y所提交的改變。僅當(dāng)讀程序X關(guān)閉文件并隨后重新打開(kāi)時(shí),讀程序X才可能看到寫(xiě)程序Y的改變。如圖5所示,讀程序X也能看到寫(xiě)程序Z所提交的改變,只要讀程序X關(guān)閉文件V2并在Z提交以后再打開(kāi)它。換言之,如果讀程序X關(guān)閉文件并在Z提交以前重新打開(kāi)它,讀程序X將看到版本V1,但是如果讀程序關(guān)閉文件并在Z提交后重新打開(kāi)它,讀程序?qū)⒖吹轿募姹綱2。注意,如下所述,在文件打開(kāi)時(shí)刻保持并打開(kāi)比最新提交的版本更老的版本也是可行的。
應(yīng)該注意,這些語(yǔ)義是不能使用任何現(xiàn)有的文件共享模式表達(dá)的。這里描述的事務(wù)隔離語(yǔ)義隔離了各事務(wù)互相的影響,這與互相隔離句柄的文件共享模式成對(duì)比?,F(xiàn)有的文件共享模式不變,并可用于附加的順序化。例如,在為由規(guī)定“拒絕寫(xiě)”文件共享模式的同一事務(wù)的兩個(gè)不同線(xiàn)程為事務(wù)處理更新而打開(kāi)文件的情況中,第二次打開(kāi)將以破壞共享為由而拒絕。這就允許分布式應(yīng)用程序分配事務(wù)的工作負(fù)荷到多個(gè)線(xiàn)程、過(guò)程或機(jī)器,而同時(shí)保護(hù)由該事務(wù)作出的改變不受其他事務(wù)或非事務(wù)處理的工作程序的破壞。此外,這些語(yǔ)義保證可預(yù)測(cè)的已成版本的讀,其中每個(gè)讀程序能依賴(lài)文件的內(nèi)容在保持打開(kāi)時(shí)仍然穩(wěn)定。
在下面列出的兼容性矩陣中,“是”意味著相對(duì)于附加的事務(wù)處理的限制是兼容的


因此,更新事務(wù)查看包括其改變的文件的最新版本,而經(jīng)事務(wù)處理的讀得到文件的提交的版本。一個(gè)另選方法(上面一般描述的方法)是在打開(kāi)時(shí)提供文件最近提交的版本,而同時(shí)它是為事務(wù)處理讀打開(kāi),當(dāng)作出更多改變并提交時(shí),不允許版本改變。其好處在于讀程序在打開(kāi)期間看到事務(wù)處理一致的數(shù)據(jù)樣式。
在第二個(gè)另選方法中,由讀程序看到的版本可以是第一次文件系統(tǒng)訪(fǎng)問(wèn)時(shí)的版本或某個(gè)更早時(shí)間(即在TxF日志中更早點(diǎn))的版本。,這可提供在此讀程序開(kāi)始時(shí)最新提交的版本。此開(kāi)始時(shí)間可以是該事務(wù)首次訪(fǎng)問(wèn)該系統(tǒng)中任何NTFS對(duì)象的時(shí)間,或者這時(shí)間可以使用在一個(gè)集成的情況中其他的API(如使用日志序列號(hào),或LSN)來(lái)定義。這種特性的優(yōu)點(diǎn)在于事務(wù)在多個(gè)文件中得到時(shí)間點(diǎn)的瞬態(tài)圖(point-in-timesnapshot),當(dāng)存在多個(gè)文件依賴(lài)性和鏈接時(shí)(如HTML或XML文件)是有用的。注意在此另選方法中,在同一事務(wù)中文件的多次打開(kāi)可得到在該事務(wù)中第一次打開(kāi)時(shí)所選的版本。但是可以認(rèn)識(shí)到,需要由系統(tǒng)保存的版本歷史的數(shù)量在第二個(gè)另選方法中增加了。
術(shù)語(yǔ)“版本窗口(version window)”描述時(shí)間周期,在其中以前提交的版本的組被保持以支持選擇的版本方案。對(duì)上述的第一另選方法,版本窗口隨每個(gè)文件而變化,且是至今活動(dòng)的文件的最早打開(kāi)時(shí)間與當(dāng)前時(shí)間之間的時(shí)間。對(duì)第二種方案,該窗含義為在系統(tǒng)中最早事務(wù)的開(kāi)始LSN到當(dāng)前時(shí)間的時(shí)間??梢灾С诌@些方案的一種或兩種方案,而且由TxF 70所做的維持版本的工作基本上相同。為簡(jiǎn)單起見(jiàn),本發(fā)明在這里主要對(duì)于第一方案進(jìn)行討論,其中由讀程序查看的版本是在該事務(wù)中第一次打開(kāi)時(shí)刻的最新提交的文件版本。因此,在此第一方案中,因?yàn)榱靼姹驹诖蜷_(kāi)時(shí)刻確定,應(yīng)用程序如果需要最新提交的數(shù)據(jù),就必須關(guān)閉并重新打開(kāi)句柄。這類(lèi)似于在萬(wàn)維網(wǎng)服務(wù)器中特別有關(guān)的情況(其中網(wǎng)站能事務(wù)處理地在線(xiàn)更新),因此讀程序?yàn)榱丝吹叫绿峤坏臓顟B(tài)需要關(guān)閉并重新打開(kāi)句柄。
在一種實(shí)現(xiàn)中,寫(xiě)入一個(gè)文件是到實(shí)際文件,因?yàn)榧俣ǜ淖冏罱K是由寫(xiě)程序提交的。如下所述,如果未能提交,通過(guò)在日志中得到的撤消信息,取消任何改變。因此,為提供版本隔離,每個(gè)針對(duì)一頁(yè)的寫(xiě)首先導(dǎo)致為事務(wù)處理的讀程序保存老的頁(yè)。但注意,反過(guò)來(lái)做也是可行的,即保留原始文件完整直到改變被提交,從而寫(xiě)程序(而非讀程序)將具有建立的新頁(yè)面。
在使用微軟Windows2000(或NT)操作系統(tǒng)的較佳實(shí)現(xiàn)中,從高速緩存管理器和虛擬存儲(chǔ)管理器或VMM的觀(guān)點(diǎn)呈現(xiàn)各自?xún)?nèi)部存儲(chǔ)流,而不是在盤(pán)上為老版本建立各自文件。高速緩存管理器、VMM及它們與非事務(wù)處理的NTFS的關(guān)系在下列參考文獻(xiàn)中作詳細(xì)描述Helen Custer的“Inside WindowsNT”,Microsoft Press(1993);Helen Custer的”Inside the Windows NTFileSystem”,Microsoft Press(1994)和Dayid A.Solomon的“Inside WindowsNT,Second Edition”Microsoft Press(1998),通過(guò)引入作為參考。
關(guān)于為事務(wù)處理讀程序保持版本,從虛擬存儲(chǔ)管理器和高速緩存管理器的角度來(lái)看,讀文件的較舊版本如同讀不同文件進(jìn)行管理。這允許應(yīng)用程序簡(jiǎn)單地將較舊版本映射到它們的地址空間,并使采用存儲(chǔ)描述符表(如重定向程序)訪(fǎng)問(wèn)數(shù)據(jù)的客戶(hù)能透明地操作。注意,這之所以可能是因?yàn)樵赪indows2000操作系統(tǒng)中,VMM和高速緩存管理器參與文件系統(tǒng)的輸入/輸出(I/O)。文件系統(tǒng)(為非高速緩存訪(fǎng)問(wèn)打開(kāi)的文件除外)使用高速緩存管理器將數(shù)據(jù)映射到系統(tǒng)存儲(chǔ)器,而高速緩存管理器轉(zhuǎn)而使用VMM開(kāi)始I/O。臟寫(xiě)頁(yè)面的寫(xiě)通常以延遲模式在后臺(tái)線(xiàn)程中發(fā)生。作為此結(jié)構(gòu)的結(jié)果,直接映射到應(yīng)用程序地址空間的文件與高速緩存管理器共享頁(yè)面,這樣,不管使用什么系統(tǒng)服務(wù)得到它,都能提供一致的數(shù)據(jù)樣式。注意,由此,網(wǎng)絡(luò)重定向程序(下面描述)對(duì)數(shù)據(jù)進(jìn)行本地高速緩存,并在服務(wù)器處得到與其他客戶(hù)一致的數(shù)據(jù)。
為實(shí)現(xiàn)隔離,保持從仍然能讀到的最早提交的版本開(kāi)始到經(jīng)更新的最新版本的多個(gè)版本。每個(gè)版本具有與追蹤有關(guān)最新版本變化的版本相關(guān)的數(shù)據(jù)結(jié)構(gòu)。如果讀出沒(méi)有改變的頁(yè),該頁(yè)從文件中讀出(它可以在高速緩存中或?qū)懭氡P(pán)中),而如果被改變的頁(yè)讀出,它從已改變的頁(yè)數(shù)據(jù)中讀出(它也可以在高速緩存中)。注意,某些版本可以沒(méi)有任何讀它們的事務(wù),但可以保持它們的存儲(chǔ)器內(nèi)部結(jié)構(gòu),因?yàn)樗鼈冊(cè)诎姹敬爸?,且將?lái)可以得到打開(kāi)請(qǐng)求。那些從未打開(kāi)的版本不占據(jù)任何存儲(chǔ)器來(lái)儲(chǔ)存數(shù)據(jù)頁(yè)面。最新版本對(duì)應(yīng)于基文件流,且可以更新。
如圖6所示,每個(gè)版本用TxF“版本流控制塊”(TxFVSCB)描述。對(duì)一個(gè)文件的版本流控制塊以時(shí)間順序鏈接到一個(gè)表中,且除最新版本外的其他版本被提交/中斷,且是只讀的。最新版本可以提交或不提交。
每個(gè)TxFVSCB(如94)包括一個(gè)版本日志序列號(hào)96(版本LSN),它在記錄到TxF日志中時(shí),儲(chǔ)存事務(wù)的提交LSN。在一個(gè)實(shí)現(xiàn)中,對(duì)(最新的)未提交的版本,此LSN是TxF定義的“MAX_LSN”,以便于尋找小于當(dāng)前時(shí)間點(diǎn)的最高LSN。希望讀早與此版本的提交的數(shù)據(jù)的讀程序能借助使用在改變表中的項(xiàng)(如981)訪(fǎng)問(wèn)它,該表是存儲(chǔ)器內(nèi)部表98,它記錄了由TxFVSCB指向的版本改變的頁(yè)號(hào)。如TxFVSCB 94之類(lèi)的每個(gè)TxFSCB還包括對(duì)應(yīng)于此版本的段對(duì)象指針(SOP)結(jié)構(gòu)100,它由高速緩存管理器和虛擬存儲(chǔ)管理器使用,并表示存儲(chǔ)器內(nèi)部流。還提供狀態(tài)標(biāo)志102,其中之一表示該版本是否被提交。注意,只有最新的版本可以是未提交的。還包括VersionLength104數(shù)據(jù)字段,以及Change Table Pointer field(改變表指針字段)106,它包括指向記錄由版本改變的頁(yè)號(hào)的改變表98的指針。
如圖6所示,在改變表中(如981),可以?xún)?chǔ)存與頁(yè)號(hào)相關(guān)的盤(pán)地址,以便于盤(pán)上找到該頁(yè)的以前版本,只要該頁(yè)在此版本中至少被寫(xiě)一次。注意,如圖6所示,主要為了節(jié)省存儲(chǔ)器,頁(yè)的范圍能存在一個(gè)項(xiàng)中,該范圍處頁(yè)面連續(xù)存在盤(pán)上。圖7示出文件的多個(gè)版本的改變表940-943??墒褂萌鐦?shù)這種有效的搜索結(jié)構(gòu)組織此改變表。
如果在事務(wù)中文件被打開(kāi)用于只讀訪(fǎng)問(wèn),挑選出適當(dāng)?shù)奶峤坏陌姹?,版本?hào)由“readLSN”識(shí)別。如上所述,readLSN或者是當(dāng)前的LSN,或者是較早的LSN,取決于使用什么類(lèi)型的版本。選擇的版本是readLSN以前的最近提交的版本。如果版本不存在,如此版本太老,則打開(kāi)失敗。如果該文件沒(méi)有任何與其相關(guān)的TxFSCB,用空的改變表建立新的TxFVSCB,并標(biāo)記為未提交。使用默認(rèn)的存儲(chǔ)器內(nèi)部流,使得現(xiàn)有的高速緩存的數(shù)據(jù)能用于讀。對(duì)寫(xiě)訪(fǎng)問(wèn),如果最近的版本是未提交,它作為已提交被使用,否則如果沒(méi)有標(biāo)記為未提交,建立新的VSCB,并標(biāo)記為未提交。
當(dāng)寫(xiě)入一文件時(shí)為便于隔離,每當(dāng)一頁(yè)數(shù)據(jù)(如在用戶(hù)級(jí)緩沖器108)被事務(wù)改變時(shí),該頁(yè)基本上在原位(即在高速緩存110中)編輯(見(jiàn)圖8)。然后在適當(dāng)時(shí)間,高速緩存110被高速緩存管理器和/或VMM 112寫(xiě)到盤(pán)上(或其他合適的非易失性存儲(chǔ)媒體)114。通常如上所述,數(shù)據(jù)能通過(guò)將文件映射到存儲(chǔ)器或使用寫(xiě)API來(lái)改變。當(dāng)使用寫(xiě)API時(shí),通常使用高速緩存管理器112將改變復(fù)制到存儲(chǔ)器駐留頁(yè)116。注意,使用高速緩存管理器112將文件映射到系統(tǒng)存儲(chǔ)器。當(dāng)使用存儲(chǔ)器映射時(shí),由應(yīng)用應(yīng)用程序直接對(duì)與高速緩存管理器112映射頁(yè)相同的系統(tǒng)存儲(chǔ)器頁(yè)(如頁(yè)116)作出改變。改變經(jīng)“臟”位記錄下來(lái),它指出在存儲(chǔ)器映射I/O的情況,改變駐留在過(guò)程專(zhuān)用頁(yè)表項(xiàng)(PTE)118中。通常,當(dāng)存儲(chǔ)管理器對(duì)來(lái)自過(guò)程的工作集的頁(yè)面進(jìn)行修整時(shí),這些位就傳播到共享的(頁(yè)面幀號(hào))PFN結(jié)構(gòu)120。它們也能由應(yīng)用程序60使用系統(tǒng)API直接傳播,以刷新映射段。注意,臟頁(yè)也能周期地寫(xiě)出。
為了保證存儲(chǔ)器映射的改變包括在事務(wù)中,在提交時(shí)刻系統(tǒng)將刷新每個(gè)應(yīng)用映射段的虛擬地址范圍。從映射它們的應(yīng)用程序的范圍中起動(dòng)此刷新。事務(wù)處理的語(yǔ)義可以這樣定義只有直接由應(yīng)用程序刷新的頁(yè)才能包括在該事務(wù)中(如刷新是事務(wù)性地作出,而不是對(duì)用戶(hù)段中的字節(jié)的單獨(dú)修改)。另外,這可以通過(guò)附著(KeAttachProcess)到具有映射段并做此刷新的過(guò)程的系統(tǒng)線(xiàn)程來(lái)實(shí)現(xiàn)。段的列表保持在相應(yīng)的事務(wù)表項(xiàng)中。注意,由文件API作出的改變?cè)谔峤粫r(shí)也需要刷新到盤(pán)中。這是因?yàn)樵陧?yè)面寫(xiě)蝕刻,不可能在從以前事務(wù)留下的臟頁(yè)面寫(xiě)和在當(dāng)前的事務(wù)中由存儲(chǔ)器映射作出的改變之間進(jìn)行區(qū)分。
因此TxF同時(shí)支持由事務(wù)作出的只讀和讀/寫(xiě)的文件打開(kāi)。當(dāng)事務(wù)以只讀訪(fǎng)問(wèn)方式打開(kāi)文件,而該文件目前未被任何其他事務(wù)打開(kāi)時(shí),該文件上的語(yǔ)義與以非事務(wù)方式打開(kāi)的相同。如果事務(wù)打開(kāi)一文件用于讀/寫(xiě),則TxF需要的一種該文件的結(jié)構(gòu),每個(gè)流一個(gè),以及對(duì)流版本的一種結(jié)構(gòu),以存儲(chǔ)其每個(gè)事務(wù)的范圍,如圖9所示。用于此打開(kāi)的數(shù)據(jù)結(jié)構(gòu)如圖9所示,其中“文件對(duì)象”是由用戶(hù)的文件句柄映射的對(duì)象,“FCB”是NTFS文件控制塊,“SCB”是用于打開(kāi)的特定流的NTFS流控制塊,“NP SCB”是主要用于保持對(duì)文件映射的段對(duì)象指針的非頁(yè)面流控制塊,而“CCB”是每個(gè)文件對(duì)象范圍結(jié)構(gòu)。注意在TxFFO中的標(biāo)志指出該文件何時(shí)由事務(wù)打開(kāi)用于讀。
在圖9中,TxFCB結(jié)構(gòu)是用于由TxF保持的每個(gè)文件的改變的撤消數(shù)據(jù)的一個(gè)錨標(biāo),而且還包括對(duì)該事務(wù)的參照。TxFSCB是用于流版本的錨標(biāo),TxFVSCB是用于流的特定版本的撤消數(shù)據(jù)的錨標(biāo)。TxFO結(jié)構(gòu)描述對(duì)流的版本的特定事務(wù)訪(fǎng)問(wèn),且它捕捉指向該版本的有關(guān)共享TxF結(jié)構(gòu)的指針。
如圖10所示,如果第二事務(wù)t3在以前的只讀事務(wù)做完以前打開(kāi)文件用于讀/寫(xiě),則該文件的老版本基本上移位(到圖10中的右側(cè)),為表示新版本的結(jié)構(gòu)留出空間。因此,圖10表示由修改文件當(dāng)前版本的事務(wù)t3作出的讀/寫(xiě)打開(kāi),由訪(fǎng)問(wèn)該文件最近提交的版本的事務(wù)t2作出的只讀打開(kāi),以及由訪(fǎng)問(wèn)更早提交的版本的事務(wù)t1作出的另一個(gè)只讀打開(kāi)。注意,為簡(jiǎn)單起見(jiàn),每個(gè)FileObject指向同一個(gè)SCB,而NTFS不知道文件的版本。而且,每個(gè)FileObject在唯一的非分頁(yè)SCB中擁有其自己的段對(duì)象指針組。注意,通常并不使用用于只讀事務(wù)的段對(duì)象指針,除非用戶(hù)實(shí)際上映射該流。從對(duì)未加修改的頁(yè)面的當(dāng)前流以及從對(duì)已修改頁(yè)的記錄文件維護(hù)高速緩存訪(fǎng)問(wèn)。對(duì)每個(gè)文件對(duì)象的TxFO有效地捕捉該事務(wù)訪(fǎng)問(wèn)文件的哪個(gè)版本。
通常,因?yàn)門(mén)xF事務(wù)具有無(wú)關(guān)于NTFS句柄的生命周期,因此,TxF結(jié)構(gòu)具有無(wú)關(guān)于NTFS句柄的生命周期。當(dāng)兩者都出現(xiàn)時(shí),如圖9-10所示,它們鏈接在一起,其中使用意義明確的接口在兩邊建立單向鏈結(jié)。例如,當(dāng)發(fā)生對(duì)一個(gè)文件的事務(wù)處理訪(fǎng)問(wèn)時(shí),校驗(yàn)到TxFCB的FCB鏈接。如果是空,它使用TxF例行程序建立。但是如果TxF已經(jīng)存在,使用File-Id由TxF從TxF文件表中對(duì)其進(jìn)行查找,否則分配一個(gè)新的。類(lèi)似地,當(dāng)FCB被重新分配且TxFCB鏈接是非空,則調(diào)用TxF例行程序用于單向(NTFS到TxF)鏈接的刪除。
當(dāng)沒(méi)有事務(wù)處理的讀程序使文件打開(kāi)或能在將來(lái)打開(kāi)文件的這個(gè)版本時(shí),對(duì)文件重新分配TxF結(jié)構(gòu)。即使NTFS目錄由于目錄本身的刪除(在遞歸刪除方式中發(fā)生)可以去掉,但只要在TxFSCB結(jié)構(gòu)中存在名字空間隔離信息,就能維護(hù)目錄。TxF結(jié)構(gòu)的生命周期通過(guò)參照計(jì)數(shù)來(lái)管理。
記錄服務(wù)按本發(fā)明的另一方面并如下所述,對(duì)于永久性狀態(tài)的記錄與恢復(fù),TxF 70使用記錄服務(wù)74(圖2),它允許多級(jí)記錄而不是只依賴(lài)于普通的NTFS記錄,以支持長(zhǎng)期運(yùn)行的事務(wù)。下面將明白,這提供了許多好處。例如,典型的NTFS記錄大小在約4兆字節(jié),對(duì)于目前的短期元數(shù)據(jù)記錄,這個(gè)大小很適合,但是典型的用戶(hù)定義事務(wù)將很快超過(guò)這樣的記錄。而且,相對(duì)于記錄的TxF事務(wù)操作數(shù)目,很可能有大量記錄的NTFS操作。此外,NTFS元數(shù)據(jù)提交操作鎖定目錄,而占用長(zhǎng)時(shí)間的TxF事務(wù)將對(duì)文件系統(tǒng)的性能有不利的影響(在假定的單級(jí)記錄方案中)。
傳統(tǒng)的NTFS記錄已有文檔很好描述,因此在這里除簡(jiǎn)單概要以外不作詳述,敘述的范圍是結(jié)合本發(fā)明的事務(wù)處理文件系統(tǒng)對(duì)其的使用。在NFTS作出改變以前,通過(guò)寫(xiě)入對(duì)操作的撤消和/或重做記錄到NTFS中,NTFS提供文件系統(tǒng)操作的中斷/失敗恢復(fù)功能。NTFS記錄是每卷的文件,用于記錄影響該NTFS卷的操作,包括改變NTFS數(shù)據(jù)結(jié)構(gòu)的操作,如建立文件命令、改名等。注意,記錄的是元數(shù)據(jù),而不是用戶(hù)文件數(shù)據(jù),如被寫(xiě)入的字節(jié)。該日志作為文件保持,并被訪(fǎng)問(wèn)以便從系統(tǒng)失敗中恢復(fù),即如果系統(tǒng)崩潰,將使用已知的技術(shù),可以撤消或重做部分完成的操作。NTFS不提供持久性,即NTFS不強(qiáng)制其日志提交。
按本發(fā)明的一個(gè)方面,在多級(jí)恢復(fù)機(jī)制中,TxF事務(wù)和恢復(fù)管理分層在NTFS的頂部。如上所述,TxF將NTFS操作作為建立用戶(hù)級(jí)事務(wù)的低級(jí)部件處理。為了恢復(fù),TxF保持更高級(jí)日志,并且在檢測(cè)到TxF強(qiáng)迫其自己的TxF日志在“數(shù)據(jù)”之前,將記錄的NTFS操作處理作為關(guān)于更高級(jí)日志的“數(shù)據(jù)”進(jìn)行處理。在此情況下的“數(shù)據(jù)”是NTFS日志,一個(gè)可恢復(fù)的存儲(chǔ)本身。
如圖11所示,為了完成多級(jí)記錄,通過(guò)以利用已經(jīng)可用的NTFS 64的可恢復(fù)性的方式協(xié)調(diào)每個(gè)日志的LSN(這里稱(chēng)為T(mén)xFLSN和NTFSLSN)強(qiáng)制高級(jí)TxF日志124在低級(jí)NTFS日志126之前完成。如下所述,對(duì)于不由NTFS事務(wù)管理的數(shù)據(jù)(即流字節(jié)本身),TxF 70實(shí)質(zhì)上完全地管理可恢復(fù)性。
為保證較高級(jí)TxF日志124強(qiáng)制在其“數(shù)據(jù)”(即在NTFS日志126中的記錄)之前(而沒(méi)有無(wú)效地強(qiáng)制TxF日志在每次NTFS操作之前),提供TxF回?fù)?,使得每?dāng)NTFS 64將要強(qiáng)制在其日志126中的數(shù)據(jù)時(shí),NTFS 64就調(diào)用它。在此調(diào)用中,NTFS 64指出需要刷新的最高NTFS LSN。同時(shí),TxF 70保持TxF使用的最近的NTFS事務(wù)的映射128,以便將NTFS提交LSN映射到對(duì)應(yīng)的TxF LSN。注意,設(shè)計(jì)了名字空間修改操作,使得TxFN知道TFS提交LSN。NTFS日志并不持久,因?yàn)樗鄬?duì)不頻繁地刷新到盤(pán)中。因此,在日志高速緩存中存在合理數(shù)量的TxF記錄,它們?cè)趩蝹€(gè)I/O操作中一起刷新到盤(pán)中。
響應(yīng)此回?fù)?,TxF 70強(qiáng)制TxF日志124直到對(duì)應(yīng)于在NTFS日志中被強(qiáng)制的最高NTFS Commit-LSN的TxF記錄。但是應(yīng)該注意,刷新TxF日志124到最高記錄僅是更加優(yōu)化,因此保證較高級(jí)日志首先刷新的其他方法(如當(dāng)NTFS要刷新其日志時(shí)刷新所有新的TxF記錄)也滿(mǎn)足需要。在恢復(fù)期間,在TxF開(kāi)始其恢復(fù)以前NTFS完成其的恢復(fù)。
雖然這保證TxF日志124在NTFS日志126之前刷新,但某些靠近TxF日志結(jié)束的日志記錄可能已完成未被NTFS提交的NTFS操作,這種記錄與已被提交的記錄混合。重要的是將其對(duì)應(yīng)的NTFS操作已被提交的TxF日志記錄與未被提交的那些加以區(qū)別,因?yàn)檫@決定了在恢復(fù)期間是否應(yīng)用TxF日志記錄。
也將明白,這是重要的,因?yàn)樵谥刈銎陂g重復(fù)一個(gè)操作,或撤消從未發(fā)生過(guò)的操作是不正確的。作為一個(gè)例子,考慮下面在TxF日志中可能記錄的情況

在上述情況中,不可能知道是否正確地反轉(zhuǎn)(撤消)了改名操作。每次簡(jiǎn)單地做此反轉(zhuǎn)操作是不正確的。因?yàn)槿绻贜TFS中改名實(shí)際上從未發(fā)生過(guò),Y將改名為X,取代它。因此,在試圖打開(kāi)系統(tǒng)鏈接時(shí)可能失敗,因?yàn)樵撴溄佑捎谖窗l(fā)生NTFS操作而不存在。文件X將被丟失,而Y改名為X,但是,如果TxF 70能夠查明改名是否發(fā)生,就能精確判定是否要應(yīng)用撤消操作。
為在請(qǐng)求一個(gè)操作前判定操作是否實(shí)際發(fā)生,即是否被NTFS 64提交,TxF將相應(yīng)記錄寫(xiě)到其日志124。然后TxF接收TxF LSN,后者為NTFS 66提供對(duì)給定文件的請(qǐng)求的操作。雖然在提交后讓NTFS 66將TxF LSN放到其對(duì)應(yīng)的NTFS日志記錄(或多個(gè)記錄)中是可行的,但這是低效的。取代的是當(dāng)NTFS提交操作時(shí),作為提交的一部分,NTFS將TxF LSN寫(xiě)到在NTFS卷上保持用于該文件的記錄中。在NTFS中,對(duì)卷上每個(gè)文件(及目錄)已經(jīng)以稱(chēng)為主文件表的結(jié)構(gòu)保持了記錄。因此,如在圖11所示,TxF LSN寫(xiě)到在對(duì)此文件(如文件3)的記錄中的一個(gè)字段(如1323)中。注意,也可使用另外的數(shù)據(jù)結(jié)構(gòu),只要每文件的記錄已經(jīng)在每個(gè)NTFS卷上可以得到。
隨后,系統(tǒng)崩潰之后,在恢復(fù)期間,在TxF使NTFS完全實(shí)現(xiàn)其恢復(fù)之后,TxF首先檢查以確定在系統(tǒng)崩潰前在TxF日志中記錄的操作是否在盤(pán)上進(jìn)行(通過(guò)NtfsTxFGetTxFLSN(file-id,*TxFLsn)調(diào)用來(lái)調(diào)用NTFS)。如果對(duì)文件的NTFS操作提交并在系統(tǒng)崩潰前保存到盤(pán)中,TxF日志124中記錄的TxF LSN就小于或等于在文件記錄字段中的TxF LSN,因?yàn)镹TFS恢復(fù)保證文件記錄將被恢復(fù)。如果在文件記錄的TxF LSN小于TxF日志記錄的LSN(或不是在該文件的文件記錄中),則可以知道NTFS操作未被提交,而且對(duì)應(yīng)的TxF日志記錄不能用于撤消。
但注意,為保證正確的恢復(fù),如果一個(gè)對(duì)象在恢復(fù)窗期間被刪除,TxF將推遲該文件記錄的刪除(因而保留文件標(biāo)識(shí)符file-id),直到所刪除日志記錄在日志中被遺忘之后為止。這是借助建立到該文件的系統(tǒng)鏈接完成的。此外,如果建立一個(gè)新文件,在NTFS確定將用于建立的文件標(biāo)識(shí)符之前不寫(xiě)入TxF日志記錄。這就實(shí)際上將文件標(biāo)識(shí)符記錄入TxF日志。注意,對(duì)非事務(wù)處理的建立也如此,NTFS將當(dāng)前的TxF LSN寫(xiě)入文件記錄,然后處理這種情況,其中在恢復(fù)窗期間重新使用文件標(biāo)識(shí)符(包括序號(hào)),并在建立之前使TxF跳過(guò)日志記錄。
因此,如果NtfsTxFGetTxFLSN調(diào)用發(fā)現(xiàn),在恢復(fù)時(shí)刻文件標(biāo)識(shí)符不存在,則或者在事務(wù)提交之后且在系統(tǒng)崩潰之前文件被非事務(wù)處理地刪除,或者在建立操作之后立即發(fā)生系統(tǒng)崩潰。注意,在第一種情況,沒(méi)有涉及TxF且在恢復(fù)窗期間文件記錄被刪除。在第二種情況,TxF建立的日志記錄送到TxF日志盤(pán)中,但NTFS對(duì)它的提交未持續(xù)。只有當(dāng)處理一個(gè)建立日志記錄時(shí)第二種情才能檢測(cè)到。
因?yàn)槌废涗浻糜谥袛辔赐瓿傻氖聞?wù),如由NtfsTxFGetTxFLSN看到的文件標(biāo)識(shí)符不存在的記錄可以簡(jiǎn)單地忽略。
應(yīng)該注意,在中斷、崩潰恢復(fù)和向前恢復(fù)期間,由日志驅(qū)動(dòng)的重做和撤消動(dòng)作在NTFS過(guò)濾一驅(qū)動(dòng)程序模型中的過(guò)濾驅(qū)動(dòng)程序堆棧的頂部起動(dòng),允許任何中間的過(guò)濾驅(qū)動(dòng)程序看到這些動(dòng)作。對(duì)應(yīng)于重做和撤消動(dòng)作的IRP被專(zhuān)門(mén)標(biāo)記,使得過(guò)濾驅(qū)動(dòng)程序能選擇忽略它們。這些IRP將包括通常的事務(wù)狀態(tài)而文件對(duì)象一般將指向事務(wù)對(duì)象。但是,因?yàn)槭聞?wù)處于特定狀態(tài),TxF將知道它們需要專(zhuān)門(mén)處理。例如,TxF不試圖將這些動(dòng)作包括在一個(gè)事務(wù)中,或?qū)⑺鼈冏鳛榉鞘聞?wù)處理。
除了記錄名字空間操作以外,TxF部件70與記錄服務(wù)74協(xié)同工作以記錄在其他操作中的頁(yè)改變。如上所述,在中斷情況為維持版本也為了支持撤消操作,在通過(guò)API對(duì)存儲(chǔ)器中的頁(yè)面實(shí)際作出改變以前,相應(yīng)的撤消記錄寫(xiě)到(非強(qiáng)制性的)TxF日志126。如圖12所示,然后寫(xiě)整個(gè)頁(yè)面(通常寫(xiě)到存儲(chǔ)器內(nèi)和如下所述稱(chēng)為T(mén)OPS流134的盤(pán)上的頁(yè)流),它允許已成版本的讀程序在單個(gè)I/O操作中讀出該頁(yè)面。在日志寫(xiě)以后,對(duì)該文件的改變表98用日志序號(hào)(TxF LSN和在TOPS流134中的偏移量)標(biāo)記,此改變隨后應(yīng)用到該頁(yè)。
對(duì)由頁(yè)I/O改變的頁(yè),如從已被用戶(hù)映射段修改的頁(yè)和/或由較早對(duì)正在寫(xiě)入的API的調(diào)用修改的頁(yè)所得到的頁(yè),完成頁(yè)面的寫(xiě)。此分頁(yè)的寫(xiě)能在后臺(tái)的線(xiàn)程中,或可以是在提交時(shí)刻刷新部分。在任何情況,TxF 70首先檢查改變表98(圖6),以查看該撤消是否在TxF日志126中已被抓住。若是,系統(tǒng)強(qiáng)制TxF日志126直到表98中標(biāo)記的TxF LSN,在大多數(shù)情況它將返回而沒(méi)有I/O。如果改變表98未被標(biāo)記,得到該頁(yè)的撤消版本并寫(xiě)到TOPS流134和TxF日志126。多頁(yè)I/O是常見(jiàn)的,因?yàn)楹笈_(tái)線(xiàn)程試圖以文件偏移量的次序?qū)㈨?yè)面組合在一起。在這些情況,多個(gè)撤消被寫(xiě)入單個(gè)、大的I/O。在這些情況的撤消也將在單個(gè)、大的I/O中讀出。
在準(zhǔn)備的記錄被強(qiáng)制到TxF日志126以后,撤消映象在TxF日志126和TOPS流134中的盤(pán)上,而修改的文件頁(yè)在文件中它們的位置處。因此,提交是將提交記錄寫(xiě)入日志126的簡(jiǎn)單操作。中斷的實(shí)現(xiàn)是通過(guò)以逆序執(zhí)行撤消記錄,并將它們應(yīng)用到基文件,隨后刷新文件,隨后強(qiáng)制寫(xiě)中斷記錄。如果中斷記錄存在于日志126之中;在恢復(fù)時(shí)刻就忽略這些撤消記錄。注意,通過(guò)在不頻繁的操作(中斷)期間刷新文件,大的(頁(yè)面大小)補(bǔ)償日志記錄(CLR)不需要作為重做記錄寫(xiě)入,這顯著地保存了空間。
獲得一個(gè)撤消映象與得到以前提交的頁(yè)版本是一樣的,即文件的撤消映象首先在文件的以前版本中搜索。如果映象留在存儲(chǔ)器中,撤消映象從存儲(chǔ)器中取出。否則,映象由非高速緩存的I/O操作從盤(pán)中讀出,因?yàn)榕K位被非公開(kāi)地處理且并不需要知道,就無(wú)法確定當(dāng)前留在存儲(chǔ)器的映象是否是臟的。
如上所述,每當(dāng)一頁(yè)面由使文件打開(kāi)以寫(xiě)入的事務(wù)改變時(shí),該頁(yè)面就在原位(即高速緩存器中)編輯。隨后,高速緩存在不同時(shí)刻被寫(xiě)入盤(pán)中(圖8)。但是在頁(yè)面數(shù)據(jù)被改變時(shí),老的頁(yè)面數(shù)據(jù)需要保存,所以如果事務(wù)中斷或系統(tǒng)失敗,老的頁(yè)面數(shù)據(jù)能夠恢復(fù)。為此,老的頁(yè)面被復(fù)制到TOPS流134,而改變記錄在TxF日志126中。如圖12所示,日志記錄(如X2)包括到此頁(yè)面的偏移量,而日志126不需要保持?jǐn)?shù)據(jù),而只需對(duì)應(yīng)其的記錄。因此,為使頁(yè)面恢復(fù),TxF使用隨時(shí)間順序記錄改變的改變?nèi)罩?。注意,?duì)于正在做版本,為有效起見(jiàn)使用在改變表98中到TOPS流134的偏移,而不是訪(fǎng)問(wèn)TxF日志126。但是在系統(tǒng)失敗的情況,存儲(chǔ)器內(nèi)結(jié)構(gòu)的版本流控制塊在恢復(fù)時(shí)刻不存在。而且單獨(dú)在存儲(chǔ)器內(nèi)的任何文件版本是不可恢復(fù)的。因此為了恢復(fù),可以將日志中的記錄用于在失敗期間中斷事務(wù),并用于持久地完成在系統(tǒng)失敗前提交的事務(wù)。日志項(xiàng)(或日志記錄)的順序特性保存了改變的次序。
在本發(fā)明中,由于其性能和其他原因,頁(yè)面寫(xiě)的日志記錄分離成兩部分。與主日志內(nèi)聯(lián)(inline)的部分保存其相對(duì)于其他日志的次序,而另一部分包括(相對(duì)更大量的)字節(jié),它們提供操作的細(xì)節(jié),即改變的頁(yè)面數(shù)據(jù)。因此,按本發(fā)明的一個(gè)方面,如在圖12所示,每當(dāng)頁(yè)面由事務(wù)改變,老的頁(yè)面數(shù)據(jù)復(fù)制到(連續(xù)的)TOPS流134,并在TxF日志126記錄改變。如上所述,在調(diào)整表以將事務(wù)處理的讀程序映射到復(fù)制頁(yè)面以后,該頁(yè)面隨后可以改變。如圖12所示,日志記錄(如X2)包括到在復(fù)制頁(yè)的流中的此頁(yè)的偏移,因而主日志不需要保持?jǐn)?shù)據(jù),只保持具有對(duì)應(yīng)其的偏移的記錄。
但是,出于性能原因,這些日志被不同地刷新到盤(pán)中。因此,頁(yè)面和日志126在給定時(shí)刻可能都不能持久,例如系統(tǒng)可以在日志126被刷新到盤(pán)和/或頁(yè)面被刷新到盤(pán)上之前失敗。保證頁(yè)面數(shù)據(jù)不丟失的簡(jiǎn)單方法是在兩者之間強(qiáng)加排序,即在刷新日志記錄到盤(pán)上之前總是先將頁(yè)面刷新到盤(pán)上。因此當(dāng)恢復(fù)過(guò)程中使用日志時(shí),如果日志記錄存在,對(duì)應(yīng)于該記錄的正確的頁(yè)版本也已知繼續(xù)保持,但是發(fā)現(xiàn)此次序依賴(lài)關(guān)系很大地降低了系統(tǒng)的性能,因?yàn)槿罩舅⑿虏僮鞲鶕?jù)許多無(wú)關(guān)的因素在不同的日志上更加有效操作。例如為了改善性能,頁(yè)面通常以多組形式被刷新,如使用惰性寫(xiě)算法一次16頁(yè),而日志在滿(mǎn)時(shí),或在后臺(tái)處理的不同時(shí)刻被刷新。
按本發(fā)明的另外方面,提供一個(gè)系統(tǒng)和方法,它們使頁(yè)面和日志能以相對(duì)彼此任意的次序刷新到永久存儲(chǔ)器中,而且以這種的方式,確保在失敗的情況能恢復(fù)正確的頁(yè)面。這是通過(guò)將信息加到日志126和頁(yè)面數(shù)據(jù)中來(lái)實(shí)現(xiàn),將兩段信息以一致?tīng)顟B(tài)(例如及時(shí))有效互相鏈接。更具體地說(shuō),保持一個(gè)循環(huán)計(jì)數(shù)136(如以字節(jié),雖然可選擇使用一個(gè)字或更大容量),表示頁(yè)面的當(dāng)前狀態(tài),如每當(dāng)指向TOPS流134的指針?lè)瓭L回到起點(diǎn)時(shí)循環(huán)計(jì)數(shù)就加1,而且該循環(huán)計(jì)數(shù)與日志記錄同步。
如圖12所示按本發(fā)明的一個(gè)方面,同步是通過(guò)將循環(huán)計(jì)數(shù)值保持在與復(fù)制到TOPS流134頁(yè)面相關(guān)的日志記錄來(lái)實(shí)現(xiàn)的。這在圖12中用標(biāo)號(hào)為138的方框表示,它提供某些記錄的數(shù)據(jù)字段的擴(kuò)展表示。還示出。在每段中的最后部分(如字節(jié))復(fù)制到日志記錄以便在那里保存。注意,一個(gè)頁(yè)面包括8個(gè)512字節(jié)的段,每個(gè)段如這里所描述,但可以理解,其他頁(yè)和/或段的大小是可能的。而且在流數(shù)據(jù)中每段的最后部分用循環(huán)計(jì)數(shù)代替,如在圖12中用標(biāo)號(hào)為140的方框表示,用在每段的最后部分中代替的循環(huán)計(jì)數(shù)提供頁(yè)數(shù)據(jù)的擴(kuò)展表示。如在圖12所示,如果頁(yè)和日志均被刷新,在每段的未端的循環(huán)計(jì)數(shù)值將匹配在記錄中的循環(huán)計(jì)數(shù)值,即兩者具有匹配的特征。
如果只有頁(yè)面數(shù)據(jù)(外部部分)被寫(xiě)入盤(pán),系統(tǒng)將找不到內(nèi)聯(lián)(日志)記錄,因此找不到該頁(yè)面,沒(méi)有什么可恢復(fù)。該狀態(tài)就認(rèn)為是一致的。
但如果記錄出現(xiàn)在日志中,在系統(tǒng)崩潰前,頁(yè)面可以被或可以不被刷新。圖13通常表示當(dāng)在退回過(guò)程中記錄到達(dá)時(shí),頁(yè)面及其日志是否均被刷新到盤(pán)中。首先在步驟1300,記錄被訪(fǎng)問(wèn),以通過(guò)其儲(chǔ)存到流134的偏移量找到頁(yè)面。然后,在步驟1302讀出頁(yè)面并從中取出每段的最后部分,在步驟1304將其與存在日志記錄中的循環(huán)計(jì)數(shù)比較。如果只有內(nèi)聯(lián)(日志)記錄被寫(xiě)入盤(pán),系統(tǒng)崩潰以后存在外部部分(頁(yè)面數(shù)據(jù))的每個(gè)段中的唯一的記號(hào)(每個(gè)循環(huán)計(jì)數(shù))將不匹配存在于內(nèi)聯(lián)記錄數(shù)據(jù)的循環(huán)計(jì)數(shù)。在此情況中,如步驟1306所示,系統(tǒng)得出結(jié)論,因?yàn)槔系捻?yè)面未寫(xiě)入盤(pán),而新頁(yè)面也未寫(xiě)(只有在兩個(gè)日志被刷新時(shí)它才被刷新)。因此該頁(yè)面已知處于以前的老狀態(tài)。
相反,如果在步驟1304中,日志中的循環(huán)計(jì)數(shù)匹配對(duì)應(yīng)頁(yè)的每段的最后部分中的循環(huán)計(jì)數(shù),日志和頁(yè)面就已知均被成功地刷新。因此,就知道被復(fù)制的頁(yè)面保持,而存在日志記錄中每段的最后部分在步驟1308恢復(fù)到復(fù)制的頁(yè)。
此時(shí),被復(fù)制的頁(yè)面可由讀程序訪(fǎng)問(wèn),并提供適當(dāng)?shù)陌姹?。任何?duì)當(dāng)前頁(yè)面作出的記錄改變可用于(步驟1310)使新的讀程序和/或?qū)懗绦蚩吹?。在該情況,知道老的數(shù)據(jù)被正確地捕獲,并必須作為中斷的一部分恢復(fù)到文件頁(yè)。注意,盡管中斷,現(xiàn)有的事務(wù)處理的讀程序?qū)⒗^續(xù)從TOPS流134讀到老的數(shù)據(jù)。
應(yīng)該注意,使用在每段的結(jié)尾的唯一的記號(hào)還進(jìn)一步檢測(cè)分裂(部分)寫(xiě),其中某些頁(yè)面被復(fù)制,但不是所有頁(yè)面。注意,盤(pán)硬件保證段將寫(xiě)滿(mǎn),但不保證一頁(yè)數(shù)據(jù)(如8段)將作為一個(gè)單元被寫(xiě)。在這種情況,循環(huán)計(jì)數(shù)是“n”和(推測(cè)的)“n-1”值的某種混合,該記號(hào)將不匹配記錄的記號(hào)信息。就如同整頁(yè)沒(méi)有保存來(lái)處理這種情況。
注意,當(dāng)循環(huán)計(jì)數(shù)本身重算,有可能使其匹配構(gòu)成現(xiàn)有頁(yè)面上的記號(hào)的計(jì)數(shù)(如它已經(jīng)在存儲(chǔ)器內(nèi)相當(dāng)長(zhǎng)時(shí)間),因此使部分的寫(xiě)入不能被檢測(cè)。例如,如果使用重算的循環(huán)計(jì)數(shù),且如果它匹配存儲(chǔ)在頁(yè)面上的現(xiàn)有循環(huán)計(jì)數(shù),則不管是所有頁(yè)面還是某些頁(yè)面被復(fù)制,記號(hào)是一樣的??梢岳斫?,在此情況的記號(hào)校核將指出,整個(gè)頁(yè)面數(shù)據(jù)的保持,雖然事實(shí)不是。
此問(wèn)題能以許多方法解決。一個(gè)解決方法是在每次循環(huán)退回事件之后讀頁(yè)面一次,以驗(yàn)證是否存在不匹配。如果匹配,可以調(diào)節(jié)二個(gè)循環(huán)計(jì)數(shù)之一以避免匹配。為保證每次循環(huán)退回(即每次循環(huán)計(jì)數(shù)回到0)只發(fā)生一次上述情況,可使用單獨(dú)的驗(yàn)證位映象141保持每頁(yè)的“驗(yàn)證”狀態(tài),即每位是退回之后的一個(gè)狀態(tài),且當(dāng)頁(yè)面首次檢查循環(huán)計(jì)數(shù)匹配時(shí)作切換。注意,使用自由空間位圖跟蹤一頁(yè)是否為空閑或使用,且為有效起見(jiàn),上述解決方案將附加的位圖加到跟蹤驗(yàn)證狀態(tài)。
另選的解決辦法(對(duì)上述讀和比較操作)再次跟蹤驗(yàn)證狀態(tài),但是當(dāng)“驗(yàn)證”狀態(tài)是在頁(yè)面使用時(shí)設(shè)置,如上所述循環(huán)計(jì)數(shù)被寫(xiě)到頁(yè)面中,且強(qiáng)制寫(xiě)入。如果寫(xiě)入成功,則寫(xiě)入不是部分進(jìn)行。對(duì)大的TOPS流,由于較少的輸入/輸出I/O操作,此另選方法調(diào)節(jié)得很好,因?yàn)檠h(huán)計(jì)數(shù)匹配頁(yè)面的情況可能相對(duì)很少出現(xiàn)。
又一種另選的方法是結(jié)合檢查頁(yè)面駐留的首次兩種方法的組合,即如果頁(yè)面駐留在高速存儲(chǔ)器中,因?yàn)椴恍枰獙?shí)際上的讀盤(pán)而實(shí)現(xiàn)第一種(讀)另選方法,否則執(zhí)行第二種(寫(xiě))另選方法。
延遲的重做另選方法上述恢復(fù)機(jī)制將文件的臟頁(yè)在提交時(shí)刻寫(xiě)入盤(pán),防止在多個(gè)事務(wù)上成批頁(yè)寫(xiě)入。為達(dá)到在多個(gè)事務(wù)上成批頁(yè)寫(xiě)入,可提供一個(gè)另選的“延遲重做”方案,它在恢復(fù)的方面上做了相反工作。此方案將重做記錄寫(xiě)入日志,并當(dāng)沒(méi)有讀程序仍在讀它時(shí),將老的提交處理施加給基文件。為了支持老的提交的版本的讀,不在原位做出改變,而是當(dāng)現(xiàn)有的頁(yè)的原位版本不再需要時(shí),只能原位應(yīng)用到該文件。
延遲重做方案共享由原位更新方案使用的許多原則,例如,它以與版本控制塊和多個(gè)存儲(chǔ)器內(nèi)流十分類(lèi)似的方法支持做版本。但是,改變表保持重做頁(yè)面的LSN,而不是撤消的LSN。通常如圖14所示,最早的盤(pán)上的版本總是基文件,而較新的版本在其上建立增加的改變。當(dāng)讀程序離開(kāi)時(shí),較早的版本合并在基文件中。為了利用此方案主要優(yōu)點(diǎn),多個(gè)版本能同時(shí)合并到基文件中,因此獲得I/O效率。同時(shí)合并多個(gè)版本的另一優(yōu)點(diǎn)是在大的讀操作中日志能被有效地讀出。
但是,日志可以用頁(yè)面充填,它們返回存儲(chǔ)器用于(可能許多)活動(dòng)的文件,實(shí)質(zhì)將順序的日志調(diào)整到既作為恢復(fù)日志也是隨機(jī)頁(yè)面的文件中,這可能成為系統(tǒng)中的瓶頸。
類(lèi)似于原位更新方案,最新的版本是可更新的。存在一個(gè)版本控制塊(TxFVSCB)與每個(gè)版本相關(guān),且每個(gè)TxFVSCB指向改變表,這是一個(gè)記錄由該版本改變的頁(yè)面號(hào)的存儲(chǔ)器內(nèi)的表。盤(pán)地址可以與每個(gè)頁(yè)號(hào)一起存入,以便找出在盤(pán)上的頁(yè)面,只要它至少寫(xiě)入一次(重做映象)。缺少盤(pán)地址意味著該頁(yè)從未寫(xiě)入盤(pán)中。為了節(jié)省存儲(chǔ)器,頁(yè)范圍可存入一個(gè)項(xiàng)中,在這個(gè)范圍內(nèi)頁(yè)面連續(xù)地存在盤(pán)上。
版本LSN是提交該版本的事務(wù)的提交記錄的LSN。對(duì)當(dāng)前可更新的版本沒(méi)有這種LSN。SOP指針是指向?qū)?yīng)此版本的段對(duì)象指針結(jié)構(gòu)的指針。使用該指針,能找到該存儲(chǔ)器內(nèi)頁(yè)面。類(lèi)似地提供版本長(zhǎng)度。
版本控制塊以時(shí)間順序鏈接到表中。最早的版本是基流,而改變表不包含此版本的任何項(xiàng)。
在打開(kāi)時(shí)刻,如在上述另選方案,給予版本之一一個(gè)文件句柄。最新版本的存儲(chǔ)器內(nèi)流部分由日志返回(不是由基文件全部返回)。這樣,對(duì)流的改變寫(xiě)入日志。如果在版本窗的任何版本中該頁(yè)未改變,則從基文件完成讀,否則它們從日志中完成。
在讀的時(shí)候,查閱對(duì)應(yīng)于該版本的改變表,以判定在該版本中頁(yè)面是否被修改。若是,I/O對(duì)著日志中適當(dāng)?shù)奈恢靡匀∪朐擁?yè)面消除故障。若不是,則查閱該頁(yè)下一先前版本;此過(guò)程一直持續(xù)到找到該頁(yè)的最新提交的復(fù)制。如果多個(gè)版本包括該頁(yè)的復(fù)制,用VMM調(diào)用檢查它們的存儲(chǔ)器駐留內(nèi)容。如果找到存儲(chǔ)器駐留頁(yè),對(duì)其復(fù)制,否則使用最新版本的LSN從日志中將其讀出。注意,如果該頁(yè)是在駐留內(nèi)容被檢查和作出復(fù)制的時(shí)間之間從系統(tǒng)存儲(chǔ)器裁剪出,也沒(méi)有關(guān)系,因?yàn)楫a(chǎn)生遞歸的故障并且頁(yè)面在其后被復(fù)制。為了得到系統(tǒng)地址以復(fù)制這些頁(yè)面,使用高速緩存管理器映射它們到系統(tǒng)地址空間。
在圖14中示出四個(gè)版本V0-V3(但其他數(shù)目也可以),其中用“X”標(biāo)記的頁(yè)表示在版本中的改變。改變表1420-1423示出已寫(xiě)入頁(yè)面的LSN。在最近(可更新的)版本中的某些頁(yè)還未被寫(xiě)入。在此情況,考慮一個(gè)例子,其中FileObjectB訪(fǎng)問(wèn)頁(yè)面50(50)。對(duì)文件版本V1的改變表1421表示此頁(yè)在該版本中未被改變。因此,通過(guò)對(duì)該頁(yè)檢查文件版本V0的駐留內(nèi)容并若是駐留的(不出故障)將其復(fù)制,借此處理故障。如果文件版本V0沒(méi)有頁(yè)是駐留的,則將它從盤(pán)讀出(在此情況,從基文件讀出)。
作為另一個(gè)例子,如果FileObjectB訪(fǎng)問(wèn)頁(yè)面200(200),且該頁(yè)在存儲(chǔ)器內(nèi),訪(fǎng)問(wèn)很簡(jiǎn)單完成。但是如果不是,產(chǎn)生頁(yè)面故障,并通過(guò)從LSN 2500處的日志讀出它以達(dá)到讀的目的。
作為另一個(gè)例子,考慮FileObjectc訪(fǎng)問(wèn)頁(yè)面100(100)。因?yàn)樵擁?yè)面在版本V2沒(méi)有改變,檢查版本V1,且通過(guò)從存儲(chǔ)器映象(若是駐留的)或通過(guò)在LSN 2000讀出日志以滿(mǎn)足讀取。
對(duì)于文件寫(xiě),在頁(yè)調(diào)出的時(shí)刻,頁(yè)面以重做記錄的形式寫(xiě)到日志中,重寫(xiě)記錄也描述了流偏移和流名字。在此時(shí),LSN被標(biāo)記在對(duì)該版本的改變表的頁(yè)縫中。頁(yè)面寫(xiě)由一個(gè)系統(tǒng)線(xiàn)程在后臺(tái)中發(fā)生,并通常以順序頁(yè)面次序?qū)懭?。在提交時(shí)刻,在那個(gè)版本中的臟頁(yè)面被寫(xiě)入日志,隨后是一個(gè)提交記錄。如果在事務(wù)期間頁(yè)面被寫(xiě)出多次,則完成了多個(gè)日志寫(xiě)。這些寫(xiě)進(jìn)到日志的末端,且改變表項(xiàng)被改變成指向新的位置。如果新的寫(xiě)事務(wù)在提交之后開(kāi)始而沒(méi)有對(duì)讀事務(wù)有任何干涉,主存儲(chǔ)器流被新事務(wù)再使用。否則,就由讀程序?qū)ζ渖暾?qǐng),而寫(xiě)程序事務(wù)建立新的流來(lái)工作。注意,在延遲重做方案中,改變的頁(yè)面能寫(xiě)到TOPS的流(就象原地更新方案)以得到有關(guān)的好處。
在系統(tǒng)崩潰后,恢復(fù)是相對(duì)直接的,因?yàn)樘峤皇聞?wù)的重做信息在日志中,并能簡(jiǎn)單地加到主數(shù)據(jù)流。注意,版本控制塊是存儲(chǔ)器內(nèi)結(jié)構(gòu),因而在恢復(fù)時(shí)刻不存在。
當(dāng)老的讀程序結(jié)束它們的事務(wù)時(shí),老版本不再需要保存。在此時(shí),版本從最老的開(kāi)始以每次一個(gè)版本的方式合并到主流中。因?yàn)榘姹颈缓喜?,就從版本的鏈接表把它們?nèi)コ?。通過(guò)將那個(gè)版本中的改變頁(yè)面(在改變表中查找的頁(yè)號(hào))復(fù)制到基流并強(qiáng)制到盤(pán)中,以每次一頁(yè)方式發(fā)生合并。此復(fù)制操作讀出不是當(dāng)前駐留的頁(yè)面的日志。若可能,執(zhí)行大量的I/O操作以從日志捕獲頁(yè)面范圍。如在圖14中,如果版本V0不再需要支持做版本,版本V1就合并到版本V0中。此合并能發(fā)生而不必鎖定版本V1,因?yàn)楫?dāng)合并進(jìn)行時(shí)每個(gè)頁(yè)面的副本存在于版本V1和版本V0中,而對(duì)V1的改變表在整個(gè)過(guò)程中不變。
當(dāng)合并完成以后,若版本V1不在版本窗中,V1的版本控制塊簡(jiǎn)單地從版本表中除去。通常,合并將延遲直到從讀程序釋放多個(gè)版本。在本例中,V0、V1和V2在它們離開(kāi)版本窗時(shí)能一起合并到基文件中。對(duì)多版本的合并,改變表首先以這種方式合并當(dāng)在多個(gè)表中同樣的項(xiàng)被修改時(shí),從最高版本號(hào)來(lái)的LSN先挑選出來(lái)。這實(shí)質(zhì)是在各事務(wù)之間將寫(xiě)分批,這是此方案的一個(gè)優(yōu)點(diǎn)。在一個(gè)版本被合并以后,其日志記錄適當(dāng)?shù)貜幕顒?dòng)的日志中去除。
通常,合并應(yīng)盡可能早做。每當(dāng)寫(xiě)程序離開(kāi)時(shí),版本窗前移。那時(shí),某些版本標(biāo)記為適合于合并。當(dāng)標(biāo)記了多個(gè)版本,一個(gè)工作項(xiàng)放在系統(tǒng)線(xiàn)程上以進(jìn)行合并。
原地更新方案和延遲重做方案都執(zhí)行差不多相同數(shù)量的I/O。原地更新方案可以同步地讀撤消命令(因?yàn)橛袝r(shí)可以在存儲(chǔ)器中找到它,例如如果并發(fā)的讀程序最近在讀它們)。原地更新方案將頁(yè)面寫(xiě)出到基文件,并還將撤消順序地寫(xiě)到日志中。相反,延遲重做方案需要將重做寫(xiě)入大的隨機(jī)I/O,且需要隨機(jī)地讀日志以便合并一版本。此外,延遲讀方案需要將文件頁(yè)寫(xiě)到盤(pán)上,雖然它使各版本上的寫(xiě)最小。在存儲(chǔ)器中尋找這些日志頁(yè)面的機(jī)會(huì)因此是非常低,給出了合并可能延遲多長(zhǎng)時(shí)間。
在何時(shí)何地完成I/O方面有性質(zhì)上的差別。在延遲重做方案中,最新的存儲(chǔ)器流由日志返回,而不是基文件。這很可能是最經(jīng)常使用的流,因?yàn)樗幚砀鹿ぷ?,比較地加重日志的負(fù)擔(dān)。對(duì)于已成版本的讀程序,兩種方案使用日志作為分頁(yè)設(shè)備。
延遲重做方案與提交處理較少同步工作,因?yàn)榇罅康氖聞?wù)工作在后臺(tái)完成,但是對(duì)每次寫(xiě)API或存儲(chǔ)器更新的寫(xiě)程序沒(méi)有顯出更快,因?yàn)檫@些在高速緩存中完成。相反,在提交時(shí)刻的刷新是在提交的響應(yīng)性方面的差別顯示增加處。對(duì)較大的更新事務(wù),后臺(tái)系統(tǒng)線(xiàn)程看來(lái)調(diào)度異步的寫(xiě),它有時(shí)減少響應(yīng)性的差別。類(lèi)似地,原地更新方案也能通過(guò)在后臺(tái)中完成對(duì)文件API的撤消工作而減輕在提交時(shí)的負(fù)擔(dān),但對(duì)在用戶(hù)映射段中作出的改變是不可行的。
原地更新方案比延遲重做方案簡(jiǎn)單,因?yàn)樵馗路桨覆恍枰幚碚{(diào)度異步合并操作的問(wèn)題。而且,原地更新方案不需要處理在前臺(tái)和后臺(tái)活動(dòng)之間的速度不匹配問(wèn)題,這有時(shí)可能阻礙日志空間并產(chǎn)生資源獲取問(wèn)題。
最后,用延遲重做方案不必改變正常運(yùn)行記錄算法,就可能存檔及向前退回,因?yàn)樵谌罩局兄刈鲇涗浭强傻玫降?。但是,因?yàn)闆](méi)有撤消記錄,需要執(zhí)行對(duì)日志中的某些前向掃描,以便在對(duì)該事務(wù)應(yīng)用任何重做之前找出事務(wù)的提交狀態(tài)。
在網(wǎng)上的文件系統(tǒng)事務(wù)通常如圖15所示,通過(guò)內(nèi)部核心到核心的“重定向程序”協(xié)議(如SMB協(xié)議)來(lái)訪(fǎng)問(wèn)遠(yuǎn)程文件。此協(xié)議反映了在如文件服務(wù)器之類(lèi)的遠(yuǎn)程機(jī)器148上的客戶(hù)機(jī)146上執(zhí)行的文件系統(tǒng)操作。當(dāng)然,其他協(xié)議和機(jī)制(如Wev DAV、NFS等)能得到等效的結(jié)果。所以,如非事務(wù)文件系統(tǒng)訪(fǎng)問(wèn)那樣,遠(yuǎn)程文件被識(shí)別,并且IRP指向在客戶(hù)機(jī)器146上的重定向程序文件系統(tǒng)驅(qū)動(dòng)程序150。已經(jīng)知道,此驅(qū)動(dòng)程序150與客戶(hù)機(jī)的高速緩存對(duì)接以讀和寫(xiě)數(shù)據(jù)。如從針對(duì)遠(yuǎn)程機(jī)器的文件系統(tǒng)154的應(yīng)用程序152來(lái)的文件系統(tǒng)請(qǐng)求(如訪(fǎng)問(wèn)在遠(yuǎn)程盤(pán)156上的文件G/Fname)之類(lèi)的請(qǐng)求被重定向程序驅(qū)動(dòng)程序150截取,并發(fā)送到遠(yuǎn)程機(jī)器148,在遠(yuǎn)程機(jī)器148,代理程序158(數(shù)據(jù)自適應(yīng)鑒定監(jiān)視器(daemon))線(xiàn)程將它們翻譯成在驅(qū)動(dòng)程序堆頂層的文件系統(tǒng)操作。
對(duì)遠(yuǎn)程事務(wù)文件系統(tǒng)操作,為打開(kāi)文件,客戶(hù)重定向程序能,例如,使用COM/OLE將DTC事務(wù)對(duì)象160c編排到統(tǒng)一的字節(jié)流中,具有給服務(wù)器148的打開(kāi)請(qǐng)求。可以看到,其他機(jī)制能達(dá)到等效的功能和/或結(jié)果,且雖然這里描述COM/OLE操作,本發(fā)明的這方面不限于COM/OLE。在COM/OLE實(shí)例中,事務(wù)對(duì)象160c附著于請(qǐng)求打開(kāi)的客戶(hù)線(xiàn)程。注意,服務(wù)器機(jī)器148不關(guān)心事務(wù)在哪里開(kāi)始的,只要它能將DTC事務(wù)對(duì)象160s的副本保持在其核心空間中。類(lèi)似地,服務(wù)器148不在乎哪個(gè)線(xiàn)程或過(guò)程代表該事務(wù)工作。而是,在服務(wù)器148處的代理程序158將統(tǒng)一的字節(jié)流轉(zhuǎn)回到在核心中可得到的可用對(duì)象。此時(shí),服務(wù)器把請(qǐng)求當(dāng)作本地事務(wù)160s,并用在服務(wù)器上的副本DTC代理162s支持它,主要是告訴DTC為了后續(xù)的事務(wù)工作與服務(wù)器148聯(lián)系(而在這里TxF部件164作為資源管理器)。注意,因?yàn)榉?wù)器擁有此事務(wù)對(duì)象160s,因此,這是合適的。因?yàn)槭聞?wù)-ID處在分布式名字空間中,事務(wù)能在任何地方開(kāi)始,但是基于事務(wù)-id的正確文件同步發(fā)生在服務(wù)器148上。
服務(wù)器實(shí)際上將文件系統(tǒng)請(qǐng)求當(dāng)作就像是在本地情況的請(qǐng)求,而本地的TxF部件164處理事務(wù)的文件系統(tǒng)請(qǐng)求。但是,服務(wù)器148必須記住對(duì)應(yīng)的文件對(duì)象是針對(duì)被客戶(hù)146打開(kāi)的文件,且該客戶(hù)具有高速緩存頁(yè)面。因此,在提交時(shí)刻,服務(wù)器148通知(通過(guò)重定向程序協(xié)議)客戶(hù)146刷新其高速緩存到服務(wù)器,并刷新任何能在客戶(hù)處打開(kāi)的映射段(映射段的客戶(hù)跟蹤)。數(shù)據(jù)正常地以某些惰性方式(1azy fashion)到達(dá)服務(wù)器148,即每當(dāng)它分頁(yè)出客戶(hù)的高速緩存/存儲(chǔ)器時(shí)到達(dá)。當(dāng)數(shù)據(jù)到達(dá)時(shí),它改寫(xiě)在服務(wù)器上的高速緩存的副本。注意,這類(lèi)似于以前的文件系統(tǒng)模型,其中多重打開(kāi)的句柄或映射段互相改寫(xiě)。
對(duì)基于重定向的文件建立操作,上述概念也能用于在網(wǎng)上編排ITransaction,在所述概念中用戶(hù)模式中的CreateFileEx將ITransaction對(duì)象編排(如通過(guò)DTC ItransactionTransmitter方法)到統(tǒng)一的字節(jié)集。因?yàn)樵贗TransactionTransmitter調(diào)用中不需要與事務(wù)管理器進(jìn)行通信,其花費(fèi)相對(duì)較少,因此對(duì)每次建立都能完成。但是,接收調(diào)用(如上述)確實(shí)需要與事務(wù)協(xié)調(diào)程序(或它的代理)通信,在基于重定向程序的情況,該程序是在遠(yuǎn)程機(jī)器148上。然而,因?yàn)閷?duì)于在整個(gè)網(wǎng)絡(luò)中每個(gè)事務(wù),ITransactionReceiver只做一次(在服務(wù)器148上),所以與事務(wù)協(xié)調(diào)程序162s的開(kāi)銷(xiāo)并不明顯。
在此方式中,透明地支持事務(wù)的遠(yuǎn)程文件訪(fǎng)問(wèn),即,使用遠(yuǎn)程文件訪(fǎng)問(wèn),并通過(guò)在多個(gè)機(jī)器上建立應(yīng)用程序代理,應(yīng)用程序?qū)嶋H上能直接訪(fǎng)問(wèn)網(wǎng)絡(luò)上任何處的文件。因此,同一事務(wù)能在同時(shí)涉及一個(gè)或多個(gè)本地過(guò)程及遠(yuǎn)程過(guò)程。
對(duì)于單個(gè)客戶(hù)具有一個(gè)為遠(yuǎn)程訪(fǎng)問(wèn)打開(kāi)的文件的情況,通常可以?xún)?yōu)化重定向程序協(xié)議。在這種情況,通過(guò)保持該文件的本地盤(pán)高速緩存而避免了大量的網(wǎng)絡(luò)數(shù)據(jù)傳輸。僅當(dāng)需要時(shí)(即文件關(guān)閉時(shí)),才刷新改變。但是一旦另一客戶(hù)同時(shí)打開(kāi)同一文件時(shí),這樣的安排是無(wú)效的。機(jī)會(huì)主義的鎖定(oplock,主要是指示所有權(quán)的令牌)可完成此事,從而對(duì)上面的“關(guān)閉時(shí)更新”方案的改變最小。尤其是,在提交時(shí)刻,通常詢(xún)問(wèn)客戶(hù)是否將改變刷新到服務(wù)器上去。在中斷時(shí)刻,客戶(hù)請(qǐng)求將客戶(hù)句柄標(biāo)記成“毀滅的(doomed)”,使得一旦該句柄關(guān)閉,改變將簡(jiǎn)單地丟棄。注意,重定向程序協(xié)議可以增強(qiáng),使得服務(wù)器在某些環(huán)境讓客戶(hù)映射段無(wú)效,如同在本地情況。
名字空間隔離將一個(gè)事務(wù)的變化與其他事務(wù)隔離是事務(wù)的關(guān)鍵特性。在事務(wù)文件系統(tǒng)中,隔離不僅施加到存在文件中的數(shù)據(jù)(如上述),還施加到文件名和文件組織下的目錄名的層次,按本發(fā)明的另外方面,提供了在文件/目錄名層次內(nèi)實(shí)現(xiàn)名字空間隔離的技術(shù)。該技術(shù)不需要在事務(wù)處理期間鎖定名字或目錄,并能與試圖用在事務(wù)中的文件上的非事務(wù)操作工作。
作為例子,考慮由事務(wù)建立而未被提交的文件。注意,可以建立目錄而不單是文件,但為簡(jiǎn)單起見(jiàn),本發(fā)明主要關(guān)于文件討論。然而應(yīng)該理解,關(guān)于下面敘述的名字空間操作,通常能等效地處理文件與目錄。事務(wù)建立的文件(或目錄)應(yīng)能用于沒(méi)有限制地建立事務(wù),但應(yīng)不能為其他事務(wù)(如試圖打開(kāi)它或列出其父目錄的事務(wù))可視。僅當(dāng)建立的事務(wù)提交時(shí),該文件才能被其他事務(wù)看到,若它中斷了,則該文件對(duì)任何人都不可見(jiàn)。非事務(wù)(如請(qǐng)求父目錄列舉)將看到這種文件,或者,使這種文件在提交前對(duì)非事務(wù)不可見(jiàn)也是可能的。
類(lèi)似地,若文件(或目錄)被尚未提交的事務(wù)刪除,被刪文件需要繼續(xù)對(duì)其他事務(wù)可訪(fǎng)問(wèn),就像在提交時(shí)刻以前此刪除從未發(fā)生。但是,刪除事務(wù)將看到刪除的效果,并能夠在其空間中用相同的名字建立不同的文件。提交以后,被刪除的文件被去除。非事務(wù)將看到刪除的效果,即看不到被刪的文件,但非事務(wù)不能建立帶有與由非提交事務(wù)所刪除的文件有同樣名字的新文件,以避免由于刪除文件/目錄的事務(wù)中斷或刪除撤消而產(chǎn)生沖突。而且還可以將非事務(wù)當(dāng)作好象是不同的事務(wù)進(jìn)行處理,因而繼續(xù)看到被事務(wù)刪除的文件,但這并不是很好。
此外,如果文件(或目錄)被事務(wù)改名,對(duì)其他事務(wù)繼續(xù)可用具有原始目錄中的原始名字的該文件,新名字對(duì)其他事務(wù)不可見(jiàn)。做改名的事務(wù)將看到改名的效果,且可以使用老名字建立不同的文件。注意改名本質(zhì)上是建立新鏈接和刪除老的鏈接的組合。
為完成名字空間的隔離以處理上述情況,本發(fā)明保存名字空間的狀態(tài)以在事務(wù)處理期間為其他事務(wù)所用。為此,如圖16-18所示,建立稱(chēng)為隔離目錄1701-1704的各個(gè)目錄,并將其鏈接到由執(zhí)行名字空間操作的事務(wù)改變的對(duì)應(yīng)NTFS目錄。尤其是,每個(gè)隔離目錄(如1701)包括與父目錄(如目錄D3)的TxFSCB結(jié)構(gòu)有關(guān)的搜索結(jié)構(gòu)(如二進(jìn)制搜索樹(shù))。此外,隔離目錄搜索結(jié)構(gòu),并且有關(guān)的處理例行程序包括支持增加一個(gè)項(xiàng)及用名字快速查找一個(gè)項(xiàng)的通用接口,且還支持目錄列舉算法。
這些隔離目錄包括受使名字空間改變的事務(wù)影響的各個(gè)名字,并且只是主存儲(chǔ)器結(jié)構(gòu)。結(jié)構(gòu)中的每個(gè)項(xiàng)還包括與該名字相關(guān)的事務(wù)ID(Tid),和可見(jiàn)性配置,它有兩個(gè)標(biāo)志,對(duì)事務(wù)Tid可見(jiàn),或?qū)ζ渌聞?wù)可見(jiàn)。這些可見(jiàn)性標(biāo)志中的一個(gè)或兩個(gè)都可以分別設(shè)置。隔離目錄結(jié)構(gòu)還包括短名字/長(zhǎng)名字標(biāo)志,其中如果一個(gè)配對(duì)可用,該結(jié)構(gòu)包括指向?qū)?yīng)于該配對(duì)名字的結(jié)構(gòu)的指針。還提供一個(gè)標(biāo)志指出名字由Tid保持,而其他事務(wù)不能請(qǐng)求它;一個(gè)Fid(用于對(duì)刪除的和改名的名字重定向建立());和其他信息,即NTFS復(fù)制信息如時(shí)間標(biāo)記和用于目錄列舉的類(lèi)似標(biāo)記。為了空間使用效率,結(jié)構(gòu)可以分成名字,指向該信息的指針,指向其他名字的指針,和其他信息。這導(dǎo)致單組其他信息被兩個(gè)名字共享。
作為隔離目錄如何使用的例子,如圖16所示,如果文件F3被事務(wù)T1刪除,文件F3的名字和各種信息在名字從NTFS目錄D3去除(幾乎)同時(shí)被加到隔離目錄1701。注意,為了刪除NTFS中的文件,打開(kāi)文件被標(biāo)記為刪除,文件系統(tǒng)關(guān)閉該文件而維持打開(kāi)句柄的計(jì)數(shù),并當(dāng)沒(méi)有句柄保持打開(kāi)時(shí)執(zhí)行刪除操作。此外注意,隔離目錄1701可能由于此事務(wù)T1的或另外事務(wù)(如T2)更早的操作已經(jīng)存在,或者在需要支持此刪除操作時(shí)建立。下面參考圖19的流程圖來(lái)進(jìn)一步描述刪除操作。
使用隔離目錄1701來(lái)處理由不同事務(wù)(例如T2)對(duì)該文件F3的后續(xù)訪(fǎng)問(wèn),這樣,事務(wù)T2將繼續(xù)看見(jiàn)文件F3。然而,如果刪除文件F3的同一事務(wù)T1(或非事務(wù))查找文件F3,它將不能找到該文件。為了處理這些情況,如上所述,為此文件維持該文件的名字、其可見(jiàn)性配置、刪除文件的事務(wù)ID、重定向文件的ID、$TxF文件標(biāo)識(shí)符(例如,單調(diào)增加序號(hào))和復(fù)制的信息(數(shù)據(jù)標(biāo)記、大小、屬性)。
圖19提供了處理對(duì)打開(kāi)文件刪除請(qǐng)求的通用邏輯表示。注意圖19和類(lèi)似的流程圖針對(duì)提供如何使用隔離目錄的理解進(jìn)行了簡(jiǎn)化,并且不應(yīng)認(rèn)為是基礎(chǔ)代碼的精確表示,并沒(méi)有包括特別情況、差錯(cuò)處理等等。在任何情況,在步驟1900開(kāi)始,在事務(wù)處理及非事務(wù)處理請(qǐng)求實(shí)體之間作出區(qū)分,因?yàn)槭聞?wù)處理的用戶(hù)將導(dǎo)致不同于非事務(wù)處理的用戶(hù)的刪除操作的操作。如果非事務(wù)請(qǐng)求刪除一個(gè)文件(由其句柄識(shí)別),刪除以另外的正常方式執(zhí)行,即在步驟1902指定的文件從盤(pán)中被刪除。當(dāng)最后的句柄關(guān)閉時(shí)刪除開(kāi)始。
若事務(wù)(如Tid1)在步驟1900請(qǐng)求刪除,則執(zhí)行步驟1904,它主要是改名文件。例如,如圖16所示,具有任意名(如“0”)的鏈接加到隱含的目錄168($TxF),它鏈接到在主文件表130(圖11)中的文件記錄。同時(shí),來(lái)自刪除的文件F3的鏈接從父目錄D3中去除。
然后在步驟1906,刪除信息被記錄到刪除記錄中,即文件名F3,對(duì)原始父目錄和新的鏈接信息的參考,如果在刪除該文件的事務(wù)提交以前系統(tǒng)崩潰,該事務(wù)將中斷,而日志通過(guò)簡(jiǎn)單地如上述改名,即通過(guò)恢復(fù)以前的鏈接($TxF目錄沒(méi)有了,因?yàn)樗谴鎯?chǔ)器內(nèi)結(jié)構(gòu))正確地恢復(fù)該文件。
按照本發(fā)明,該文件信息隨后加到與正常目錄D3鏈接的隔離目錄樹(shù)1701。隔離目錄樹(shù)1701可能與正常目錄相關(guān)地已經(jīng)存在,但若沒(méi)有,就建立它。執(zhí)行步驟1910適當(dāng)?shù)卣{(diào)節(jié)可見(jiàn)性配置標(biāo)志以指出該事務(wù)Tid1已請(qǐng)求刪除此文件,所以此文件對(duì)其他事務(wù)仍可見(jiàn),但對(duì)Tid1不可見(jiàn)。在步驟1912,任意命名的鏈接被加到隨后將從盤(pán)刪除(在事務(wù)提交以后)的文件表中。
當(dāng)事務(wù)終止時(shí),對(duì)應(yīng)于該事務(wù)的名字項(xiàng)從隔離目錄中去除,而當(dāng)隔離目錄中不存在任何項(xiàng)時(shí),將將隔離目錄刪除。注意,若系統(tǒng)崩潰,存儲(chǔ)器內(nèi)結(jié)構(gòu)的隔離目錄就丟失。但是,因?yàn)橄到y(tǒng)崩潰中斷了未提交的事務(wù),隔離目錄不再需要隔離,而日志文件的打開(kāi)合適地復(fù)位了文件的狀態(tài)。
文件的建立有些類(lèi)似于刪除,當(dāng)文件由一個(gè)事務(wù)(如Tid2)在一個(gè)目錄中建立時(shí),名字實(shí)際上加到鏈接(父)NTFS目錄的隔離目錄中。對(duì)其他事務(wù),由于為打開(kāi)該文件所作的可見(jiàn)性標(biāo)志設(shè)置,或在事務(wù)提交之前列出其父NTFS目錄時(shí),該文件名字被濾掉。對(duì)Tid2和非事務(wù),建立的文件在其被提交前是可見(jiàn)的。
命名的項(xiàng)在其加入以后可以被事務(wù)修改。例如,若一個(gè)文件被刪除且另一文件使用同樣名字建立,建立將修改項(xiàng)的狀態(tài),這樣其他事務(wù)將繼續(xù)看到在刪除前存在的文件,但此事務(wù)將看到它剛建立的文件。注意,在NTFS或隔離目錄上沒(méi)有保持將事務(wù)級(jí)鎖定。這使得系統(tǒng)還保持基文件系統(tǒng)的同時(shí)性。
如圖18所示,若事務(wù)Tid2建立文件F6(在正常的父目錄內(nèi)請(qǐng)求建立),則F6在目錄D4中建立,且因而一個(gè)項(xiàng)加到父目錄D4相關(guān)的隔離目錄1702。如需要,建立隔離目錄1702。適當(dāng)?shù)卣{(diào)節(jié)標(biāo)志以反映Tid2建立的狀態(tài)(即對(duì)Tid2可見(jiàn)但對(duì)其他事務(wù)不可見(jiàn))以及對(duì)Tid2保存的名字。注意,事務(wù)Tid2在提交以前也能刪除新建立的文件F6,在這種情況它將不能被Tid2及其他事務(wù)看到。處理這種建立-然后-刪除操作的一個(gè)方法是從目錄D4去除該項(xiàng)和從隔離目錄1702去除該項(xiàng)。另外方法是將該項(xiàng)留在隔離目錄1702中,而它的配置標(biāo)志(disposition flag)設(shè)置成對(duì)創(chuàng)建該文件的Tid2及其他事務(wù)均不可見(jiàn),這樣防止在Tid2提交或中斷前該文件名被其他事務(wù)使用。
回到典型的情況,其中F6被事務(wù)Tid2建立但未被刪除,當(dāng)(且如果)事務(wù)Tid2提交或中斷,隔離的項(xiàng)從隔離目錄1702去除,從而使得被建立的文件F6在提交的情況對(duì)所有事務(wù)均可見(jiàn)。如果事務(wù)T2中斷,該文件從正常NTFS目錄D4刪除。每個(gè)隔離的項(xiàng)保留直到與其相關(guān)的事務(wù)結(jié)束,且在提交或或中斷時(shí)被去除。為便于去除,每個(gè)事務(wù)保留一個(gè)TxFSCB指針表,其中該事務(wù)至少具有一個(gè)這種項(xiàng)。事務(wù)還在每個(gè)TxFSCB上適當(dāng)?shù)卦黾雍蜏p少參照計(jì)數(shù),使得TxFSCB被使用它們的事務(wù)所掌握。
圖20提供處理對(duì)建立一個(gè)文件的請(qǐng)求的通用邏輯的表示,其中請(qǐng)求是New_File_Create(請(qǐng)求的類(lèi)型是若文件帶有與已經(jīng)存在文件相同的文件名,則不允許建立)。在步驟2000開(kāi)始,執(zhí)行測(cè)試以確定該文件名(如圖17的F6)是否已出現(xiàn)在正常的父目錄中,如父目錄D4。若是,文件不能建立,且在步驟2000轉(zhuǎn)移到步驟2002,返回一個(gè)錯(cuò)誤,若在父目錄D4中未找到文件F6,有可能該文件名已經(jīng)被事務(wù)使用。為測(cè)試這點(diǎn),步驟2000轉(zhuǎn)移到步驟2004,其中搜索與D4有關(guān)的隔離目錄1702以尋找此文件名。若此文件F6(或隔離目錄)的項(xiàng)不存在,步驟2004轉(zhuǎn)移到步驟2006,在那里作出判斷是否事務(wù)正請(qǐng)求建立,或者是非事務(wù)請(qǐng)求。若非事務(wù)在請(qǐng)求,步驟2006轉(zhuǎn)移到步驟2018,其中文件在正常目錄D4中建立。否則,事務(wù)(如Tid2)請(qǐng)求建立,執(zhí)行步驟2010,從而將一個(gè)項(xiàng)加到隔離目錄1702(若對(duì)父目錄中不存在什么,則在建立隔離目錄1702之后)。然后步驟2014表示合適的標(biāo)志設(shè)置,對(duì)此項(xiàng)獲得其他信息等。步驟2014隨后延續(xù)到步驟2018,其中文件F6在正常目錄D4中實(shí)際建立。注意,在NTFS中,在建立時(shí)定位文件,在主文件表中對(duì)此文件建立文件記錄,且建立記錄加到日志中。
在步驟2004,如果在隔離目錄1702找到此名字,則不允許建立,除非該指定的文件被正請(qǐng)求建立的同一Tid(如Tid2)刪除。以此方式,一個(gè)事務(wù)可以建立它所刪除的文件,但在建立和/或刪除該文件的事務(wù)提交或中斷之前,其他事務(wù)或非事務(wù)均不能使用該文件名。若找到,執(zhí)行步驟2012以測(cè)試標(biāo)志狀態(tài),判斷同一事務(wù)是否正請(qǐng)求建立。若是,步驟2012轉(zhuǎn)移到步驟2014以改變對(duì)此項(xiàng)的標(biāo)志狀態(tài),實(shí)質(zhì)上現(xiàn)在表示“由Tid2建立”(對(duì)Tid2可見(jiàn),對(duì)其他不可見(jiàn))而非“由Tid2刪除”(對(duì)Tid2不可見(jiàn),對(duì)其他可能可見(jiàn))。若另一事務(wù)或非事務(wù)請(qǐng)求建立,步驟2012轉(zhuǎn)移到步驟2016返回一個(gè)錯(cuò)誤,指出一個(gè)事務(wù)保留此文件名。
圖18表示事務(wù)文件改名操作,它本質(zhì)上是建立鏈接請(qǐng)求和刪除鏈接請(qǐng)求的組合。因此,若事務(wù)T1將文件“\D2\D3\F2”改名成“\D2\D3\D4\F7”,則鏈接F2從目錄D3被刪除,并在目錄D4中建立鏈接F7。但是,因?yàn)樵诟拿猩婕暗绞聞?wù),在合適的隔離目錄1703和1704中反映這些操作。注意,文件可以在同一父目錄內(nèi)改名,或使文件改名而在不同的目錄中具有相同文件名。
按照本發(fā)明,對(duì)文件的事務(wù)處理改名,提供涉及改名的每個(gè)父目錄的隔離目錄,例如一個(gè)指出事務(wù)的刪除操作,一個(gè)指出事務(wù)的建立操作。注意,在同一父目錄中的改名只需要一個(gè)隔離目錄,一個(gè)項(xiàng)用于老文件的刪除,一個(gè)用于新文件的建立。如上述從圖19(刪除)和20(建立)能理解,其他事務(wù)仍看到該文件,好象文件仍未改名,而在事務(wù)提交之前看不到改名后的文件。如果事務(wù)中斷,其他事務(wù)將看不到任何表示曾經(jīng)發(fā)生過(guò)改名的跡象,除了可能看到,使用中的文件名在該事務(wù)的活動(dòng)周期暫時(shí)被保留。
最后,圖21-22表示例如在試圖打開(kāi)文件或獲得其文件信息(如作為列舉的一部分)時(shí),一個(gè)事務(wù)是否將看到指定的文件,這取決于文件的狀態(tài)。步驟2100表示對(duì)文件是否在正常目錄中的測(cè)試。若是,需要搜索隔離目錄(如果存在),尋找該文件的項(xiàng),以確定該文件對(duì)請(qǐng)求者是否可見(jiàn)(步驟2102)。如不在正常目錄中,文件有可能被正在進(jìn)行的事務(wù)從正常目錄中刪除,這在下面圖22中處理。
若該文件在正常目錄中(步驟2100),而該文件的項(xiàng)不在隔離目錄中,步驟2102,則它是普通可訪(fǎng)問(wèn)的文件,即它還未由沒(méi)有提交的事務(wù)建立。若是這樣,文件系統(tǒng)將好象在事務(wù)以前其已創(chuàng)建操作(由步驟2104表示),即可返回文件句柄(如在文件打開(kāi)請(qǐng)求的情況),或文件信息可以從主文件表中的信息返回(如在列舉請(qǐng)求的情況)。
若該文件的一個(gè)項(xiàng)在隔離目錄樹(shù)中,它必須由進(jìn)行的事務(wù)建立,而步驟2102轉(zhuǎn)移到2106,在那執(zhí)行測(cè)試,判斷建立文件的事務(wù)是否為正請(qǐng)求訪(fǎng)問(wèn)或請(qǐng)求信息的同一事務(wù)。若是,步驟2106轉(zhuǎn)移到2108,測(cè)試可見(jiàn)性配置標(biāo)志(是否對(duì)此Tid可見(jiàn))。若可見(jiàn),則返回文件句柄(或文件信息)給請(qǐng)求的事務(wù)(步驟2110)。注意,在這里的實(shí)現(xiàn)中,應(yīng)該不是文件在正常目錄且項(xiàng)在隔離目錄中的情況,(因?yàn)槭怯墒聞?wù)建立),但標(biāo)志指出,該文件應(yīng)對(duì)建立它的事務(wù)不可見(jiàn)。因此,在這里的實(shí)施中,步驟2108的測(cè)試基本上是不必要的,除非用于檢測(cè)正常和/或隔離目錄的破壞等。
若文件的一個(gè)項(xiàng)在正常目錄(步驟2100)及隔離目錄樹(shù)(步驟2102)中,但步驟2106判定,同樣的事務(wù)未作出請(qǐng)求,則在本實(shí)現(xiàn)中,文件在步驟2114中可以是或可以不是可見(jiàn)的。若不可見(jiàn),除非其他事務(wù)請(qǐng)求的部分是使用文件名,否則步驟2116可認(rèn)為該文件未找到,返回指出該文件被其他事務(wù)使用的錯(cuò)誤信息。例如,若找不到指定文件,試圖建立新文件的這種打開(kāi)文件請(qǐng)求類(lèi)型將失敗,因?yàn)槊直皇褂?。若在步驟2114為其他事務(wù)可見(jiàn)(文件刪除后被建立),使用重定向Fid從$TxF目錄打開(kāi)被刪除的文件(步驟2118)。
圖22處理文件不在正常目錄中的情況。若一個(gè)尚未提交或中斷的事務(wù)已刪除一個(gè)文件,對(duì)該文件的項(xiàng)將在隔離目錄中,而那個(gè)事務(wù)不能看見(jiàn)該文件,但其他事務(wù)能看見(jiàn)。步驟2200測(cè)試,對(duì)該文件的項(xiàng)是否不在該隔離目錄中(由圖21的步驟2100不在正常目錄中),若不在,在步驟2202該文件找不到并相應(yīng)地處理。
若相反,在步驟2200中該名字出現(xiàn)在隔離目錄中,則事務(wù)已刪除它。步驟2204測(cè)試是否刪除該文件的同一事務(wù)在請(qǐng)求訪(fǎng)問(wèn)該文件(或請(qǐng)求其信息)。如果是,在步驟2212文件對(duì)刪除其的事務(wù)是不可見(jiàn)的,并且這樣存在沒(méi)有找到的狀態(tài)(步驟2206)。注意如果由于某些原因,該文件對(duì)事務(wù)可見(jiàn),則將存在錯(cuò)誤。
如果在步驟2204與刪除該文件不同的事務(wù)請(qǐng)求對(duì)該文件的訪(fǎng)問(wèn)(或其信息)。如果如在隨后的步驟2212所測(cè)試的文件對(duì)其他事務(wù)可見(jiàn)的話(huà),步驟2214返回該文件的句柄,或文件信息(從保存的文件ID,或如下所述的Fid,包括復(fù)制的信息)。
另一種可能性是一個(gè)進(jìn)行的事務(wù)建立并隨后刪除一個(gè)文件,因而該文件不在正常的目錄中。如上所述,文件名或者處理成為其他事務(wù)可用,或?yàn)檫M(jìn)行的事務(wù)保留,直到該事務(wù)提交或中斷。對(duì)于前者,可以通過(guò)在建立文件的事務(wù)刪除它時(shí),簡(jiǎn)單地將該文件的項(xiàng)從正常目錄及隔離目錄中去除未實(shí)現(xiàn);注意,若這種文件項(xiàng)從隔離目錄中去除,則將不達(dá)到步驟2212。對(duì)于后者,可以通過(guò)在刪除時(shí)將文件從正常目錄中去除而將該文件的項(xiàng)留在隔離目錄,并設(shè)置標(biāo)志指出對(duì)任何事務(wù)都不可見(jiàn)來(lái)實(shí)現(xiàn)??梢岳斫?,這是可能的,因?yàn)榭梢?jiàn)性配置標(biāo)志是獨(dú)立設(shè)置的(即它們不是互相排斥的)。但是,如果文件留在隔離目錄中并標(biāo)記為對(duì)其他事務(wù)(和對(duì)建立它的事務(wù))不可見(jiàn),則在步驟2216存在找不到文件的狀態(tài),但文件名為進(jìn)行的事務(wù)保留。
在此方式中,本發(fā)明方便了整理搜索,如使用NTFS調(diào)整規(guī)則和NTFS例行程序以調(diào)整次序?qū)ふ蚁乱粋€(gè)名字。本發(fā)明在空間方面是有效的,并允許并發(fā)的讀/寫(xiě)訪(fǎng)問(wèn)。
注意,出于它看到或看不到的目的,非事務(wù)僅看到在正常目錄中的內(nèi)容。但是對(duì)于使用現(xiàn)有的文件名的目的,非事務(wù)不能使用為事務(wù)保留的文件名。為此,當(dāng)非事務(wù)試圖建立具有在正常目錄中不存在的名字的文件時(shí),如上所述檢查隔離目錄。
考慮到上面例子和描述,下面例子示出事務(wù)如何使用和修改隔離目錄中的項(xiàng)。首先,考慮事務(wù)Tid10,它在目錄X中建立名為YisAVeryLongName的新文件,即建立X\YisAVeryLongName。隔離目錄節(jié)加入下面兩個(gè)項(xiàng)NameYisAVeryLongName;Tid10;(對(duì)Tid可見(jiàn)TRUE,對(duì)其他可見(jiàn)FALSE);LongNameTRUE;pairedNamePtrPtr到短名項(xiàng)ReservedTRUE;FidINVALID_ID;其他復(fù)制信息。
NameYisAVery
LongNameFALSE;pairedNamePtrPtr到長(zhǎng)名項(xiàng)這保證了X的后續(xù)的目錄列舉如果是由Tid10以外的事務(wù)做的,將不返回這些名字,而非事務(wù)將看到這兩個(gè)名字。此外,如果另一事務(wù)Tid20試圖建立或打開(kāi)兩個(gè)名字的任一個(gè),該事務(wù)將得到從上述隔離結(jié)構(gòu)檢測(cè)的“File-already-exist-but-sharing-violation”錯(cuò)誤。
如果非事務(wù)處理線(xiàn)程打開(kāi)這些名字中任一個(gè),如果為了寫(xiě),刪除或任何類(lèi)型的修改而打開(kāi),它得到共享破壞的信息,這種非事務(wù)能只讀地打開(kāi)它。這是由于上述分別強(qiáng)加的TxF的文件鎖定語(yǔ)義。
考慮第二個(gè)例子,從父目錄X事務(wù)處理刪除現(xiàn)有的文件YisAVeryLongName。在此例中在目錄X中還有此名字的短名鏈接(名字對(duì)情況,與鏈接刪除情況相反)。而且,該事務(wù)具有標(biāo)識(shí)符Tid10,而隔離目錄具有下列兩個(gè)加入項(xiàng)目NameYisAVeryLongName;Tid10;(對(duì)Tid可見(jiàn)FALSE,對(duì)其他可見(jiàn)TRUE);LongNameTRUE;pairedNamePtrPtr到短名項(xiàng)ReservedTRUE;Fid文件Id;其他復(fù)制信息。
NameYisAVeryLongNameFALSE;pairedNamePtrPtr到長(zhǎng)名項(xiàng)這兩個(gè)鏈接也從目錄X的索引SCB刪除,但現(xiàn)在可以假設(shè)TxF保證文件未被物理上去除,因?yàn)樵趧h除前TxF將系統(tǒng)擁有的鏈接加到文件上。因此,兩個(gè)名字均不能為T(mén)id10以外的任何事務(wù)用于建立新文件或新鏈接。這是因?yàn)門(mén)id10能決定中斷和重新使用這些名字。而且,這些名字在目錄列舉或建立中對(duì)Tid10不可見(jiàn),使Tid可用這兩個(gè)名字的任一個(gè)建立新鏈接/文件,這些名字對(duì)其他事務(wù)可見(jiàn),這意味著這些事務(wù)能使用該文件ID(Fid)打開(kāi)它們。非事務(wù)處理的用戶(hù)不能看到這些文件,他們也不能使用這些名字來(lái)建立新的文件。
在第三例子中,認(rèn)為第一例子已經(jīng)發(fā)生,即文件已經(jīng)建立。然而,因?yàn)樵撁謱?duì)事務(wù)Tid10可見(jiàn),Tid10能自由地打開(kāi)該文件并刪除它。若Tid10打開(kāi)該文件用于寫(xiě),并隨后刪除它,刪除后的隔離項(xiàng)如下NameYisAVeryLongName;Tid10;(對(duì)Tid可見(jiàn)FALSE,對(duì)其他可見(jiàn)FALSE);LongNameTRUE;pairedNamePtrPtr到短名項(xiàng)ReservedTRUE;FidINVALID_ID;沒(méi)有復(fù)制信息。
NameYisAVeryLongNameFALSE;pairedNamePtrPtr到長(zhǎng)名項(xiàng)這些項(xiàng)對(duì)該事務(wù)保留名字,但使它對(duì)任何事務(wù)都不可見(jiàn),注意,執(zhí)行保留以允許退回到工作。
浮動(dòng)存儲(chǔ)器映射段本發(fā)明的另外方面是定位于解決一個(gè)問(wèn)題,其中應(yīng)用程序?qū)σ粋€(gè)或多個(gè)為寫(xiě)訪(fǎng)問(wèn)而打開(kāi)的文件上執(zhí)行存儲(chǔ)器映射,而不覺(jué)察包括該應(yīng)用程序的事務(wù)已中斷(或提交)。例如,當(dāng)分布式事務(wù)在網(wǎng)絡(luò)的另一個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)中斷時(shí)會(huì)發(fā)生這樣情況。在那時(shí),應(yīng)用程序工作情況會(huì)不佳或有破壞性。
當(dāng)應(yīng)用程序?qū)?xiě)訪(fǎng)問(wèn)而打開(kāi)的文件上執(zhí)行存儲(chǔ)器映射,并不覺(jué)察其有關(guān)的事務(wù)已中斷(或提交),和/或工作情況會(huì)不佳或有破壞性,另一寫(xiě)程序能打開(kāi)仍然是存儲(chǔ)器映射的文件用于寫(xiě)訪(fǎng)問(wèn)。因此與文件數(shù)據(jù)能發(fā)生沖突,因?yàn)榇嬖诙鄠€(gè)同時(shí)的寫(xiě)程序。更具體地,當(dāng)由應(yīng)用程序執(zhí)行時(shí),存儲(chǔ)器映射指使用段對(duì)象(共享存儲(chǔ)器塊)將文件映射到過(guò)程地址空間。若應(yīng)用程序修改一頁(yè),存儲(chǔ)管理器能在正常頁(yè)面操作期間將改變寫(xiě)回到盤(pán)上的文件中,或者,應(yīng)用程序能直接引起一次刷新。雖然在事務(wù)的環(huán)境中不希望這樣,但允許應(yīng)用程序執(zhí)行存儲(chǔ)器映射,因此可能通過(guò)另外的事務(wù)應(yīng)用程序引起對(duì)為寫(xiě)訪(fǎng)問(wèn)而打開(kāi)的文件的寫(xiě)操作。
知道事務(wù)何時(shí)提交或退出,并且例如清除受該事務(wù)影響的數(shù)據(jù)結(jié)構(gòu)的文件系統(tǒng)可以詢(xún)問(wèn)存儲(chǔ)管理器以確定事務(wù)的應(yīng)用過(guò)程(或多個(gè)過(guò)程)是否是存儲(chǔ)器映射,即是否已經(jīng)建立一個(gè)段句柄。如果存在任何這種應(yīng)用程序,不知道該應(yīng)用程序操作狀態(tài)的文件系統(tǒng)不能直接關(guān)閉該應(yīng)用程序或保證它不會(huì)繼續(xù)寫(xiě)到映射段。
圖23示出一個(gè)方法,其中文件系統(tǒng)62防止應(yīng)用程序180(不再是事務(wù)的一部分)寫(xiě)到為另一應(yīng)用程序182打開(kāi)用于寫(xiě)訪(fǎng)問(wèn)的映射文件。為此,文件系統(tǒng)調(diào)節(jié)段控制塊(SCB)188,各個(gè)應(yīng)用程序180,182的文件對(duì)象184、186指向不同的段對(duì)象指針190、192。無(wú)效事務(wù)應(yīng)用程序1(180)的段對(duì)象指針190是空的,而有效事務(wù)應(yīng)用程序2(182)的段對(duì)象指針192具有指向用于該應(yīng)用程序182的存儲(chǔ)器196的指針。這使得存儲(chǔ)器段194浮動(dòng)。
無(wú)效事務(wù)應(yīng)用程序180能持續(xù)對(duì)浮動(dòng)的存儲(chǔ)器段讀或?qū)?,但它不再?duì)應(yīng)于該文件。同時(shí),一旦在高速緩存/存儲(chǔ)管理器114通過(guò)代表有效應(yīng)用程序182的文件系統(tǒng)62發(fā)現(xiàn)頁(yè)面存在錯(cuò)誤,適當(dāng)?shù)奶摂M存儲(chǔ)器頁(yè)面198(及由應(yīng)用程序182使用的存儲(chǔ)器196)用從事務(wù)處理的正確文件(如保存在TOPS流版本中的正確頁(yè)面)來(lái)的數(shù)據(jù),或從盤(pán)上文件來(lái)的數(shù)據(jù)進(jìn)行填充。類(lèi)似的,當(dāng)存儲(chǔ)管理器114指令時(shí),文件系統(tǒng)62將由有效應(yīng)用程序改變的頁(yè)面寫(xiě)到盤(pán)112中。
但是,對(duì)于映射到無(wú)效應(yīng)用程序180的段中的頁(yè)面,任何從達(dá)到對(duì)應(yīng)于存儲(chǔ)器段194的文件系統(tǒng)62的存儲(chǔ)管理器114來(lái)的寫(xiě)請(qǐng)求被文件系統(tǒng)62接受,但實(shí)際上不寫(xiě)入盤(pán),因此,映射的存儲(chǔ)器是浮動(dòng)的段;可以允許其寫(xiě)入存儲(chǔ)器,但其改變決不刷新到盤(pán)中。由存儲(chǔ)管理器114對(duì)從盤(pán)112來(lái)的頁(yè)面請(qǐng)求失敗導(dǎo)致返回零。因此,段194的此版本不再由盤(pán)上的文件返回。以此方式,有效事務(wù)的應(yīng)用程序的數(shù)據(jù)文件與由無(wú)效應(yīng)用程序?qū)τ成湮募臄?shù)據(jù)改變相隔離。
另外還可能將存儲(chǔ)器的映射段改變成對(duì)無(wú)效應(yīng)用程序不能訪(fǎng)問(wèn)或只讀。從而由無(wú)效應(yīng)用程序的寫(xiě)導(dǎo)致訪(fǎng)問(wèn)破壞。如果讀是允許的,每當(dāng)由有效應(yīng)用程序作出的改變?cè)诙?94中錯(cuò)誤,無(wú)效應(yīng)用程序能看到這些改變。
注意,任意上述解決方法能引起無(wú)效的應(yīng)用程序180崩潰,而有效應(yīng)用程序182的數(shù)據(jù)被適當(dāng)?shù)馗綦x。為避免破壞無(wú)效應(yīng)用程序180,作出的改變被寫(xiě)到盤(pán)上另一文件,但是,目前支持這種后事務(wù)處理的版本被認(rèn)為對(duì)這種應(yīng)用程序是不必要的開(kāi)銷(xiāo)增加。
TxF日去記錄格式<pre listing-type="program-listing"><![CDATA[  //log record types that are known to the recovery manager.  typedef enum{  TxfLogRecTypeRedo,  TxfLogRecTypeUndo,  TxfLogRecTypePrepare,  TxfLogRecTypeAbort,  TxfLogRecTypeCommit,  }TXF_LOGREC_TYPE;  typedef enum{  TxfLogRecActionCreateFile,  TxfLogRecActionDeleteFile,  TxfLogRecActionWriteFile,  TxfLogRecActionOverwriteFile,  TxfLogRecActionFcbInfoUpdateFile,  TxfLogRecActionTemporaryBitChangeFile,  TxfLogRecActionUpdateDupInfo,  TxfLogRecActionTruncateFile,  TxfLogRecActionRestoreFileSizes,  TxfLogRecActionCancelRecord,  TxfLogRecActionTestPrint}TXF_LOGREC_ACTION;  typedef struct {  TXF_LOGREC_TYPE Type;  TXF_LOGREC_ACTION Action;  TXF_TRANS_ID TransId;  }TXF_LOGREC,*PTXF_LOGREC;  /*  tyPedef struct {  TXF_LOGREC_HDR header;  char data[1];  } TXF_LOGREC,*PTXF_LOGREC;  */  //  //Delete File log record.  //  //  //The Long name and the short name are laid out  //immediately after the record.  //  typedef struct_TXF_DELETE_FILE_UNDO_LOGREC {  TXF_LOGREC Header;  //  //See below for flag values  //  USHORT Flags;  //  // ShortNameLength is 0 if there′s no short name.//The short name begins right after the  //FileName.FileName ends.  //It′s at PWCHAR FileName.FileName+  //FileName.FileNameLength.  //ShortNameLength is in unicode chars.  //  USHORTShortNameLength;  //  //MungedFileNumber to which the rename happened.  //  ULONG MungedFileNumber;  //  //The Txf subdirectory to which the rename happened.  //  ULONG SubDirNumber;  //  //The long/combined name with valid dup info,parent  //directory,length  //etc.  //  FILE_NAME FileName;  //  //Don′t add any fields after this.  //}*PTXF_DELETE_FILE_UNDO_LOGREC,  TXF_DELETE_FILE_UNDO_LOGREC;  //  //TRUE if the file is a directory.  //  #define TXF_DELETE_FILE_UNDO_FLAGS_DIRECTORY 0x01  //  //TRUE if this delete operation had stored the Fid flags.  //  #define TXF_DELETE_FILE_UNDO_FLAGS_FID_STORED 0x02  //  //IgnoreCase flag for the CCB that opened the name for  //delete.  //  #define TXF_DELETE_FILE_UNDO_FLAGS_IGNORE_CASE 0x04  //  //Create-File undo log record.  //  //The Long name and the short name are laid out  //immediately after the record.  //  typedef struct_TXF_CREATE_FILE_UNDO_LOGREC {  TXF_LOGREC Header;  FILE_REFERENCE ParentFid;//  //LongNameLength is in unicode characters.  //  USHORTLongNameLength;  //  //LongNameOffset=sizeof(struct  //_TXF_CREATE_FILE_UNDO_LOGREC)  //  //  //See below for flag values  //  USHORT Flags;  //  //ShortNameLength is 0 if there′s no short name.  //Length is in unicode chars.  //  USHORT ShortNameLength;  //  //ShortNameOffset is sizeof(struct  //_TXF_CREATE_FILE_UNDO_LOGREC)+  //LongNameLength*sizeof(WCHAR)  //  USHORTReserved1;  ULONG Reserved2;}*PTXF_CREATE_FILE_UNDO_LOGREC,  TXF_CREATE_FILE_UNDO_LOGREC;  //  //TRUE if the file is a directory.  //  #define TXF_CREATE_FILE_UNDO_FLAGS_DIRECTORY 0x01  //  //IgnoreCase flag for the CCB that created the name.  //  #define TXF_CREATE_FILE_UNDO_FLAGS_IGNORE_CASE 0x02  //  //Overwrite-File undo log record.  //  typedef struct_TXF_OVERWRITE_FILE_UNDO_LOGREC {  TXF_LOGREC Header;  //  //File reference of the file that was overwritten  //  FILE_REFERENCE Fid;  //  //File reference of the TxF file that was created in  //the TxF directory.//  FILE_REFERENCE TxfFileFid;  //  //MungedFileNumber of the TxF file that was created in  //the TxF directory.  //  ULONG MungedFileNumber;  //  //The Txf subdirectory in which the TxF file was  //created.  //  ULONG SubDirNumber;  USHORTFlags;  USHORTReserved1;  ULONG Reserved2;  }*PTXF_OVERWRITE_FILE_UNDO_LOGREC,  TXF_OVERWRITE_FILE_UNDO_LOGREC;  //  //FcbInfoUpdate undo log record.It is undone  //unconditionally without checking the TxfLsn in the  //standard-info.  //  typedef struct_TXF_FCB_INFO_UPDATE_UNDO_LOGREC {TXF_LOGREC Header;  //  //File reference of the file that was overwritten  //  FILE_REFERENCE Fid;  //  //Fcb Info to be restored on undo.  //  DUPLICATED_INFORMATION FcbInfo;  }*PTXF_FCB_INFO_UPDATE_UNDO_LOGREC,  TXF_FCB_INFO_UPDATE_UNDO_LOGREC;  //  //FcbInfoUpdate undo log record.It is undone  //unconditionally without checking the TxfLsn in the  //standard-info.  //  typedef struct_TXF_TEMPORARY_BIT_CHANGE_UNDO_LOGREC {  TXF_LOGREC Header;  //  //File reference of the file that was overwritten  //FILE_REFERENCE Fid;  ULONG PreviousBitValue;  //  //Attribute name lenngth is 0 if this is the default  //data stream.  //Length is in unicode chars.  //Attribute name follows the log record,if present.  //  USHORTAttrNameLength;  WCHAR AttrName[1];  }*PTXF_TEMPORARY_BIT_CHANGE_UNDO_LOGREC,  TXF_TEMPORARY_BIT_CHANGE_UNDO_LOGREC;  //  //UpdateDupInfo undo log record.  //  //The Long name is laid out immediately after the record.  //  typedef struct_TXF_UPDATE_DUPINFO_UNDO_LOGREC {  TXF_LOGREC Header;  //  //Fid of the parent directory.   //  FILE_REFERENCE ParentFid;//  //LongNameLength is in unicode characters.  //  USHORTLongNameLength;  //  //See below for flags.  //  USHORTFlags;  //  //Duplicated information.  //  DUPLICATED_INFORMATION DupInfo;  WCHAR LongName[1];  }*PTXF_UPDATE_DUPINFO_UNDO_LOGREC,  TXF_UPDATE_DUPINFO_UNDO_LOGREC;  #define TXF_UPDATE_DUPINFO_UNDO_FLAGS_DIRECTORY 0x0001  //  //Truncate undo log record.  //  //The attribute name is laid out immediately after the  //record.  //  typedef struct_TXF_TRUNCATION_UNDO_LOGREC {TXF LOGREC Header;  //  //Fid of the file.  //  FILE_REFERENCE Fid;  LONGLONG ValidDataLength;  LONGLONG FileSize;  //  //Attribute name length is 0 if this is the default  //data stream.  //Length is in uniccde chars.  //Attribute name fc lows the log record,if present.  //  USHORT AttrNameLength;  WCHARAttrName[1];  }*PTXF_TRUNCATION_UNDO_LOGREC,TXF_TRUNCATION_UNDO_LOGREC;  //  //Restore file sizes undo log record.  //  //The attribute name is laid out immediately after the  //record.  //  typedef struct_TXF_RESTORE_FILE_SIZES_UNDO_LOGREC {  TXF_LOGREC Header;//  //Fid of the file.  //  FILE_REFERENCE Fid;  LONGLONG ValidDataLength;  LONGLONG FileSize;  //  //Attribute name length is 0 if this is the default  //data stream.  //Length is in unicode chars.  //Attribute name follows the log record,if present.  //  USHORT AttrNameLength;  WCHARAttrName[1];  }*PTXF_RESTORE_FILE_SIZES_UNDO_LOGREC,  TXF_RESTORE_FILE_SIZES_UNDO_LOGREC;  //  //Define the format of the Change Table entries,and some  //related contents.  //  #define TOPS_SECTOR_SIZE(512)  #define TOPS_PAGE_SIZE (4096)  #define TOPS_PAGE_SHIFT (12)#define TOPS_SECTORS_PER_PAGE (TOPS_PAGE_SIZE/  TOPS_SECTOR_SIZE)  #define TOPS_MAXIMUM_FLUSH_SIZE(0x10000)  typedef struct_CHANGE_ENTRY {  //  //These two fields describe the virtual address of the  //displaced range of the stream.  //  ULONGLONG VirtualPageNumber;  ULONG NumberPages;  //  //This is the starting page number in the Tops stream  //to where the old pages were written.  //  ULONG TopsPageNumber;  //  //This is the Lsn of the log record describing this  //change.  //  CLFS_LSN Lsn;  //  //SequenceNumber being written into all bytes of the  //undo pages covered  //by this change.  //UCHAR SequenceNumber;  //  //May as well reserve bytes here for alignment,since  //the size will always round to quad word anyway.  //  UCHAR Reserved[7];  //  //Finally,these are the displaced bytes of data,  //allowing torn write detection in the Tops stream.  //Enough are allocated here for one page,yet  //additional bytes will be allocated if NumberPages is  //greater than one.  //  UCHAR DisplacedBytes[TOPS_SECTORS_PER_PAGE];  }CHANGE_ENTRY,*PCHANGE_ENTRY;  //  //Create-File undo log record.  //  //The Long name and the short name are laid out  //immediately after the record.  //  typedef struct_TXF_WRITE_FILE_UNDO_LOGREC {  TXF_LOGREC Header;//   //File Reference for file undo data was captured from.   //   FILE_REFERENCE FileReference;   //   //Describe where the undo data was written and store   //the displaced bytes which were replaced by a   //sequence number.   //   CHANGE_ENTRY ChangeEntry;  }TXF_WRITE_FILE_UNDO_LOGREC,*PTXF_WRITE_FILE_UNDC_LOGREC;]]></pre>如上面詳細(xì)描述可見(jiàn),提供了一個(gè)事務(wù)處理文件系統(tǒng)及方法,使得應(yīng)用程序能容易地對(duì)一個(gè)或多個(gè)文件執(zhí)行多重事務(wù)操作。多重文件系統(tǒng)操作在文件系統(tǒng)中以事務(wù)處理方式互相結(jié)合,使得操作要么一起提交,要么任何部分的活動(dòng)都被撤消。此外一個(gè)事務(wù)的操作和數(shù)據(jù)改變與另外事務(wù)的操作和數(shù)據(jù)改變互相隔離。因此,例如本發(fā)明能以快速,有效和安全的方式將網(wǎng)站作為由文件系統(tǒng)部件處理的單個(gè)事務(wù)進(jìn)行更新。同時(shí),在事務(wù)提交前進(jìn)行中的改變互相隔離。
然而本發(fā)明易受各種修改和改變的結(jié)構(gòu)的影響,某些這里說(shuō)明的實(shí)施例在圖中示出,并在上面詳細(xì)描述。但是應(yīng)該理解,這并不是要將本發(fā)明限制在特定的形式或所揭示的形式,而相反,本發(fā)明覆蓋所有修改、另外結(jié)構(gòu)和落在本發(fā)明的精神和范圍內(nèi)的等效事物。
權(quán)利要求
1.一種提供訪(fǎng)問(wèn)文件的方法,其特征在于,包括接收打開(kāi)文件的第一請(qǐng)求,該請(qǐng)求與第一事務(wù)相關(guān);打開(kāi)該文件的第一范例,并維持指出該文件的第一范例與第一事務(wù)相關(guān)的信息;接收打開(kāi)該文件的第二請(qǐng)求;打開(kāi)文件的第二范例;接收對(duì)該文件的第二范例數(shù)據(jù)的改變;維持?jǐn)?shù)據(jù)將對(duì)應(yīng)第一范例的文件的第一版本與對(duì)應(yīng)于第二范例的文件的第二版本隔離;接收讀出該文件的讀請(qǐng)求,所述讀請(qǐng)求與第一事務(wù)相關(guān);判定該文件的第一版本是否與第一事務(wù)相關(guān);且響應(yīng)該讀請(qǐng)求讀出對(duì)應(yīng)該文件第一版本的數(shù)據(jù)。
2.如權(quán)利要求1所述的方法,其特征在于,維持?jǐn)?shù)據(jù)將文件的第一版本與文件的第二版本隔離包括維持對(duì)文件的第二版本數(shù)據(jù)的改變不同于對(duì)文件的第一版本數(shù)據(jù)的改變。
3.如權(quán)利要求2所述的方法,其特征在于,還包括響應(yīng)接收對(duì)數(shù)據(jù)的改變將改變寫(xiě)到文件中,并其中維持對(duì)文件的第二版本數(shù)據(jù)的改變與對(duì)文件的第一版本數(shù)據(jù)的改變不同包括在將改變寫(xiě)到該文件之前保存文件的第一版本的一部分副本到第一數(shù)據(jù)結(jié)構(gòu)。
4.如權(quán)利要求3所述的方法,其特征在于,維持?jǐn)?shù)據(jù)以將文件的第一版本與文件的第二版本隔離包括維持第二數(shù)據(jù)結(jié)構(gòu)以映射該部分的副本位置。
5.如權(quán)利要求4所述的方法,其特征在于,所述部分至少對(duì)應(yīng)一頁(yè),且其中,所述第二數(shù)據(jù)結(jié)構(gòu)記錄對(duì)應(yīng)于變化的每個(gè)頁(yè)號(hào)。
6.如權(quán)利要求4所述的方法,其特征在于,響應(yīng)讀請(qǐng)求讀出對(duì)應(yīng)于文件的第一版本的數(shù)據(jù)包括訪(fǎng)問(wèn)第二數(shù)據(jù)結(jié)構(gòu),以確定對(duì)應(yīng)讀請(qǐng)求的第一數(shù)據(jù)結(jié)構(gòu)中文件數(shù)據(jù)的至少一個(gè)位置。
7.如權(quán)利要求4所述的方法,其特征在于,還包括將對(duì)應(yīng)于數(shù)據(jù)改變的信息記錄到日志中的一個(gè)記錄,且其中所述第二數(shù)據(jù)結(jié)構(gòu)還包括識(shí)別該記錄的信息。
8.如權(quán)利要求1所述的方法,其特征在于,所述第二請(qǐng)求與第二事務(wù)相關(guān)。
9.如權(quán)利要求1所述的方法,其特征在于,打開(kāi)文件的第一請(qǐng)求對(duì)應(yīng)于只讀請(qǐng)求。
10.如權(quán)利要求1所述的方法,其特征在于,還包括接收關(guān)閉文件的關(guān)閉請(qǐng)求,所述關(guān)閉請(qǐng)求與第一事務(wù)相關(guān),關(guān)閉與第一事務(wù)相關(guān)的文件;接收打開(kāi)文件的第三請(qǐng)求,第三請(qǐng)求與第一事務(wù)相關(guān);從所述第一事務(wù)接收訪(fǎng)問(wèn)文件中數(shù)據(jù)的請(qǐng)求;和響應(yīng)訪(fǎng)問(wèn)數(shù)據(jù)的請(qǐng)求訪(fǎng)問(wèn)在對(duì)應(yīng)于第二版本的文件中的數(shù)據(jù)。
全文摘要
本發(fā)明提供一種文件訪(fǎng)問(wèn)的方法,它包括接收打開(kāi)文件的第一請(qǐng)求,該請(qǐng)求與第一事務(wù)相關(guān);打開(kāi)該文件的第一范例(instance),并維持指出該文件的第一范例與第一事務(wù)相關(guān)的信息;接收打開(kāi)該文件的第二請(qǐng)求;打開(kāi)文件的第二范例;接收對(duì)該文件的第二范例數(shù)據(jù)的改變;維持?jǐn)?shù)據(jù)將對(duì)應(yīng)第一范例的文件的第一版本與對(duì)應(yīng)于第二范例的文件的第二版本隔離;接收讀出該文件的讀請(qǐng)求,所述讀請(qǐng)求與第一事務(wù)相關(guān);判定該文件的第一版本是否與第一事務(wù)相關(guān);且響應(yīng)該讀請(qǐng)求讀出對(duì)應(yīng)該文件第一版本的數(shù)據(jù)。因此,本發(fā)明加入事務(wù)機(jī)制到文件系統(tǒng)中,使得應(yīng)用程序能容易執(zhí)行對(duì)一個(gè)或多個(gè)文件的多重事務(wù)操作,克服了與外事務(wù)機(jī)制相關(guān)的問(wèn)題。
文檔編號(hào)G06F12/00GK1746892SQ20051010369
公開(kāi)日2006年3月15日 申請(qǐng)日期2001年3月16日 優(yōu)先權(quán)日2000年3月30日
發(fā)明者S·維爾馬, T·J·米勒, R·G·阿特金森 申請(qǐng)人:微軟公司
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
丹棱县| 安龙县| 景洪市| 大洼县| 锡林浩特市| 会东县| 曲沃县| 恩平市| 开化县| 延寿县| 同江市| 马鞍山市| 上林县| 兴业县| 云浮市| 惠州市| 潮州市| 桑植县| 乐陵市| 云霄县| 云和县| 乌兰浩特市| 庄河市| 定兴县| 临湘市| 曲松县| 鲜城| 日喀则市| 柳州市| 南涧| 库尔勒市| 阿勒泰市| 嘉定区| 上虞市| 叶城县| 化州市| 铜川市| 嫩江县| 增城市| 新营市| 三明市|