4]在某個(gè)時(shí)刻,在首先驗(yàn)證了其擁有共享資源的最新版本之后,節(jié)點(diǎn)410可以通過例如將共享資源的本地副本復(fù)制在共享存儲(chǔ)系統(tǒng)430上,來將其本地緩存450沖刷至集群400。在這種情況下,節(jié)點(diǎn)410傳輸指示共享資源的中心副本是最新的集群事件通知。其他節(jié)點(diǎn)412-416可以通過刪除、廢棄、或者以其他方式忽略對(duì)應(yīng)于共享資源的先前改變?nèi)罩緱l目,來對(duì)這個(gè)通知進(jìn)行響應(yīng)。在一些實(shí)施例中,這樣的集群事件通知可以與其他集群事件通知一樣作為條目被添加到節(jié)點(diǎn)412-416的本地改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)442-446,并且可以結(jié)合由用于共享資源的這些節(jié)點(diǎn)412-416和源節(jié)點(diǎn)先前獲得的其他集群事件通知一起來考慮。在其他說明性實(shí)施例中,指示共享資源的沖刷的集群事件通知的接收發(fā)起了在其他節(jié)點(diǎn)412-416中的一種過程,該過程用以移除或廢棄它們的本地改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)442-446中的對(duì)應(yīng)于共享資源和源節(jié)點(diǎn)的條目。
[0065]圖5是圖示了根據(jù)一個(gè)說明性實(shí)施例的用于訪問已經(jīng)具有對(duì)共享資源的鎖定的共享資源的操作的示例框圖。對(duì)應(yīng)于圖4中的元件的圖5中的元件利用類似的附圖標(biāo)號(hào)。
[0066]如圖5中所示出的,當(dāng)節(jié)點(diǎn)412上的過程510希望訪問共享資源時(shí),節(jié)點(diǎn)412首先針對(duì)與尋求訪問的共享資源相對(duì)應(yīng)的條目來檢查其本地改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)442。例如,使用共享資源的UHD,執(zhí)行對(duì)本地改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)442的搜索,以識(shí)別對(duì)應(yīng)于共享資源的最近的改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)442條目。可以基于匹配共享資源UUID的條目的陳舊指示符的比較來識(shí)別最近的改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)442條目。最近改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)442條目可以然后被分析以確定共享資源的本地緩存的副本目前是否處于陳舊狀態(tài)。如果不是,則節(jié)點(diǎn)412可以進(jìn)行對(duì)共享資源的其本地緩存的副本的操作。
[0067]如果最近的改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)442條目指示共享資源的最新版本實(shí)際上由例如節(jié)點(diǎn)410的另一節(jié)點(diǎn)保持,貝U尋求訪問共享資源的節(jié)點(diǎn)412可以向節(jié)點(diǎn)410發(fā)送控制消息,以強(qiáng)制對(duì)節(jié)點(diǎn)410的共享資源的本地緩存的寫入的同步。對(duì)同步的強(qiáng)制可能涉及使得節(jié)點(diǎn)410將其本地緩存450沖刷至集群400,使得該共享資源的本地副本被復(fù)制到共享存儲(chǔ)系統(tǒng)430。作為強(qiáng)制的同步的結(jié)果,節(jié)點(diǎn)410傳輸集群事件通知,指示以先前在上面描述的方式對(duì)共享資源的沖刷。節(jié)點(diǎn)410可以在稍晚時(shí)間發(fā)起緩存和更新的過程,但是在此時(shí),節(jié)點(diǎn)412可以以上面關(guān)于圖4描述的方式使用本地緩存的副本來訪問共享資源。
[0068]應(yīng)當(dāng)理解,盡管關(guān)于集群400的節(jié)點(diǎn)410-416中的每個(gè)節(jié)點(diǎn)保持它們自己的改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)的實(shí)施例描述了圖4和圖5,但是說明性實(shí)施例不限于此。相反地,如上面注意到的,在一些說明性實(shí)施例中,一個(gè)或多個(gè)改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)的集中式集合可以例如諸如經(jīng)由集中式服務(wù)器計(jì)算設(shè)備416而與共享資源相關(guān)聯(lián)。因此,在這樣的實(shí)施例中,不是在由節(jié)點(diǎn)對(duì)共享資源的本地緩存的副本執(zhí)行寫入時(shí)廣播集群事件通知,而是集群事件通知可以被傳輸?shù)郊惺椒?wù)器計(jì)算設(shè)備用于在更新對(duì)應(yīng)于共享資源的改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)中使用。
[0069]應(yīng)當(dāng)理解,對(duì)說明性實(shí)施例的上述描述假設(shè)需要將共享資源的最新副本沖刷至共享存儲(chǔ)系統(tǒng)430,以便用于另一節(jié)點(diǎn)獲得對(duì)共享資源的最近版本的訪問。然而,說明性實(shí)施例不限于此。相反地,如上面注意到的,在一些說明性實(shí)施例中,希望對(duì)共享資源進(jìn)行操作的節(jié)點(diǎn)可以請(qǐng)求處理共享資源的最新版本的節(jié)點(diǎn)充當(dāng)用于被執(zhí)行的操作的代理或替代物。
[0070]如上面注意到的,說明性實(shí)施例填充和利用一個(gè)或多個(gè)改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)。圖6是根據(jù)一個(gè)說明性實(shí)施例的改變?nèi)罩镜臄?shù)據(jù)結(jié)構(gòu)的一個(gè)示例。改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)600中的條目可以包括:標(biāo)識(shí)被改變的資源的資源標(biāo)識(shí)符610 (例如,UUID)、標(biāo)識(shí)執(zhí)行由資源標(biāo)識(shí)符610標(biāo)識(shí)的資源的改變或更新的源節(jié)點(diǎn)的源節(jié)點(diǎn)標(biāo)識(shí)符612、標(biāo)識(shí)該條目與改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)600中的相同資源的其他條目相比的相對(duì)陳舊的陳舊指示符614(例如,時(shí)間戳、單調(diào)增加的版本號(hào)等)、以及指示資源的官方源副本是否已經(jīng)被更新為最新版本的更新指示符616 (例如,布爾值)??梢皂憫?yīng)于由節(jié)點(diǎn)在它們對(duì)它們的資源的本地緩存的副本執(zhí)行寫入或更新時(shí)發(fā)送的通知來生成改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)600中的條目,并且可以在執(zhí)行將資源的本地緩存副本沖刷回給集群時(shí)被更新(即,對(duì)更新指示符616進(jìn)行更新)。
[0071]圖7是概述了根據(jù)一個(gè)說明性實(shí)施例的由集群的節(jié)點(diǎn)對(duì)共享資源執(zhí)行讀取/寫入操作的示例操作的流程圖。如圖7中所示出的,操作開始于節(jié)點(diǎn)發(fā)起用于訪問共享資源的訪問操作(步驟702)。基于所發(fā)起的對(duì)共享資源的訪問的類型來做出確定,即讀取或?qū)懭朐L問(步驟705)。如果訪問是讀取訪問,則操作獲取對(duì)共享資源的讀取鎖定(步驟710)。如果訪問是寫入訪問,則操作獲取對(duì)共享資源的全集群寫入鎖定(步驟715)。
[0072]無論訪問是讀取還是寫入,都關(guān)于節(jié)點(diǎn)是否具有共享資源的本地緩存的副本而做出確定(步驟720)。如果節(jié)點(diǎn)具有共享資源的本地緩存的副本,則關(guān)于用于共享資源的最新改變?nèi)罩緱l目是否指示共享資源的本地緩存的副本是陳舊的而做出確定(步驟725)。如果本地緩存的副本是陳舊的,或者如果不存在本地緩存的副本(步驟720),則(從日志條目)識(shí)別保持共享資源的最新版本的節(jié)點(diǎn)(步驟730)。從在步驟730中識(shí)別的節(jié)點(diǎn)將共享資源的最新版本下載到節(jié)點(diǎn)的本地緩存(步驟735)。
[0073]此后,或者響應(yīng)于本地緩存具有共享資源的最新版本,關(guān)于訪問操作是讀取還是寫入再次做出確定(步驟740)。應(yīng)當(dāng)注意,步驟740中的決定將匹配步驟705中的決定的結(jié)果,即,不可能對(duì)于步驟705確定訪問操作是讀取/寫入,并且步驟740決定該訪問操作是讀取/寫入中的另一個(gè)。如果訪問是讀取訪問操作,則對(duì)共享資源的本地緩存的副本執(zhí)行讀取操作(步驟745),并且然后釋放讀取鎖定(步驟750)。如果訪問是寫入訪問操作,則對(duì)共享資源的本地緩存的副本執(zhí)行寫入操作(步驟755),根據(jù)先前描述的說明性實(shí)施例來向集群中的其他節(jié)點(diǎn)傳輸事件通知(步驟760),并且然后釋放寫入鎖定(步驟770)。操作然后終止。
[0074]在圖7的上述操作流程中,應(yīng)當(dāng)理解,步驟710、715、745和765是指鎖定獲取/釋放的機(jī)制,這通常是公知的概念,并且因此,不需要關(guān)于如何準(zhǔn)確地具體執(zhí)行鎖定獲取和釋放的進(jìn)一步解釋。在步驟720中,所確定的是共享資源的本地緩存的副本是否存在,并且如果不存在,則節(jié)點(diǎn)能夠跳過確定緩存的副本是否是最新版本的嘗試,因?yàn)槠湓诒镜鼐彺嬷胁痪哂泄蚕碣Y源的任何版本。替代地,操作直接跳轉(zhuǎn)到確定共享資源的最新版本當(dāng)前位于何處(步驟730)并且將其下載到當(dāng)前節(jié)點(diǎn)的本地緩存中(步驟735)。
[0075]另一方面,如果在步驟720中確定了節(jié)點(diǎn)已經(jīng)具有本地緩存的副本,則該節(jié)點(diǎn)看向其本地改變?nèi)罩疽约案淖內(nèi)罩局袑?duì)應(yīng)于共享資源的條目,以確定本地緩存的副本是否是陳舊的(步驟725)。如果共享資源的本地緩存的副本不是陳舊的(即,節(jié)點(diǎn)的本地副本是共享資源的最新副本),則該節(jié)點(diǎn)能夠跳過獲取最新版本,并且直接進(jìn)行到開始于步驟740的序列,由此節(jié)點(diǎn)對(duì)例如文件的共享資源進(jìn)行操作。如果節(jié)點(diǎn)的共享資源的本地副本是陳舊的,則該節(jié)點(diǎn)需要做同樣的事情,就像它起初就不具有本地緩存的副本,即確定最新版本在何處并且將其下載到節(jié)點(diǎn)的本地緩存(步驟730和735)。
[0076]開始于步驟740的操作序列是其中節(jié)點(diǎn)知道其在其自己的本地緩存中具有共享資源的最新版本,并且因此,能夠?qū)蚕碣Y源的本地緩存的副本執(zhí)行期望的訪問操作。如果節(jié)點(diǎn)正在執(zhí)行讀取操作,則該節(jié)點(diǎn)能夠執(zhí)行這個(gè)操作(步驟745)并且釋放讀取鎖定(步驟750) ο在這種情況下事件通知不是必要的,因?yàn)楣蚕碣Y源沒有由讀取操作改變。另一方面,如果該節(jié)點(diǎn)正在執(zhí)行寫入操作,則對(duì)共享資源的節(jié)點(diǎn)的本地緩存的副本執(zhí)行寫入操作(步驟755),并且事件通知被傳輸?shù)郊旱钠渌?jié)點(diǎn),指示共享資源已經(jīng)被改變(步驟760),并且寫入鎖定被釋放(步驟765)。
[0077]如上面所描述的,事件通知包括同步的可靠的“事件”,由此保證集群中的每個(gè)參與節(jié)點(diǎn)在上述流程進(jìn)行超過步驟760之前接收到數(shù)據(jù)報(bào)。在說明性實(shí)施例中,事件通知數(shù)據(jù)報(bào)包括:(a)被改變的資源的標(biāo)識(shí)(例如UUID),(b)源節(jié)點(diǎn)的標(biāo)識(shí)(該節(jié)點(diǎn)執(zhí)行對(duì)共享資源的更新或改變)的標(biāo)識(shí),(c)陳舊指示符,例如時(shí)間戳,如果集群是時(shí)間同步的則或者是單調(diào)增加的版本號(hào)。在一個(gè)說明性實(shí)施例中,經(jīng)由可靠的同步信道(諸如AHAFS等)來向每個(gè)參與節(jié)點(diǎn)傳輸該數(shù)據(jù)報(bào),并且每個(gè)節(jié)點(diǎn)通過將其內(nèi)容存儲(chǔ)在本地改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)中來對(duì)接收到這個(gè)數(shù)據(jù)報(bào)做出反應(yīng)。在不同的實(shí)施例中,該數(shù)據(jù)報(bào)被附加到駐留在中央存儲(chǔ)位置中改變?nèi)罩荆⑶腋鱾€(gè)節(jié)點(diǎn)不需要采取動(dòng)作直到/除非它們需要作用于相同的資源。
[0078]在步驟725和730中,希望對(duì)特定的共享資源進(jìn)行操作的節(jié)點(diǎn)必須咨詢改變?nèi)罩?,并且找到屬?如由改變?nèi)罩緱l目中的標(biāo)識(shí)(a)所識(shí)別的)該共享資源的最新(根據(jù)改變?nèi)罩緱l目中的陳舊指示符(C),例如,時(shí)間戳或版本號(hào))條目。簡(jiǎn)單地,在本地環(huán)境中或者在集中式存儲(chǔ)位置處,公知的技術(shù)被用來過濾改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu),使得僅考慮具有相關(guān)的(a)資源UUID的條目,并且對(duì)這些條目進(jìn)行分類使得僅考慮根據(jù)(C)陳舊指示符的最新的條目。已經(jīng)以這種方式分離出單個(gè)日志條目,源節(jié)點(diǎn)的標(biāo)識(shí)(b)指示保持期望資源的最新版本的節(jié)點(diǎn)的標(biāo)識(shí)。
[0079]除了上面所概述的操作之外,還存在兩種特殊情況要考慮。第一種特殊情況是,如果在改變?nèi)罩緮?shù)據(jù)結(jié)構(gòu)中沒有找到匹配條目。這意味著,所考慮的共享資源還沒有被本地緩存在集群的任何節(jié)點(diǎn)上,并且步驟735導(dǎo)致請(qǐng)求節(jié)點(diǎn)從共享資源的源存儲(chǔ)位置取回共享資源。這實(shí)際上能夠以兩種方式來產(chǎn)生:i)該資源真的從未在任何節(jié)點(diǎn)上被本地緩存;或者ii)執(zhí)行了沖刷操作(參見此后在圖8中概述的沖刷操作)。也就是說,在一些實(shí)施例中,此后描述的對(duì)通知850的反應(yīng)可以是刪除其資源標(biāo)識(shí)符(a)匹配事件通知的資源標(biāo)識(shí)符的所有改變?nèi)罩緱l目。應(yīng)當(dāng)理解,執(zhí)行沖刷的節(jié)點(diǎn)將仍然具有本地緩存的共享資源的最新副本并且將會(huì)想要繼續(xù)利用這一點(diǎn)。在改變?nèi)罩疚挥诠?jié)點(diǎn)的本地環(huán)境中的說明性實(shí)施例中,執(zhí)行了沖刷操作的節(jié)點(diǎn)可以通過不刪除所有匹配的改變?nèi)罩緱l目來實(shí)現(xiàn)這一點(diǎn)。替代地,執(zhí)行了沖刷的節(jié)點(diǎn)可以簡(jiǎn)單地將源副本的版本指示符(C)與它自己的本地緩存的副本作比較。
[0080]在第二種特殊情況下,匹配條目可以指示該共享資源的最新版本被沖刷至共享資源的源存儲(chǔ)位置。在一個(gè)實(shí)施例中,這可以通過使用用于改變?nèi)罩镜臈l目中的(b)(即源節(jié)點(diǎn)的標(biāo)識(shí))的預(yù)定的特殊值來完成。