專利名稱:對分布式存儲(chǔ)器系統(tǒng)中的數(shù)據(jù)的原子多重修改的制作方法
對分布式存儲(chǔ)器系統(tǒng)中的數(shù)據(jù)的原子多重修改背景
分布式系統(tǒng),包括服務(wù)器場、web服務(wù),以及分布式,網(wǎng)絡(luò)附屬存儲(chǔ)系統(tǒng),已經(jīng)變得越來越普遍,提供大量的計(jì)算和存儲(chǔ)資源。分布式存儲(chǔ)系統(tǒng)使用整個(gè)廣域網(wǎng)中的多個(gè)節(jié)點(diǎn)中的存儲(chǔ)空間。用于訪問存儲(chǔ)在分布式存儲(chǔ)系統(tǒng)中的節(jié)點(diǎn)上的數(shù)據(jù)的數(shù)據(jù)訪問例程必須管理要求同時(shí)訪問的多個(gè)客戶機(jī)會(huì)話。然而,為維護(hù)數(shù)據(jù)的一致視圖,修改訪問必須一次僅限于一臺(tái)主機(jī)。另外,執(zhí)行多重修改的客戶機(jī)會(huì)話必須在應(yīng)用多重修改期間維護(hù)數(shù)據(jù)一致性。概述本發(fā)明的各實(shí)施例由下面的權(quán)利要求書進(jìn)行定義,而不由本概述進(jìn)行定義。因此, 這里提供了本發(fā)明的各個(gè)方面的高級(jí)別的概述,以提供本發(fā)明的概述,并介紹將在以下詳細(xì)描述部分進(jìn)一步描述的一些概念。本概述不旨在標(biāo)識(shí)所要求保護(hù)的主題的關(guān)鍵特征或必要特征,也不旨在用于幫助確定所要求保護(hù)的主題的范圍。本發(fā)明的各實(shí)施例涉及執(zhí)行稱為原子多重修改的對一個(gè)或多個(gè)流作為單一原子單位的多重修改。在某些實(shí)施例中,如果多重修改中的一個(gè)不成功(例如,如果不滿足前提條件),則成功地應(yīng)用了的修改被反向,將流返回到開始原子多重修改之前的它們的原始狀態(tài)。附圖簡述下面將參考附圖詳細(xì)描述本發(fā)明的說明性實(shí)施例,在附圖中
圖1描繪適用于實(shí)現(xiàn)本發(fā)明的各實(shí)施方式的示例性網(wǎng)絡(luò)環(huán)境的圖;圖2描繪適用于實(shí)現(xiàn)本發(fā)明的示例性計(jì)算設(shè)備的框圖;圖3呈現(xiàn)了根據(jù)本發(fā)明的一實(shí)施例的示例性流的框圖;圖4呈現(xiàn)了根據(jù)本發(fā)明的一個(gè)實(shí)施例的示例性元數(shù)據(jù)塊的框圖;圖5呈現(xiàn)了根據(jù)本發(fā)明的一實(shí)施例的示例性多重修改的框圖;圖6示出了根據(jù)本發(fā)明的一實(shí)施例的用于執(zhí)行對一個(gè)或多個(gè)流作為單一原子單位的多重修改的方法的流程圖;圖7示出了根據(jù)本發(fā)明的一實(shí)施例的如果確定在一個(gè)或多個(gè)選定流中第二修改會(huì)失敗,逆轉(zhuǎn)成功的修改的方法的流程圖;圖8示出了根據(jù)本發(fā)明的一實(shí)施例的用于執(zhí)行對一個(gè)或多個(gè)流作為單一原子單位的多重修改的方法的流程圖,包括確定多重修改中的一個(gè)是否將導(dǎo)致不一致性或失??; 以及圖9示出了根據(jù)本發(fā)明的一實(shí)施例的多重修改的示例。詳細(xì)描述此處用具體細(xì)節(jié)描述本發(fā)明的主題以滿足法定要求。然而,描述本身并不旨在限制本專利的范圍。相反,發(fā)明人設(shè)想,所要求保護(hù)的主題還可結(jié)合其他當(dāng)前或未來技術(shù)按照其他方式來具體化,以包括不同的步驟或類似于本文中所描述的步驟的步驟組合。此外,雖然此處可以使用術(shù)語“步驟”和/或“框”來指示所使用的方法的不同元素,但是除非而且僅當(dāng)明確描述了各個(gè)步驟的順序時(shí),這些術(shù)語不應(yīng)該被解釋為意味著此處所公開的各步驟之間的任何特定順序。 本發(fā)明的各實(shí)施例涉及對以分布式方式存儲(chǔ)在存儲(chǔ)節(jié)點(diǎn)網(wǎng)絡(luò)中的數(shù)據(jù)進(jìn)行多重修改。在由分布在大型網(wǎng)絡(luò)中的多個(gè)節(jié)點(diǎn)組成的網(wǎng)絡(luò)中,每一數(shù)據(jù)單位都可以潛在地同時(shí)地被多個(gè)客戶機(jī)會(huì)話訪問。此外,還在網(wǎng)絡(luò)中的不同的數(shù)據(jù)片段之間維護(hù)一致性。為了在訪問數(shù)據(jù)的所有客戶機(jī)會(huì)話之間維護(hù)數(shù)據(jù)的一致視圖,對數(shù)據(jù)的修改需要協(xié)調(diào)。若沒有對于對數(shù)據(jù)的修改的協(xié)調(diào),兩個(gè)客戶機(jī)會(huì)話有可能以不一致的方式修改兩段數(shù)據(jù),導(dǎo)致不可預(yù)測的結(jié)果。此外,若沒有多重相互依賴的修改的原子應(yīng)用,執(zhí)行修改的客戶機(jī)會(huì)話的失敗有可能會(huì)使數(shù)據(jù)處于不一致的狀態(tài),或者第二客戶機(jī)會(huì)話有可能讀取表示中間的不一致狀態(tài)的數(shù)據(jù)。為防止這些類型的不一致性,需要基本操作來協(xié)調(diào)對數(shù)據(jù)的修改。具體而言,當(dāng)獨(dú)立應(yīng)用單個(gè)修改將產(chǎn)生臨時(shí)的不一致的狀態(tài)時(shí),需要具有作為原子事務(wù)對一個(gè)或多個(gè)數(shù)據(jù)片段應(yīng)用多個(gè)相互依賴的修改的能力,從而防止分布式網(wǎng)絡(luò)中的其他客戶機(jī)會(huì)話中的數(shù)據(jù)視圖中的不一致性。此外,還希望如果多重修改中的一個(gè)或多個(gè)無法被成功地應(yīng)用,能夠取消整組多重修改,從而防止由部分地成功的事務(wù)所產(chǎn)生的數(shù)據(jù)視圖的不一致性。另外,還希望能夠指定在可以成功地應(yīng)用特定修改之前必須滿足的一個(gè)或多個(gè)預(yù)期的前提條件,從而允許客戶機(jī)會(huì)話以“樂觀的”方式協(xié)調(diào)獨(dú)立的,潛在地相互沖突的事務(wù)的應(yīng)用,而不需要使用分布式的鎖。 作為示例,客戶機(jī)會(huì)話X和客戶機(jī)會(huì)話Y兩者都在執(zhí)行一種算法,該算法要求它們讀取數(shù)據(jù)A的值,并計(jì)算數(shù)據(jù)A和數(shù)據(jù)B的新值,新值基于數(shù)據(jù)A的前面的值及由相應(yīng)的客戶機(jī)會(huì)話確定的其他外部數(shù)據(jù)(客戶機(jī)會(huì)話X的數(shù)據(jù)Cx,客戶機(jī)會(huì)話Y的數(shù)據(jù)Cy)。然后,可以作為原子操作,寫入A和B的新值。然而,由于在讀取數(shù)據(jù)A的值和寫入數(shù)據(jù)A和數(shù)據(jù)B的新值之間無鎖,因此,客戶機(jī)會(huì)話X和客戶機(jī)會(huì)話Y兩者有可能同時(shí)讀取數(shù)據(jù)A,然后,獨(dú)立地為數(shù)據(jù)A和數(shù)據(jù)B計(jì)算新值。首先是客戶機(jī)會(huì)話X以及然后是客戶機(jī)會(huì)話Y將使用原子修改事務(wù),嘗試寫入數(shù)據(jù)A和數(shù)據(jù)B的它們的各自的新值,兩者都將成功。然而, 由客戶機(jī)會(huì)話X應(yīng)用的修改的影響被由客戶機(jī)會(huì)話Y應(yīng)用的修改有效地撤消,導(dǎo)致相對于外部數(shù)據(jù)的潛在不一致性。為防止這種情況發(fā)生,許多傳統(tǒng)的基于網(wǎng)絡(luò)的文件系統(tǒng)將要求客戶機(jī)會(huì)話聲明一個(gè)跨對數(shù)據(jù)A的讀取到對數(shù)據(jù)A和數(shù)據(jù)B的寫入的分布式鎖,從而在客戶機(jī)會(huì)話X完成更新數(shù)據(jù)A和數(shù)據(jù)B之前,防止客戶機(jī)會(huì)話Y讀取數(shù)據(jù)A的值。然而,使用分布式鎖產(chǎn)生大量的開銷,并導(dǎo)致更不穩(wěn)定的分布式系統(tǒng);例如,如果客戶機(jī)會(huì)話X未能釋放鎖,那么,會(huì)無限期地妨礙客戶機(jī)會(huì)話Y取得進(jìn)展。本發(fā)明通過允許客戶機(jī)會(huì)話X和客戶機(jī)會(huì)話Y指定當(dāng)它們嘗試寫入數(shù)據(jù)A和數(shù)據(jù)B的新值時(shí)必須滿足的前提條件,避免了顯式的分布式鎖的必要性。在此示例中,客戶機(jī)會(huì)話X和客戶機(jī)會(huì)話Y兩者都要求,在數(shù)據(jù)A和數(shù)據(jù)B可以被替換之前,數(shù)據(jù)A的值自從它被讀取以來必須沒有更改??蛻魴C(jī)會(huì)話Y將在其更新方面成功,因?yàn)樵谧x取數(shù)據(jù)A和寫入數(shù)據(jù)A和數(shù)據(jù)B之間沒有發(fā)生修改。然而,客戶機(jī)會(huì)話X在更新任何數(shù)據(jù)時(shí)將不會(huì)成功,因?yàn)閿?shù)據(jù)A的值在讀取數(shù)據(jù)A和嘗試更新之間發(fā)生了變化。客戶機(jī)會(huì)話X可隨意放棄操作,或者通過再次讀取數(shù)據(jù)A來重新啟動(dòng)整個(gè)序列。 在任何情況下,所有數(shù)據(jù)在內(nèi)部和外部狀態(tài)都保持一致。 存儲(chǔ)在網(wǎng)絡(luò)中的特定數(shù)據(jù)可以有許多不同的形式。常見形式包括文件和類似的文件分組。根據(jù)本發(fā)明的某些實(shí)施例,數(shù)據(jù)被組織成流,其中,每一流都是由各種流元數(shù)據(jù)屬性(例如,流名稱、訪問控制策略、失效時(shí)間等等)組成的數(shù)據(jù)實(shí)體,以及對范圍的引用的有序序列。每一范圍都由附加塊的相鄰的有序序列組成。每一附加塊都是不可改變的,并由字節(jié)值相鄰的有序序列組成。可以將新的范圍引用附加到流的末尾,但是一旦附加,就無法從流中刪除范圍引用。一個(gè)以上的流包含對同一個(gè)范圍的引用,或者甚至單一流包含對同一個(gè)范圍的多個(gè)引用,都是有可能的??梢詫⑿赂郊訅K附加到一個(gè)范圍,直到該范圍變得封閉,此后,該范圍變得不可改變。一旦一個(gè)范圍被封閉,它將無法被解封。不管范圍是否被封閉,附加塊都無法被修改,或者從范圍中刪除。因此,流和范圍只能在大小方面增長。 根據(jù)本發(fā)明的一個(gè)實(shí)施例,通過將范圍數(shù)據(jù)存儲(chǔ)在大的獨(dú)立的,松散耦合的范圍服務(wù)器組,并將描述每一流的元數(shù)據(jù)存儲(chǔ)在集中式服務(wù)器上或小的緊密耦合的服務(wù)器組中,將流組織在文件系統(tǒng)中。為將數(shù)據(jù)附加到一個(gè)范圍,客戶機(jī)會(huì)話與正確的獨(dú)立范圍服務(wù)器進(jìn)行交互;因此,附加到范圍是高度可縮放的,但是,不會(huì)促進(jìn)向不同的范圍的附加的協(xié)調(diào)。相反,在集中式服務(wù)器上維護(hù)了所有相關(guān)的流的元數(shù)據(jù),因此對于對流元數(shù)據(jù)的更新的有效的協(xié)調(diào)是可能的。作為示例,與每一流相關(guān)聯(lián)的元數(shù)據(jù)都可包括諸如當(dāng)前流名稱、全局唯一標(biāo)識(shí)符 (GUID)、訪問控制策略、失效時(shí)間,以及對構(gòu)成流的范圍的引用的有序列表之類的信息。這種組織的一個(gè)優(yōu)點(diǎn)是可以將范圍引用從一個(gè)流復(fù)制到另一個(gè)流,無需移動(dòng)網(wǎng)絡(luò)中的任何數(shù)據(jù)。相反,只有引用列表在存儲(chǔ)在集中式服務(wù)器上的元數(shù)據(jù)中改變。因?yàn)橹貜?fù)操作只影響流元數(shù)據(jù),所以它們可以有效地被包括為原子多重修改的一部分。在本發(fā)明的其他實(shí)施例中,可以將元數(shù)據(jù)本身分布到網(wǎng)絡(luò)中的多個(gè)節(jié)點(diǎn)中。本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到,本發(fā)明可以應(yīng)用于除流以外的數(shù)據(jù)格式。根據(jù)某些實(shí)施例,本發(fā)明提供將多個(gè)流前提條件約束和變異操作批處理為操作列表,并讓它們作為一個(gè)原子多重修改來執(zhí)行。操作包括流元數(shù)據(jù)前提條件約束、流創(chuàng)建、流刪除、流重命名、從其他流中復(fù)制現(xiàn)有范圍引用,以及設(shè)置諸如失效時(shí)間、只讀標(biāo)記、訪問控制信息,以及復(fù)制策略之類的各種流屬性。另外,本發(fā)明的一些實(shí)施例提供以對同一個(gè)多重修改內(nèi)的其他修改操作的引用來表達(dá)跨流操作的能力。例如,在一多重修改內(nèi),可能有由該多重修改所創(chuàng)建的應(yīng)用于流的額外的操作。類似地,在一多重修改內(nèi),可能有由該多重修改刪除或重命名的應(yīng)用于流的額外的操作。通過將多重修改中記錄的每一單個(gè)操作與目標(biāo)流標(biāo)識(shí)相關(guān)聯(lián),并通過在跨流操作中按照被執(zhí)行的多重修改中的它們各自的記錄索引來引用源流,可以在多重修改的過程中的任何時(shí)間,引用在多重修改過程中其標(biāo)識(shí)被創(chuàng)建或其名稱被更改的流。例如,如果在要執(zhí)行的操作的列表中有5個(gè)記錄,那么,如果第三操作正在創(chuàng)建一個(gè)新的流,則其他操作中的任何一個(gè)都可以引用該流作為操作3中的流。根據(jù)一個(gè)實(shí)施例,本發(fā)明提供將非修改前提條件約束表達(dá)為多重修改中的操作的能力。這些操作本身不導(dǎo)致流的狀態(tài)的任何變化;然而,如果不滿足前提條件,則它們會(huì)導(dǎo)致整個(gè)多重修改失敗。這允許多個(gè)客戶機(jī)實(shí)現(xiàn)對流狀態(tài)的協(xié)調(diào)的操縱,而不要求使用外部鎖或其他同步機(jī)制??梢灾付ǖ那疤釛l件的示例包括流存在、流名稱、流標(biāo)識(shí)(重命名后保留的,但在刪除/重新創(chuàng)建后會(huì)改變的唯一 ID),流版本號(hào)、流失效時(shí)間,以及范圍引用計(jì)數(shù)。根據(jù)再一個(gè)實(shí)施例,本發(fā)明提供了作為原子多重修改的一部分以將流內(nèi)容的某些部分有效地復(fù)制到新的流中的能力。流可以被建模為對分布在存儲(chǔ)節(jié)點(diǎn)的網(wǎng)絡(luò)中的相鄰的數(shù)據(jù)塊(范圍)的引用的有序序列。通過簡單地讀取其內(nèi)容并寫入帶有相同數(shù)據(jù)的新流(但是在新范圍中),可以復(fù)制流。然而,從一個(gè)范圍將大量的數(shù)據(jù)復(fù)制到另一范圍不僅是涉及多個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)的非常消耗網(wǎng)絡(luò)/磁盤的活動(dòng),而且,一個(gè)以上的流可以引用相同的范圍。可以簡單地通過復(fù)制范圍,將一個(gè)流的非常大的部分有效地復(fù)制到不同的流(可能不同的位置);此動(dòng)作是輕型的,不需要復(fù)制實(shí)際流數(shù)據(jù)內(nèi)容。此外,還可以由中心元數(shù)據(jù)服務(wù)器來維護(hù)執(zhí)行這種復(fù)制所要操縱的所有狀態(tài)。此模型的結(jié)果是,將流內(nèi)容的潛在大部分從一個(gè)流復(fù)制到另一個(gè)流可以作為原子多重修改的一部分來執(zhí)行,而不要求鎖保留較長時(shí)間??蛻魴C(jī)可以為許多目的使用此功能,包括流級(jí)聯(lián)、垃圾回收、日志/日記截?cái)?、單?shí)例化,以及創(chuàng)建別名。另外,可以將大量的不相關(guān)的操作批處理為原子多重修改,以減少完成一定量工作所需的事務(wù)的數(shù)量。由于元數(shù)據(jù)修改是耐久的事務(wù),因此,它們必須被冗余地提交永久性存儲(chǔ)器才能視為完成。耐久的存儲(chǔ)器(磁盤)提交操作的延遲/性能可以是事務(wù)處理系統(tǒng)的可縮放性/性能中的主要限制因素,將許多操作組合為單一提交的能力是有利的。同樣,由于服務(wù)器能夠在應(yīng)用任何更改之前檢查所有操作,因此,可以實(shí)現(xiàn)否則將不可能的優(yōu)化。根據(jù)一些實(shí)施例,本發(fā)明促進(jìn)表達(dá)“全或無”語義和“同時(shí)操作”?!叭驘o”語義保證了,如果多重修改中的任何操作失敗,那么,整個(gè)多重修改就失敗,被選擇用于修改的流的狀態(tài)將保持在開始多重修改之前的狀態(tài)。這可使客戶機(jī)依賴于狀態(tài)的一致性以及多重修改的原子性。多重修改系統(tǒng)中的同時(shí)操作可使某些修改集合在單一原子多重修改中發(fā)生, 如果操作嚴(yán)格地按順序執(zhí)行,將是困難的或者效率低。作為示例,可以在同一個(gè)多重修改中利用一個(gè)操作將流“A”重命名為“B”,在另一操作中將流“B”重命名為“A” (即,利用兩個(gè)操作在名稱空間中調(diào)換兩個(gè)流)。如果按順序執(zhí)行,這兩個(gè)操作將不會(huì)成功,因?yàn)榈谝徊僮饔捎诿Q空間沖突將失敗。按順序執(zhí)行調(diào)換將要求三個(gè)操作并引入臨時(shí)流名稱(即,將“A” 重命名為“C”,將“B”重命名為“A”,將“C”重命名為“B”)。如果在其他操作成功之后一個(gè)操作失敗,將使“逆轉(zhuǎn)”部分地完成的多重修改的過程復(fù)雜化(全或無語義)。將原子多重修改視為都同時(shí)應(yīng)用的操作的無序集,消除了客戶機(jī)表達(dá)中間一致狀態(tài)的必要性,可使服務(wù)器優(yōu)化原子多重修改的實(shí)現(xiàn)。根據(jù)本發(fā)明的進(jìn)一步的實(shí)施例,本發(fā)明提供使用原子多重修改實(shí)現(xiàn)簡單客戶機(jī)可訪問的分布式鎖和分布式租約的能力。流元數(shù)據(jù)包括失效時(shí)間屬性,除非延長了失效時(shí)間, 該屬性可以被用來導(dǎo)致流在指定時(shí)間間隔之后自動(dòng)被刪除。通過與原子多重修改結(jié)合使用失效時(shí)間,一組客戶機(jī)可以通過嘗試創(chuàng)建帶有商定的名稱的新的流,來為租約或鎖競爭,并可以通過延長成功地創(chuàng)建的流上的失效時(shí)間來延長租約??梢酝ㄟ^將自我創(chuàng)建的租約流的存在以及其對協(xié)商的名稱持續(xù)擁有作為額外的前提條件添加到多重修改中,有效地將租約 /鎖的所有權(quán)作為前提條件添加到任何其他流元數(shù)據(jù)原子多重修改。如果一個(gè)客戶機(jī)在持有租約/鎖時(shí)失敗,則當(dāng)其失效時(shí)間到達(dá)時(shí),可以自動(dòng)刪除租約或鎖文件,允許另一客戶機(jī)聲明租約。由于租約或鎖被表示成普通流,可用于流的工具和機(jī)制(例如,名稱空間組織、 訪問控制、瀏覽/查看等等)也固有地可用于租約和鎖。因此,本發(fā)明的一個(gè)實(shí)施例涉及體現(xiàn)了用于執(zhí)行作為單一原子單位執(zhí)行對一個(gè)或多個(gè)流的多重修改的方法的計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)可讀取的存儲(chǔ)介質(zhì)。選擇用于修改的一個(gè)或多個(gè)流,作為選定流。在與所選流流相關(guān)聯(lián)的一個(gè)或多個(gè)元數(shù)據(jù)上獲取鎖。從所選流解耦與選定流相關(guān)聯(lián)的名稱。對所選流執(zhí)行多個(gè)修改。將與所選流相關(guān)聯(lián)的名稱重新耦合到所選流。釋放與一個(gè)或多個(gè)選定流相關(guān)聯(lián)的元數(shù)據(jù)上的鎖。根據(jù)另一實(shí)施例,本發(fā)明涉及體現(xiàn)了用于執(zhí)行作為單一原子單位執(zhí)行對一個(gè)或多個(gè)流的多重修改的方法的計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)可讀取的存儲(chǔ)介質(zhì)。選擇用于修改的一個(gè)或多個(gè)流,作為選定流。在與所選流流相關(guān)聯(lián)的元數(shù)據(jù)上獲取鎖。從所選流分離與每一個(gè)選定流相關(guān)聯(lián)的名稱。對所選流執(zhí)行第一修改。確定如果執(zhí)行,第二修改會(huì)產(chǎn)生不一致性。逆轉(zhuǎn)對所選流的第一修改。將與所選流相關(guān)聯(lián)的名稱重新耦合到所選流。釋放與所選流相關(guān)聯(lián)的元數(shù)據(jù)上的鎖。根據(jù)再一個(gè)實(shí)施例,本發(fā)明涉及存儲(chǔ)了作為單一原子單位執(zhí)行對一個(gè)或多個(gè)流的多重修改的方法的計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)可讀介質(zhì)。選擇用于修改的一個(gè)或多個(gè)只加流,作為選定流。在與所選流相關(guān)聯(lián)的元數(shù)據(jù)上獲取鎖,其中,獲取鎖包括將帶有預(yù)定名稱的流修改為鎖流。從其相關(guān)聯(lián)的選定流,解耦與每一選定流相關(guān)聯(lián)的名稱。對所選流應(yīng)用第一修改。確定如果應(yīng)用,第二修改是否會(huì)產(chǎn)生不一致性。如果該修改將產(chǎn)生不一致性,那么,逆轉(zhuǎn)對所選流的第一修改。如果第二修改將不會(huì)產(chǎn)生不一致性,那么,對所選流應(yīng)用第二修改。將與所選流相關(guān)聯(lián)的名稱重新耦合到所選流。釋放與所選流相關(guān)聯(lián)的元數(shù)據(jù)上的鎖。已經(jīng)描述了本發(fā)明的各實(shí)施方式的概要,下面將描述其中可以實(shí)現(xiàn)本發(fā)明的各實(shí)施方式的示例性操作環(huán)境,以便為本發(fā)明的各個(gè)方面提供一般上下文。首先具體參考圖1, 典型的網(wǎng)絡(luò)拓?fù)?00包括多個(gè)互聯(lián)的網(wǎng)絡(luò)段101、102、103、104,每一段都連接到更大的網(wǎng)絡(luò)115。網(wǎng)絡(luò)段101具有參與數(shù)據(jù)存儲(chǔ)的主機(jī)106和兩個(gè)節(jié)點(diǎn)105,107。網(wǎng)絡(luò)段102具有參與數(shù)據(jù)存儲(chǔ)的兩個(gè)節(jié)點(diǎn)108,109。網(wǎng)絡(luò)段103具有參與數(shù)據(jù)存儲(chǔ)的主機(jī)111和兩個(gè)節(jié)點(diǎn) 110,112。最后,網(wǎng)絡(luò)段104具有參與數(shù)據(jù)存儲(chǔ)的兩個(gè)節(jié)點(diǎn)113,114。作為示例,網(wǎng)絡(luò)上的任何一個(gè)節(jié)點(diǎn)都可以充當(dāng)描述存儲(chǔ)在網(wǎng)絡(luò)中的流的元數(shù)據(jù)的位置,包括每一流中的范圍引用的列表,以及保留每一范圍的節(jié)點(diǎn)集。主機(jī)111和主機(jī)106 上的客戶機(jī)會(huì)話可能同時(shí)希望對具有存儲(chǔ)在節(jié)點(diǎn)112和節(jié)點(diǎn)109上的范圍實(shí)例的流執(zhí)行原子多重修改。節(jié)點(diǎn)110可能充當(dāng)元數(shù)據(jù)控制器。在此情況下,主機(jī)111和106兩者將同時(shí)向節(jié)點(diǎn)110發(fā)送對所希望的流的元數(shù)據(jù)進(jìn)行更改的請求,將發(fā)生賽跑。通過規(guī)定適當(dāng)?shù)那疤釛l件約束,無論哪一個(gè)節(jié)點(diǎn)始發(fā)了將被節(jié)點(diǎn)110成功地處理的第一請求,其將被允許修改與流相關(guān)聯(lián)的元數(shù)據(jù)。第二節(jié)點(diǎn)的請求將失敗,要求第二節(jié)點(diǎn)通過例如,放棄操作或從一致點(diǎn)重新啟動(dòng)來處理前提條件失敗。這是樂觀的并行性模型中所希望的行為。如果第一和第二節(jié)點(diǎn)需要協(xié)調(diào)涉及多個(gè)不同的事務(wù)的更加復(fù)雜的活動(dòng),則它們可以建立鎖和租約,包括對它們的多重修改請求中的專用鎖/租用流的前提條件和操縱,要求失敗的節(jié)點(diǎn)等到鎖被釋放才能執(zhí)行其修改?,F(xiàn)在參考圖2,示出了示例性節(jié)點(diǎn),并一般性地表示為計(jì)算設(shè)備200。計(jì)算設(shè)備200 只是合適的計(jì)算環(huán)境的一個(gè)示例,而非旨在對本發(fā)明的使用范圍或功能提出任何限制。計(jì)算設(shè)備200也不應(yīng)被解釋成對于所示出的任一組件或其組合有任何依賴或要求。本發(fā)明可以在計(jì)算機(jī)代碼或機(jī)器可使用指令(包括由計(jì)算機(jī)或諸如個(gè)人數(shù)據(jù)助理或其他手持式設(shè)備之類的其他機(jī)器執(zhí)行的諸如程序模塊之類的計(jì)算機(jī)可執(zhí)行指令)的一般上下文中來描述。一般而言,包括例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等的程序模塊是指執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的代碼。本發(fā)明可以在各種系統(tǒng)配置中實(shí)施,包括手持式設(shè)備、消費(fèi)電子產(chǎn)品、通用計(jì)算機(jī)、更專用計(jì)算設(shè)備等等。本發(fā)明也可以在其中任務(wù)由通過通信網(wǎng)絡(luò)鏈接的遠(yuǎn)程處理設(shè)備執(zhí)行的分布式計(jì)算環(huán)境中實(shí)施。參考圖2,計(jì)算設(shè)備200包括直接地或間接地耦合以下設(shè)備的總線201 網(wǎng)絡(luò)設(shè)備 202、CPU 203、存儲(chǔ)器204、存儲(chǔ)205,以及輸入/輸出(I/O)設(shè)備206。總線201表示一個(gè)或多個(gè)總線(諸如地址總線、數(shù)據(jù)總線或其組合)。雖然為了清楚起見利用線條示出了圖 2的各框,但是實(shí)際上,各組件的輪廓并不是那樣清楚,并且比喻性地來說,線條更精確地將是灰色的和模糊的。例如,許多處理器具有存儲(chǔ)器。我們認(rèn)識(shí)到這是本領(lǐng)域的特性,并重申, 圖2的圖示只是例示可以結(jié)合本發(fā)明的一個(gè)或多個(gè)實(shí)施例來使用的示例性計(jì)算設(shè)備。在諸如“工作站”、“服務(wù)器”、“膝上型計(jì)算機(jī)”、“手持式設(shè)備”等等之類的類別之間不進(jìn)行區(qū)別, 因?yàn)樗羞@些都在圖2的范圍內(nèi)并都被稱作“計(jì)算設(shè)備”或“節(jié)點(diǎn)”。計(jì)算設(shè)備200通常包括各種計(jì)算機(jī)可讀介質(zhì)。計(jì)算機(jī)可讀介質(zhì)可以是可以被計(jì)算設(shè)備200訪問的任何可用的介質(zhì),并包括易失性和非易失性介質(zhì),可移動(dòng)的和不可移動(dòng)的介質(zhì)。作為示例而非限制,計(jì)算機(jī)可讀介質(zhì)可以包括計(jì)算機(jī)存儲(chǔ)介質(zhì)和通信介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)可以包括以任何方法或技術(shù)實(shí)現(xiàn)的,用于存儲(chǔ)諸如計(jì)算機(jī)可讀的指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊之類的信息或其他數(shù)據(jù)的易失性和非易失性的,可移動(dòng)和不可移動(dòng)的介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括,但不僅限于,RAM、R0M、EEPR0M、閃存或其他存儲(chǔ)技術(shù),CD-ROM、數(shù)字多功能盤 (DVD)或其他光盤存儲(chǔ),磁帶盒、磁帶、磁盤存儲(chǔ)或其他磁存儲(chǔ)設(shè)備,或可以用來存儲(chǔ)所需信息并可由計(jì)算設(shè)備200訪問的任何其他介質(zhì)。存儲(chǔ)器204包括易失性存儲(chǔ)器形式的計(jì)算機(jī)存儲(chǔ)介質(zhì)。示例性硬件設(shè)備包括諸如 RAM之類的固態(tài)存儲(chǔ)器。存儲(chǔ)205包括非易失性存儲(chǔ)器形式的計(jì)算機(jī)存儲(chǔ)介質(zhì)。存儲(chǔ)器可以是可移動(dòng)的,不可移動(dòng)的,或兩者的組合。示例性硬件設(shè)備包括固態(tài)存儲(chǔ)器、硬盤驅(qū)動(dòng)器、 光盤驅(qū)動(dòng)器等等。計(jì)算設(shè)備100包括從諸如存儲(chǔ)器204、存儲(chǔ)205或I/O模塊206之類的各種實(shí)體讀取數(shù)據(jù)的一個(gè)或多個(gè)處理器(CPU) 203。I/O設(shè)備206允許計(jì)算設(shè)備200在邏輯上耦合到包括輸入組件和輸出組件在內(nèi)的其他設(shè)備,其中一些可以是內(nèi)置的。說明性組件包括話筒、操縱桿、游戲墊、碟形衛(wèi)星天線、掃描儀、打印機(jī)、無線設(shè)備等等。計(jì)算設(shè)備200包括促進(jìn)與其他網(wǎng)絡(luò)設(shè)備進(jìn)行通信的網(wǎng)絡(luò)設(shè)備202。網(wǎng)絡(luò)設(shè)備202充當(dāng)額外的I/O設(shè)備。本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到,可以以許多方式格式化存儲(chǔ)在叫做“節(jié)點(diǎn)”或存儲(chǔ)器節(jié)點(diǎn)的網(wǎng)絡(luò)中的數(shù)據(jù)。作為示例,諸如音樂文件、視頻文件、字處理文檔等等之類的獨(dú)立數(shù)據(jù)文件以分布式方式存儲(chǔ)是常見的。根據(jù)本發(fā)明的一個(gè)實(shí)施例,數(shù)據(jù)被建模為流的集合,可以將流集合組織成常規(guī)分層名稱空間。圖3將流300描繪為用于進(jìn)行數(shù)據(jù)存儲(chǔ)的示例性數(shù)據(jù)格式,根據(jù)本發(fā)明的一些實(shí)施例,可以對其進(jìn)行原子多重修改。流300是在邏輯上相關(guān)聯(lián)的數(shù)據(jù)集合。根據(jù)本發(fā)明的某些實(shí)施例,流300是只加的,其大小可以非常大,可能超過網(wǎng)絡(luò)節(jié)點(diǎn)的單個(gè)存儲(chǔ)容量的許多倍。通過句柄或名稱來訪問流300,諸如流300之類的每一流都具有保留和訪問策略。根據(jù)本發(fā)明的某些實(shí)施例,每一流還具有相關(guān)聯(lián)的全局唯一標(biāo)識(shí)符(GUID),該GUID在流的壽命內(nèi)是無法改變的(即,與名稱不同,名稱是可以修改的,GUID 永久地標(biāo)識(shí)其相關(guān)聯(lián)的流)。流300可以被視為,例如,字節(jié)的序列。流300由范圍301、 302,303的有序序列組成。范圍301、302、303是流300的分配單元。范圍301、302、303也是只加的,每一范圍301、302、303都以全局唯一標(biāo)識(shí)符(⑶ID)來進(jìn)行標(biāo)識(shí)??梢詫⒎秶?01、302、303分布到網(wǎng)絡(luò)中的許多節(jié)點(diǎn)。范圍301,302,303通常被復(fù)制,并可以將范圍301, 302,303的副本分布到網(wǎng)絡(luò)中的許多節(jié)點(diǎn)。范圍301,302,303具有大小限制(例如,2GB), 并且是用于許多目的的分區(qū)單位。范圍301,302,303的大小有時(shí)是受限制的,以便將流分割為可以并行地處理的塊,以便故障恢復(fù)、負(fù)載平衡、復(fù)制、搜索和/或數(shù)據(jù)挖掘。范圍的大小還可受存儲(chǔ)系統(tǒng)的故障恢復(fù)模式的限制。根據(jù)本發(fā)明的某些實(shí)施例,流300存儲(chǔ)對每一范圍和/或每一范圍的副本的位置的引用。例如,范圍301的副本存儲(chǔ)在節(jié)點(diǎn)304上,范圍302和303的實(shí)例兩者都存儲(chǔ)在節(jié)點(diǎn)305上。應(yīng)該注意,范圍是可以復(fù)制的。在這些情況下,可以在多個(gè)位置訪問范圍數(shù)據(jù), 位置是其副本的位置。范圍的GUID將不會(huì)變化,但是,其副本的號(hào)碼和位置可以隨著時(shí)間而變化。為簡明起見,此示例只說明了范圍不被復(fù)制的情況。存儲(chǔ)引用的一個(gè)優(yōu)點(diǎn)是,可以將范圍引用添加到流中,而不復(fù)制或移動(dòng)與范圍相關(guān)聯(lián)的任何數(shù)據(jù)。作為示例,如果將范圍 301的另一副本添加到流300中,則不需要改變或復(fù)制節(jié)點(diǎn)304上的數(shù)據(jù)。相反,將額外的范圍引用添加到已經(jīng)在流300中的范圍引用的列表中。根據(jù)本發(fā)明的一實(shí)施例的,通過元數(shù)據(jù)來表示流,元數(shù)據(jù)本身可以分布在網(wǎng)絡(luò)中, 或存儲(chǔ)在集中式服務(wù)器中。現(xiàn)在參考圖4,作為圖示,元數(shù)據(jù)400是包含有關(guān)流的信息的數(shù)據(jù)集合。根據(jù)本發(fā)明的某些實(shí)施例,與流相關(guān)聯(lián)的元數(shù)據(jù)400包括當(dāng)前與流401相關(guān)聯(lián)的名稱。流的名稱定位訪問數(shù)據(jù)的客戶機(jī)所使用的目錄結(jié)構(gòu)中的流。名稱可以隨著流被移動(dòng)和修改而改變。根據(jù)本發(fā)明的某些實(shí)施例,主機(jī)通過名稱401來訪問流。元數(shù)據(jù)400還包括⑶ID 402,它是全局唯一的,是永久地,排他地與流相關(guān)聯(lián)的標(biāo)識(shí)符(即,流的⑶ID 402 決不會(huì)改變,并且沒有兩個(gè)流共享同一個(gè)GUID)。與流相關(guān)聯(lián)的元數(shù)據(jù)400還包含構(gòu)成流的范圍引用403的列表。每一范圍引用403都標(biāo)識(shí)特定范圍,并允許客戶機(jī)或服務(wù)器定位網(wǎng)絡(luò)中的范圍的所有副本,提供對實(shí)際數(shù)據(jù)的物理訪問。原子多重修改涉及對一個(gè)或多個(gè)流執(zhí)行多次修改。作為示例,修改包括創(chuàng)建新的流、刪除流、重命名流、級(jí)聯(lián)兩個(gè)或更多流,創(chuàng)建現(xiàn)有流的副本,以及將一個(gè)流的范圍的子集復(fù)制到第二流。本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到,有許多可以組合使用的其他可能的修改,以構(gòu)成原子多重修改?,F(xiàn)在轉(zhuǎn)向圖5,考慮原子多重修改的一個(gè)示例。指令503的多重修改集包括將流501從“A”重命名為“B”,以及將流502從“B”重命名為“A”。本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到,使用標(biāo)準(zhǔn)數(shù)據(jù)復(fù)制方法將要求臨時(shí)存儲(chǔ)區(qū)來執(zhí)行這樣的修改,將在從故障恢復(fù)時(shí)產(chǎn)生復(fù)雜性,因?yàn)樵诎l(fā)生錯(cuò)誤的情況下恢復(fù)邏輯將需要清理臨時(shí)存儲(chǔ)區(qū),將進(jìn)一步需要確保兩個(gè)流501和流502在從故障恢復(fù)之后到達(dá)全局性一致的狀態(tài)。然而,根據(jù)本發(fā)明的一個(gè)實(shí)施例,好像一個(gè)步驟地執(zhí)行原子多重修改,從而簡化恢復(fù)邏輯,因?yàn)閮蓚€(gè)流501和流 502面臨故障時(shí)處于一致狀態(tài),而沒有臨時(shí)存儲(chǔ)區(qū)需要清理。作為示例,首先從它們的元數(shù)據(jù)中刪除流501和流502的名稱(分別是“A”和“B”),以便兩個(gè)流變?yōu)闊o名的。這將從流名稱空間解耦流,允許多重修改發(fā)生。執(zhí)行修改集503中的第一修改509。在此情況下,流501將被重命名為“B”。為此, 將流501的名稱設(shè)置為“B”,并將流501附加到流名稱空間。這會(huì)成功,而不會(huì)產(chǎn)生名稱空間沖突,因?yàn)楫?dāng)流502與流名稱空間分離時(shí),名稱“B”變得可用。還執(zhí)行修改集503中的第二修改512。在此情況下,流502將被重命名為“A”。為此,將流502的名稱設(shè)置為“A”,并將流502附加到流名稱空間。這會(huì)成功,而不會(huì)產(chǎn)生名稱空間沖突,因?yàn)楫?dāng)流501與流名稱空間分離時(shí),名稱“A”變得可用?,F(xiàn)在參考圖6,提供了示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的用于對一個(gè)或多個(gè)選定流執(zhí)行原子多重修改的方法600的流程圖。選擇用于修改的一個(gè)或多個(gè)流,如框601所示。 本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到,選擇流來進(jìn)行修改的方式有多種。作為示例,應(yīng)用程序可以提供流的列表,每一流都通過其當(dāng)前名稱或者GUID引用,這些流將被包括為選擇用于進(jìn)行修改的流。使用名稱和/或GUID的列表來查找每一個(gè)流的元數(shù)據(jù),包括與流相關(guān)聯(lián)的范圍引用的列表。根據(jù)本發(fā)明的某些實(shí)施例,還基于元數(shù)據(jù)中的信息,定位每一流的物理位置。在與選擇用于進(jìn)行修改的一個(gè)或多個(gè)流中的每一個(gè)相關(guān)聯(lián)的元數(shù)據(jù)上獲取鎖,以及被多重修改涵蓋的流名稱空間,如框602所示。一旦獲取了鎖,從它們的相應(yīng)的名稱分離用于刪除或重命名的所選流,如框603所示。根據(jù)本發(fā)明的某些實(shí)施例,以這樣一種方式促進(jìn)應(yīng)用多次修改,修改影響流就好像修改是同時(shí)發(fā)生的那樣。作為示例,流從相關(guān)聯(lián)的名稱的解耦是通過創(chuàng)建存儲(chǔ)了流GUID與每一個(gè)選定流的名稱的原始耦合的臨時(shí)映射來完成的。多重修改可以作為原子多重修改來進(jìn)行。雖然在圖6中示出了兩個(gè)修改,但是,本領(lǐng)域技術(shù)人員將認(rèn)識(shí)到,可以將許多修改結(jié)合起來,以形成作用于一個(gè)或多個(gè)選定流的單一原子多重修改。對一個(gè)或多個(gè)流執(zhí)行第一修改,如框604所示,并執(zhí)行第二修改,如框605 所示。根據(jù)本發(fā)明的某些實(shí)施例,進(jìn)行這些修改,以便它們看起來好像是同時(shí)發(fā)生的,而不是按順序發(fā)生的。作為示例,修改包括創(chuàng)建新的流、刪除流、重命名流、更新流的元數(shù)據(jù),創(chuàng)建現(xiàn)有流的副本,級(jí)聯(lián)兩個(gè)或更多流,以及將一個(gè)流的范圍的子集復(fù)制到第二流。一旦完成了原子多重修改中的所有修改,就將流重新耦合到名稱,如框606所示。 根據(jù)本發(fā)明的某些實(shí)施例,基于由應(yīng)用于對應(yīng)的流的每一個(gè)修改對臨時(shí)映射作出的更改, 將流名稱耦合到流。流的GUID被用來跟蹤這些變化,并影響重新耦合。釋放與一個(gè)或多個(gè)選定流中的每一個(gè)相關(guān)聯(lián)的元數(shù)據(jù)上的鎖,以及由多重修改涵蓋的流名稱空間,如框607 所示。現(xiàn)在轉(zhuǎn)向圖7,提供了示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的用于對一個(gè)或多個(gè)選定流執(zhí)行原子多重修改的方法700,其中,多重修改中的一修改不能成功地完成。在執(zhí)行構(gòu)成原子多重修改的多個(gè)修改的過程中,多個(gè)修改中的一個(gè)不能成功地完成是有可能的。作為示例,多重修改中的兩個(gè)修改都可能嘗試產(chǎn)生帶有相同名稱的流(例如,通過流創(chuàng)建或重命名)。因此,如果多重修改被允許成功,則所產(chǎn)生的狀態(tài)將取決于執(zhí)行修改的順序,沒有辦法好像同時(shí)的那樣執(zhí)行它們。一旦發(fā)現(xiàn)了這樣的情況,就逆轉(zhuǎn)到目前作為原子多重修改的一部分執(zhí)行的所有修改,并將流元數(shù)據(jù)復(fù)位到開始原子多重修改之前的狀態(tài)。類似于圖 6的方法600,選擇一個(gè)或多個(gè)流,以便對它們應(yīng)用原子多重修改,如框701所示,在與每一個(gè)選定流相關(guān)聯(lián)的元數(shù)據(jù)上獲取鎖,如框702所示。將每一選定流從其相關(guān)聯(lián)的名稱解耦,如框703所示,對一個(gè)或多個(gè)選定流應(yīng)用第一修改,如框704所示,類似于圖6的框603和604。作出對所選流的第二修改將不會(huì)成功地完成的確定,如框705所示。本領(lǐng)域技術(shù)人員將認(rèn)識(shí)到,有許多方式可以進(jìn)行這樣的確定。根據(jù)本發(fā)明的某些實(shí)施例,使用臨時(shí)可逆變異的歷史來另外提供用于逆轉(zhuǎn)執(zhí)行原子多重修改過程中的任何步驟的機(jī)制。一旦確定將在應(yīng)用原子多重修改中產(chǎn)生失敗,就逆轉(zhuǎn)應(yīng)用的修改,如框706所示。在逆轉(zhuǎn)對所選流進(jìn)行的任何修改之后,將流與它們的相應(yīng)的原始名稱重新耦合,刪除新創(chuàng)建的流,如框707所示。一旦逆轉(zhuǎn)了修改,將流與它們的原始名稱重新耦合,并刪除新創(chuàng)建的流,就釋放鎖,如框708所示,類似于圖6中的框607。根據(jù)本發(fā)明的一些實(shí)施例,在圖8的流程圖中描繪了用于對一個(gè)或多個(gè)選定流執(zhí)行原子多重修改的方法。如果檢測到構(gòu)成原子多重修改的多個(gè)修改中的一個(gè)將失敗,則中止原子多重修改,并將流返回到開始原子多重修改之前的狀態(tài)。選擇用于修改的一個(gè)或多個(gè)流,如框801所示,獲取與所選流相關(guān)聯(lián)的元數(shù)據(jù)上的鎖,如框802所示,類似于圖6的框 601 和 602。從其相關(guān)聯(lián)的名稱解耦用于刪除或重命名的每一流,如框803所示,并執(zhí)行第一修改,如框804所示,類似于圖6的框603和604。然后,確定應(yīng)用第二修改是否將不能成功地完成,如框805所示??梢砸灶愃朴趫D7的框705的確定方式進(jìn)行此確定。例如,如果應(yīng)用第二修改會(huì)將一個(gè)流與已經(jīng)通過第一修改或者在前面的事務(wù)中與另一流相關(guān)聯(lián)的名稱相關(guān)聯(lián),則確定第二修改將不會(huì)成功地完成。如果確定第二修改可以成功地執(zhí)行,然后,執(zhí)行第二修改,如框806所示,將流重新耦合到它們的最后的相關(guān)聯(lián)的名稱,如框808所示,釋放與被選擇用于修改的流相關(guān)聯(lián)的元數(shù)據(jù)上的鎖,以及流名稱空間,如框809所示??梢苑謩e類似于圖6的步驟605、606,以及607執(zhí)行這些步驟中的每一個(gè)。然而,如果確定第二修改將失敗,那么,逆轉(zhuǎn)第一修改,如框807所示,將流重新耦合到它們的原始相關(guān)聯(lián)的名稱,如框808所示,刪除任何新創(chuàng)建的流,釋放與選擇用于修改的流相關(guān)聯(lián)的元數(shù)據(jù)上的鎖,以及流名稱空間,如框809所示。可以分別類似于圖7的步驟 706,707,以及708執(zhí)行這些步驟中的每一個(gè)。作為圖示,圖9示出了執(zhí)行多重修改的一個(gè)示例。圖9的示例包括描繪系統(tǒng)中的狀態(tài)的“校驗(yàn)點(diǎn)+日志”系統(tǒng)的實(shí)現(xiàn)。在這樣的系統(tǒng)中,系統(tǒng)狀態(tài)通過包含叫做“校驗(yàn)點(diǎn)”的完全狀態(tài)信息的快照以及包含自從最后已知的校驗(yàn)點(diǎn)以來作出的更改的各種較小的增量來表示。日志包含這些增量的列表。為到達(dá)系統(tǒng)的當(dāng)前狀態(tài),客戶機(jī)將對最后的快照應(yīng)用日志中的最后的快照之后發(fā)生的所有增量。最近的快照之前發(fā)生的快照和增量都舊了,并且不再需要;因此,垃圾回收過程可以周期性地刪除舊的快照和增量。本領(lǐng)域技術(shù)人員將認(rèn)識(shí)到,原子多重修改有許多其他系統(tǒng)應(yīng)用。例如,考慮存儲(chǔ)了相冊的系統(tǒng),其中,該相冊利用三個(gè)流來表示ALBUM. CHECKPOINTS 901, ALBUM. DELTA 902,以及 ALBUM. DATA 903。ALBUM. CHECKPOINTS Θ01 存儲(chǔ)所有照片的完整列表,以及相冊中的特定時(shí)間點(diǎn)的注釋。照片的刪除和添加存儲(chǔ)在ALBUM. DELTA 902中。實(shí)際照片存儲(chǔ)在ALBUM. DATA 903中。此相冊可以被成千上萬客戶機(jī)同時(shí)訪問,每一客戶機(jī)都添加新的照片、編輯和替換照片,刪除照片,重命名照片,注解照片等等。周期性地,ALBUM. DELTA 902文件變得非常大,并導(dǎo)致客戶機(jī)遇到長的加載時(shí)間。同樣, ALBUM. DATA 903中的范圍可能不再具有從任何最近校驗(yàn)點(diǎn)以來的任何引用,或者增量(例如,那些范圍中的照片已經(jīng)被刪除)。成千上萬的客戶機(jī)中的每一個(gè)都可以訪問這些流中的每一個(gè)。垃圾回收過程可以最終決定從流中刪除不需要的項(xiàng)。例如,假設(shè)ALBUM. CHECKPOINTS 901包括兩個(gè)范圍,第一范圍帶有舊校驗(yàn)點(diǎn)904,第二范圍帶有最新的校驗(yàn)點(diǎn)905。可以刪除舊校驗(yàn)點(diǎn),因?yàn)樾碌男r?yàn)點(diǎn)包含完整的系統(tǒng)快照。ALBUM. DELTA 902還包括多個(gè)范圍。對于此示例,假設(shè)自從當(dāng)前校驗(yàn)點(diǎn)905以來的相關(guān)增量都在ALBULM. DELTA的最后一個(gè)范圍906中。ALBUM. DATA 903 包含許多范圍,在它們之間分散著沒有引用流的范圍;換言之,可以被刪除的范圍。例如,只有帶有ID R、S、Y Z(912,913,914,915)的范圍將被保留ALBUM. DATA流中。為清理不需要的范圍,垃圾回收過程可以執(zhí)行下面的修改從ALBUM. CHECKPOINTS 901刪除舊的范圍,從 ALBUM. DELTA 902 刪除舊的范圍,并刪除 ALBUM. DATA 903 中的在 ALBUM. CHECKPOINTS 901 和ALBUM. DELTA 902中的剩余范圍中沒有被引用的任何范圍。垃圾回收過程可以使用原子多重修改來完成這些修改。垃圾回收過程可以使用的原子多重修改的示例包含下面的修改。修改1 創(chuàng)建名為 ALBUM. CHECKPOINTS 907 的新的流,刪除帶有 STREAM_ID ABCD 901 的流,并將 EXTENT_ID B 910附加到被指定了 ID QRST的新的流。修改2 創(chuàng)建名為ALBUM. DELTA 908的新的流,刪除帶有 STREAM_ID AFDE 902 的流,并將 EXTENT_ID L 911 附加到被指定了 STREAM_IDVCDE 的新的流。修改3 創(chuàng)建名為ALBUM. DATA 909的新的流,刪除帶有STREAM_ID DEFF 903的流,并將 EXTENT_ID R 912、EXTENT_ID S 913、EXTENT_ID Y 914 以及 EXTENT_ID Z 915 附加到被指定了 ID RSTV的新的流。因?yàn)樗行薷亩际且栽臃绞綀?zhí)行的,客戶機(jī)決不會(huì)具有相冊的不一致的視圖。在此特定示例中,在單獨(dú)的多重修改事務(wù)中修改這些流中的每一個(gè)在邏輯上也是正確的。由于效率原因(減少事務(wù)的數(shù)量),在單一多重修改事務(wù)中修改這些流。但是本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到有多個(gè)流必須在一個(gè)原子事務(wù)中修改的情況,以確保這些流之間的一致性,在這些情況下可以使用多重修改支持。在不偏離本發(fā)明的精神和范圍的情況下,所描繪的各種組件的許多不同的布局, 以及未示出的組件也是可以的。所描述的本發(fā)明的各實(shí)施例旨在是說明性的而非限制性的。不偏離其范圍的備選實(shí)施例對于本領(lǐng)域的技術(shù)人員是顯而易見的。在不偏離本發(fā)明的范圍的情況下,精通技術(shù)的人員可以開發(fā)用于實(shí)現(xiàn)如前所述的改進(jìn)的備選裝置??梢岳斫猓承┨卣骱妥咏M合是有用的,并且可以在不參考其他特征和子組合的情況下使用,它們都在權(quán)利要求書的范圍內(nèi)。并非各種圖形中所列出的所有步驟都需要按所描述的特定的順序執(zhí)行。
權(quán)利要求
1.存儲(chǔ)了計(jì)算機(jī)可執(zhí)行指令的一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì),所述計(jì)算機(jī)可執(zhí)行指令用于執(zhí)行對一個(gè)或多個(gè)流作為單一原子單位的多重修改的方法,所述方法包括選擇(601) —個(gè)或多個(gè)流用于作為一個(gè)或多個(gè)選定流來進(jìn)行修改; 獲取(602)與所述一個(gè)或多個(gè)選定流相關(guān)聯(lián)的一個(gè)或多個(gè)元數(shù)據(jù)上的鎖; 從與每一流相關(guān)聯(lián)的一個(gè)或多個(gè)名稱解耦(603)所述一個(gè)或多個(gè)選定流中的每一個(gè); 對所述一個(gè)或多個(gè)選定流執(zhí)行(604,605)多重修改;將所述一個(gè)或多個(gè)選定流中的每一個(gè)耦合(606)到與每一流相關(guān)聯(lián)的至少一個(gè)名稱;以及釋放(607)所述一個(gè)或多個(gè)選定流的所述一個(gè)或多個(gè)元數(shù)據(jù)上的所述鎖。
2.如權(quán)利要求1所述的介質(zhì),其特征在于,所述一個(gè)或多個(gè)流是只加流。
3.如權(quán)利要求1所述的介質(zhì),其特征在于,所述解耦包括維護(hù)臨時(shí)映射,所述臨時(shí)映射存儲(chǔ)了所述一個(gè)或多個(gè)選定流中的每一個(gè)從與每一流相關(guān)聯(lián)的所述名稱的原始耦合。
4.如權(quán)利要求3所述的介質(zhì),其特征在于,所述臨時(shí)映射基于所述一個(gè)或多個(gè)流中的每一個(gè)的GUID。
5.如權(quán)利要求1所述的介質(zhì),其特征在于,所述多重修改包括以下一個(gè)或多個(gè)創(chuàng)建新的流,附加到現(xiàn)有流,創(chuàng)建現(xiàn)有流的副本,刪除流,重命名流,更新流的所述元數(shù)據(jù),以及將流的范圍的子集復(fù)制到第二流。
6.如權(quán)利要求1所述的介質(zhì),其特征在于,所述重新耦合包括將所述一個(gè)或多個(gè)選定流中的一個(gè)或多個(gè)GUID與所述一個(gè)或多個(gè)名稱相關(guān)聯(lián)。
7.如權(quán)利要求6所述的介質(zhì),其特征在于,所述重新耦合包括在標(biāo)識(shí)流的一個(gè)或多個(gè) GUID和一個(gè)或多個(gè)名稱之間使用臨時(shí)映射。
8.如權(quán)利要求1所述的介質(zhì),其特征在于,所述多個(gè)修改通過改變指向范圍的一個(gè)或多個(gè)指針而不移動(dòng)所述一個(gè)或多個(gè)范圍的數(shù)據(jù),來影響所述一個(gè)或多個(gè)選定流。
9.存儲(chǔ)了計(jì)算機(jī)可執(zhí)行指令的一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì),所述計(jì)算機(jī)可執(zhí)行指令用于執(zhí)行對一個(gè)或多個(gè)流作為單一原子單位的多重修改的方法,所述方法包括選擇(701) —個(gè)或多個(gè)流用于作為一個(gè)或多個(gè)選定流來進(jìn)行修改;獲取(702)與所述一個(gè)或多個(gè)選定流相關(guān)聯(lián)的一個(gè)或多個(gè)元數(shù)據(jù)上的鎖;從與每一流相關(guān)聯(lián)的名稱解耦(703)所述一個(gè)或多個(gè)選定流中的每一個(gè);對所述一個(gè)或多個(gè)選定流執(zhí)行(704)多重修改中的第一修改;確定(705)對所述一個(gè)或多個(gè)選定流的多重修改中的第二修改將產(chǎn)生不一致性;逆轉(zhuǎn)(706)對所述一個(gè)或多個(gè)選定流的多重修改中的所述第一修改;將所述一個(gè)或多個(gè)選定流中的每一個(gè)耦合(707)到與每一流相關(guān)聯(lián)的至少一個(gè)名稱;以及釋放(708)所述一個(gè)或多個(gè)選定流的所述一個(gè)或多個(gè)元數(shù)據(jù)上的所述鎖。
10.如權(quán)利要求9所述的介質(zhì),其特征在于,所述一個(gè)或多個(gè)流是只加的。
11.如權(quán)利要求9所述的介質(zhì),其特征在于,所述解耦包括維護(hù)臨時(shí)映射,所述臨時(shí)耦合存儲(chǔ)了所述一個(gè)或多個(gè)選定流中的每一個(gè)從與每一流相關(guān)聯(lián)的所述名稱的原始耦合。
12.如權(quán)利要求11所述的介質(zhì),其特征在于,所述多個(gè)修改影響所述臨時(shí)映射中的一個(gè)或多個(gè)變化。
13.如權(quán)利要求11所述的介質(zhì),其特征在于,所述多重修改中的每一個(gè)產(chǎn)生所述臨時(shí)映射的新副本,在應(yīng)用與所述臨時(shí)映射的所述新副本相關(guān)聯(lián)的所述多重修改中的一次修改之后,每一副本指出所述一個(gè)或多個(gè)選定流的快照。
14.如權(quán)利要求11所述的介質(zhì),其特征在于,所述逆轉(zhuǎn)多重修改中的所述第一修改包括逆轉(zhuǎn)對所述選定流中的每一個(gè)的更改。
15.如權(quán)利要求11所述的介質(zhì),其特征在于,所述重新耦合使用存儲(chǔ)所述原始耦合的所述臨時(shí)映射來將所述一個(gè)或多個(gè)選定流中的每一個(gè)重新耦合到與每一流相關(guān)聯(lián)的所述名稱。
16.如權(quán)利要求9所述的介質(zhì),其特征在于,所述多重修改包括以下一個(gè)或多個(gè)創(chuàng)建新的流,附加到現(xiàn)有流,創(chuàng)建現(xiàn)有流的副本,刪除流,重命名流,更新流的所述元數(shù)據(jù),以及將流的范圍的子集復(fù)制到第二流。
17.如權(quán)利要求9所述的介質(zhì),其特征在于,所述多個(gè)修改通過改變指向范圍的一個(gè)或多個(gè)指針而不移動(dòng)所述一個(gè)或多個(gè)范圍的數(shù)據(jù),來影響所述一個(gè)或多個(gè)選定流。
18.存儲(chǔ)了計(jì)算機(jī)可執(zhí)行指令的一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì),所述計(jì)算機(jī)可執(zhí)行指令用于執(zhí)行對一個(gè)或多個(gè)流作為單一原子單位的多重修改的方法,所述方法包括選擇(801) —個(gè)或多個(gè)只加流用于作為一個(gè)或多個(gè)選定流來進(jìn)行修改; 獲取(802)與所述一個(gè)或多個(gè)選定流相關(guān)聯(lián)的一個(gè)或多個(gè)元數(shù)據(jù)上的鎖,其中獲取所述鎖包括將帶有預(yù)定的名稱的流修改為鎖流;從與每一流相關(guān)聯(lián)的一個(gè)或多個(gè)名稱解耦(803)所述一個(gè)或多個(gè)選定流中的每一個(gè); 對所述一個(gè)或多個(gè)選定流執(zhí)行(804)多重修改中的第一修改; 確定(805)對所述一個(gè)或多個(gè)選定流的多重修改中的第二修改是否將產(chǎn)生不一致性; 如果多重修改中的所述第二修改將產(chǎn)生不一致性,則逆轉(zhuǎn)(807)對所述一個(gè)或多個(gè)選定流的多重修改中的所述第一修改;如果多重修改中的所述第二修改將不會(huì)產(chǎn)生不一致性,則執(zhí)行(806)對所述一個(gè)或多個(gè)選定流的多重修改中的第二修改;將所述一個(gè)或多個(gè)選定流中的每一個(gè)耦合(808)到與每一流相關(guān)聯(lián)的至少一個(gè)名稱;以及釋放(809)所述一個(gè)或多個(gè)選定流的所述一個(gè)或多個(gè)元數(shù)據(jù)上的所述鎖。
19.如權(quán)利要求18所述的介質(zhì),其特征在于,所述多個(gè)修改通過改變指向范圍的一個(gè)或多個(gè)指針而不移動(dòng)所述一個(gè)或多個(gè)范圍的數(shù)據(jù),來影響所述一個(gè)或多個(gè)選定流。
20.如權(quán)利要求18所述的介質(zhì),其特征在于,所述多重修改包括以下一個(gè)或多個(gè)創(chuàng)建新的流,附加到現(xiàn)有流,創(chuàng)建現(xiàn)有流的副本,刪除流,重命名流,更新流的所述元數(shù)據(jù),以及將流的范圍的子集復(fù)制到第二流。
全文摘要
提供了對流的原子多重修改。選擇流,以便應(yīng)用原子多重修改。在與流相關(guān)聯(lián)的元數(shù)據(jù)上獲取鎖。將每一流從其名稱分離。對所選流應(yīng)用多重修改。在執(zhí)行修改之后,名稱被耦合到流。釋放與每一流相關(guān)聯(lián)的元數(shù)據(jù)上的鎖。
文檔編號(hào)G06F9/06GK102197365SQ200980142635
公開日2011年9月21日 申請日期2009年10月15日 優(yōu)先權(quán)日2008年10月24日
發(fā)明者B·G·卡爾德, J·王, S·J·麥凱爾維, X·吳 申請人:微軟公司