本發(fā)明涉及一種用于在多個(gè)時(shí)間間隔期間在第一存儲(chǔ)器中跟蹤對(duì)象的方法和裝置。本發(fā)明還涉及一種存儲(chǔ)程序代碼的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),該程序代碼用于執(zhí)行一種用于在多個(gè)時(shí)間間隔期間在第一存儲(chǔ)器中跟蹤對(duì)象的方法。
背景技術(shù):
硬件的發(fā)展已使得許多重要的高更新速率事務(wù)應(yīng)用能夠完全在存儲(chǔ)器中執(zhí)行。此類應(yīng)用包括事件處理系統(tǒng)、電子交易系統(tǒng)、多人游戲、電信領(lǐng)域服務(wù)控制應(yīng)用、測(cè)量系統(tǒng)、科學(xué)模擬和許多其它應(yīng)用。
這些應(yīng)用中更新事務(wù)的耐久性通常由周期性檢查點(diǎn)檢查進(jìn)程和邏輯重做日志提供,周期性檢查點(diǎn)查檢進(jìn)程將一致存儲(chǔ)器狀態(tài)刷新到永久性存儲(chǔ),邏輯重做日志記錄連續(xù)檢查點(diǎn)之間的所有修改請(qǐng)求。在系統(tǒng)故障的情況下,恢復(fù)進(jìn)程使用最新的永久性檢查點(diǎn)來(lái)初始化存儲(chǔ)器狀態(tài),并使用重放程序來(lái)重放重做日志以重新創(chuàng)建故障發(fā)生時(shí)間之前的點(diǎn)時(shí)的應(yīng)用狀態(tài)。
在此類高更新速率系統(tǒng)中,檢查點(diǎn)效率和不妨礙正常應(yīng)用操作是至關(guān)重要的。為了不妨礙高更新速率并實(shí)現(xiàn)頻繁檢查點(diǎn)檢查,檢查點(diǎn)檢查進(jìn)程必須開(kāi)銷非常低并且效率高。頻繁的檢查點(diǎn)檢查反過(guò)來(lái)減小了重做日志大小并縮短了與其相關(guān)聯(lián)的恢復(fù)時(shí)間時(shí)日志重放持續(xù)時(shí)間。由于檢查點(diǎn)反復(fù)運(yùn)行,僅檢測(cè)和持久化自上一檢查點(diǎn)發(fā)生變化的對(duì)象的增量檢查點(diǎn)檢查方法受到高度重視。
典型的檢查點(diǎn)檢查方法利用拍攝各種粒度的快照的特定方法,因此檢查點(diǎn)管理的邏輯與拍攝快照的邏輯是緊密結(jié)合的。
例如,更新時(shí)復(fù)制方法將應(yīng)用對(duì)象分組成塊,并且每當(dāng)對(duì)象在時(shí)間間隔期間被改變時(shí)將每個(gè)塊復(fù)制到影子狀態(tài)。由于更新線程并發(fā)更新應(yīng)用狀態(tài),因此更新線程需要獲取更新線程引用的塊上的鎖。通過(guò)改變存儲(chǔ)器塊的大小,更新時(shí)復(fù)制在復(fù)制開(kāi)銷與鎖定開(kāi)銷之間進(jìn)行均衡。更新時(shí)復(fù)制方法導(dǎo)致較大開(kāi)銷和顯著延遲,使得它不適合用于高速更新。另外,在新檢查點(diǎn)檢查開(kāi)始時(shí),這種方法會(huì)靜默更新以重置更新標(biāo)記和循環(huán)影子對(duì)象的內(nèi)存。
免等待曲折方法(wait-freezigzagmethod)為每個(gè)元組預(yù)分配復(fù)本空間,并標(biāo)記哪一副本保存元組的快照。在新的檢查點(diǎn)開(kāi)始前,應(yīng)用需要靜默其更新以便一致地標(biāo)記每個(gè)元組的副本之一來(lái)用作下一快照元組。
另一種流行的技術(shù)是批量復(fù)制,通過(guò)該技術(shù)整個(gè)應(yīng)用狀態(tài)被復(fù)制以用于檢查點(diǎn)檢查。批量復(fù)制更新導(dǎo)致高延遲,并且它并不適用于其中例如復(fù)雜對(duì)象結(jié)構(gòu)要求“深度復(fù)制”的某些應(yīng)用。
實(shí)驗(yàn)已經(jīng)表明,沒(méi)有一種已知的快照方法適合維持更新速率的整個(gè)動(dòng)態(tài)范圍。所有的上述方法都涉及上述特定快照拍攝方法,因而具有高復(fù)雜性。由于這種復(fù)雜性,變化集的定義和高效計(jì)算可能代價(jià)高昂。另外,現(xiàn)有技術(shù)通常導(dǎo)致特定應(yīng)用鎖定或更新靜默的強(qiáng)制執(zhí)行。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目標(biāo)在于提供一種克服一個(gè)或多個(gè)現(xiàn)有技術(shù)的上述問(wèn)題的用于在多個(gè)時(shí)間間隔期間在第一存儲(chǔ)器中跟蹤對(duì)象的方法和裝置。本發(fā)明的另一目標(biāo)在于提供一種存儲(chǔ)用于執(zhí)行這種方法的程序代碼的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。
本發(fā)明的第一方面提供一種用于在多個(gè)時(shí)間間隔期間在第一存儲(chǔ)器中跟蹤對(duì)象的方法,所述對(duì)象包括一個(gè)或多個(gè)狀態(tài)變量,其中所述方法包括以下步驟:
一個(gè)或多個(gè)更新線程更新已變化對(duì)象的狀態(tài)變量,所述已變化對(duì)象是當(dāng)前時(shí)間間隔期間已變化的對(duì)象,
當(dāng)新的時(shí)間間隔開(kāi)始時(shí),一個(gè)或多個(gè)測(cè)試線程為每個(gè)對(duì)象創(chuàng)建捕獲所述對(duì)象的狀態(tài)并且對(duì)應(yīng)于所述對(duì)象的影子對(duì)象,
所述一個(gè)或多個(gè)測(cè)試線程評(píng)估所述影子對(duì)象的狀態(tài)變量以確定包括非復(fù)制變化的一個(gè)或多個(gè)非復(fù)制影子對(duì)象,
所述一個(gè)或多個(gè)測(cè)試線程將所述一個(gè)或多個(gè)非復(fù)制影子對(duì)象復(fù)制到第二存儲(chǔ)器,
所述一個(gè)或多個(gè)測(cè)試線程確定所述復(fù)制所述一個(gè)或多個(gè)非復(fù)制影子對(duì)象的步驟是否成功,以及
所述一個(gè)或多個(gè)測(cè)試線程更新對(duì)應(yīng)于復(fù)制成功的所述一個(gè)或多個(gè)非復(fù)制影子對(duì)象的對(duì)應(yīng)對(duì)象的狀態(tài)變量,
其中所述狀態(tài)變量的后續(xù)比特對(duì)應(yīng)于后續(xù)時(shí)間間隔,并且其中所述一個(gè)或多個(gè)更新線程和所述一個(gè)或多個(gè)測(cè)試線程對(duì)所述狀態(tài)變量的不相交比特集進(jìn)行操作。
創(chuàng)建對(duì)應(yīng)于所述對(duì)象并且捕獲所述對(duì)象的所述狀態(tài)的影子對(duì)象可以例如通過(guò)簡(jiǎn)單地復(fù)制所述對(duì)象來(lái)實(shí)現(xiàn)。
將非復(fù)制影子對(duì)象復(fù)制到第二存儲(chǔ)器還包括其中所述非復(fù)制影子對(duì)象的狀態(tài)被持久化在所述第二存儲(chǔ)器上的情況。
根據(jù)本發(fā)明的第一方面,一個(gè)或多個(gè)更新線程可以更新對(duì)象,例如應(yīng)用的存儲(chǔ)器駐留對(duì)象,并將更新后對(duì)象標(biāo)記為當(dāng)前時(shí)間間隔期間發(fā)生變化,而另一組線程,即所述一個(gè)或多個(gè)測(cè)試線程,創(chuàng)建影子對(duì)象并測(cè)試所述影子對(duì)象以得到任何先前變化。所述一個(gè)或多個(gè)更新線程和所述一個(gè)或多個(gè)測(cè)試線程對(duì)所述變化狀態(tài)變量中的不相交比特集進(jìn)行操作,并對(duì)其進(jìn)行相應(yīng)地標(biāo)記。
每個(gè)所述對(duì)象具有指示所述對(duì)象是否被改變的狀態(tài)變量。所述一個(gè)或多個(gè)更新線程和所述一個(gè)或多個(gè)測(cè)試線程訪問(wèn)所述狀態(tài)變量。具體而言,所述一個(gè)或多個(gè)更新線程可以訪問(wèn)所述對(duì)象本身的所述狀態(tài)變量,而所述一個(gè)或多個(gè)測(cè)試線程訪問(wèn)所述影子對(duì)象的所述狀態(tài)變量。
所述方法確保所述一個(gè)或多個(gè)更新線程和所述一個(gè)或多個(gè)測(cè)試線程對(duì)所述狀態(tài)變量的不相交比特集進(jìn)行操作。因此,避免了其中結(jié)果不確定地取決于所涉及的線程之間的定時(shí)的競(jìng)爭(zhēng)情況。
在根據(jù)所述第一方面的所述方法的第一實(shí)施方式中,創(chuàng)建所述影子對(duì)象包括派生子進(jìn)程的步驟。
派生子進(jìn)程,例如使用fork()系統(tǒng)調(diào)用,創(chuàng)建其地址空間用作所述快照的子進(jìn)程。因此,創(chuàng)建了快照一致的狀態(tài)。父進(jìn)程的數(shù)據(jù)(例如,包括所述對(duì)象)可以在每當(dāng)數(shù)據(jù)變化發(fā)生時(shí)根據(jù)os頁(yè)面粒度以動(dòng)態(tài)方式(寫(xiě)入時(shí)復(fù)制)懶惰地“復(fù)制”。創(chuàng)建所述影子對(duì)象的所述基于派生的方法例示了快照與變化集計(jì)算之間的清晰的邏輯分離。
根據(jù)所述第一方面的所述方法的第二實(shí)施方式中,所述方法是用于創(chuàng)建所述對(duì)象的永久性副本的檢查點(diǎn)檢查方法,其中所述一個(gè)或多個(gè)非復(fù)制影子對(duì)象被復(fù)制到永久性存儲(chǔ),特別是硬盤(pán)。這對(duì)于確保對(duì)所述對(duì)象的改變不會(huì)例如由于電力故障而丟失是尤其相關(guān)的,電力故障可能影響所述第一存儲(chǔ)器但不會(huì)影響所述永久性存儲(chǔ)。
因此,本發(fā)明的所述方法可以在增量的、快照一致的檢查點(diǎn)過(guò)程的上下文中使用,所述增量的、快照一致的檢查點(diǎn)過(guò)程在通常設(shè)置中可以例如定義如下:
存在連續(xù)地修改一組存儲(chǔ)器駐留對(duì)象的一組更新線程。
在檢查點(diǎn)時(shí),拍攝所述應(yīng)用存儲(chǔ)器狀態(tài)的一致快照,從而捕獲不可變對(duì)象內(nèi)的一致的存儲(chǔ)器狀態(tài),稱為影子對(duì)象。所述影子對(duì)象的被所述更新線程相對(duì)于上一(成功)檢查點(diǎn)修改的被稱為已變化集的子集被刷新到所述磁盤(pán)。
如果所述前一檢查點(diǎn)不成功,用于所述當(dāng)前檢查點(diǎn)和所述前一檢查點(diǎn)的變化集被合并,即刷新到磁盤(pán)的所述變化集被計(jì)算為所述當(dāng)前變化集與所述前一變化集的并集。
在根據(jù)所述第一方面的所述方法的第三實(shí)施方式中,所述方法包括當(dāng)檢查點(diǎn)被請(qǐng)求時(shí)開(kāi)始新的時(shí)間間隔的步驟。因此,時(shí)間間隔的順序?qū)?yīng)于檢查點(diǎn)的順序。
在根據(jù)所述第一方面的所述方法的第四實(shí)施方式中,所述一個(gè)或多個(gè)更新線程使用指示當(dāng)前時(shí)間間隔的標(biāo)記掩模來(lái)更新所述一個(gè)或多個(gè)已變化對(duì)象的所述狀態(tài)變量,和/或所述一個(gè)或多個(gè)測(cè)試線程使用指示其間成功復(fù)制所述一個(gè)或多個(gè)非復(fù)制影子對(duì)象的先前時(shí)間間隔的測(cè)試掩模來(lái)更新所述狀態(tài)變量。
任何線程在時(shí)間間隔中對(duì)任何對(duì)象的更新可以由所述一個(gè)或多個(gè)更新線程進(jìn)行標(biāo)記,所述一個(gè)或多個(gè)更新線程將所述對(duì)象的狀態(tài)變量設(shè)置為所述狀態(tài)變量與所述標(biāo)記掩模在該時(shí)間間隔時(shí)的特定狀態(tài)的按位或。測(cè)試對(duì)象是否被改變可以通過(guò)將所述時(shí)間間隔的所述特定測(cè)試掩模與所述狀態(tài)變量的按位與跟零進(jìn)行比較來(lái)執(zhí)行。
所述測(cè)試掩模和所述標(biāo)記掩模指示不同的時(shí)間間隔。因此,使用這些掩模來(lái)訪問(wèn)所述對(duì)象的狀態(tài)變量(以及所述對(duì)應(yīng)影子對(duì)象的所述狀態(tài)變量)是確保所述一個(gè)或多個(gè)更新線程和所述一個(gè)或多個(gè)測(cè)試線程總是對(duì)所述各狀態(tài)變量的不相交比特集進(jìn)行操作的一種特定方式。如上所述,這例如對(duì)于避免所述方法的競(jìng)爭(zhēng)情況和不確定表現(xiàn)是重要的。
在根據(jù)所述第一方面的第四實(shí)施方式的所述方法的第五實(shí)施方式中,更新所述標(biāo)記掩膜包括自動(dòng)旋轉(zhuǎn)其比特值,并且更新所述對(duì)象的所述狀態(tài)變量包括分配所述對(duì)象的與所述標(biāo)記掩?;蚪M合的所述狀態(tài)變量。因此,所述標(biāo)記掩??梢酝ㄟ^(guò)將其左旋轉(zhuǎn)一比特而前進(jìn),從而自動(dòng)開(kāi)始新的時(shí)間間隔。這是更新所述標(biāo)記掩模和使用所述標(biāo)記掩模來(lái)訪問(wèn)所述狀態(tài)變量的特別高效的方式。
在本發(fā)明實(shí)施例中,如果所述上一檢查點(diǎn)是成功的,那么所述測(cè)試掩模在當(dāng)前時(shí)間間隔期間保持所述標(biāo)記掩模自所述上一時(shí)間間隔的值。因此,在所述檢查點(diǎn)檢查間隔期間,新變化的對(duì)象被所述新標(biāo)記掩模標(biāo)記,而使用所述前一標(biāo)記掩模對(duì)它們的影子對(duì)象進(jìn)行測(cè)試以得到變化。在所述時(shí)間間隔結(jié)束時(shí),所述測(cè)試掩模被設(shè)置為所述標(biāo)記掩膜的值。此外,所述狀態(tài)變量中表示所述檢測(cè)到的對(duì)象的所述變化的比特被重置為零。如果所述檢查點(diǎn)由于某種原因失敗,所述測(cè)試掩??梢栽O(shè)置為自身與所述標(biāo)記掩膜的值的按位或,從而實(shí)現(xiàn)在下一時(shí)間間隔中對(duì)所述當(dāng)前已變化和先前已變化的對(duì)象的測(cè)試。
在根據(jù)所述第一方面的所述方法的第六實(shí)施方式中,評(píng)估所述狀態(tài)變量包括自動(dòng)評(píng)估所述測(cè)試掩模與所述狀態(tài)變量的按位與組合。這是使用所述測(cè)試掩模評(píng)估所述狀態(tài)變量的特別高效的方式。
在根據(jù)所述第一方面的所述方法的第七實(shí)施方式中,當(dāng)確定所有對(duì)象已被成功復(fù)制時(shí),所述測(cè)試掩模被設(shè)置所述標(biāo)記掩模的值,和/或當(dāng)確定所述已變化對(duì)象中的至少一個(gè)的復(fù)制失敗時(shí),所述測(cè)試掩模被設(shè)置為與所述測(cè)試掩?;蚪M合的所述標(biāo)記掩模。
在根據(jù)所述第一方面的所述方法的第八實(shí)施方式中,所述測(cè)試掩模和/或所述標(biāo)記掩模被初始化為1。這提供了所述方法的明確定義的起點(diǎn)。
如果存在比所述狀態(tài)變量可以存儲(chǔ)的更多的檢查點(diǎn)和時(shí)間間隔,所述方法可以使用環(huán)繞,即,它再次從所述狀態(tài)變量和所述掩模的第一比特開(kāi)始。例如,如果所述狀態(tài)變量和所述測(cè)試掩模以及所述標(biāo)記掩模是32比特變量,那么這些32比特可以對(duì)應(yīng)于第一32個(gè)時(shí)間間隔,并相應(yīng)地對(duì)應(yīng)于第一32個(gè)檢查點(diǎn),如果所述方法是檢查點(diǎn)檢查方法的話。對(duì)于第33個(gè)檢查點(diǎn),第一比特可以再次使用。換句話說(shuō),編號(hào)為n+1(其中n是所述標(biāo)記掩模和/或所述狀態(tài)變量的按比特計(jì)大小)的時(shí)間間隔再次對(duì)應(yīng)于所述標(biāo)記掩模和所述狀態(tài)變量的第一比特。
如果對(duì)于多于n個(gè)先前間隔存在未復(fù)制變化,這可能導(dǎo)致所述方法“遺忘”一些未復(fù)制變化。因此,所述第一方面的所述方法可以包括驗(yàn)證對(duì)于多于n個(gè)先前間隔是否存在未復(fù)制變化的步驟,其中n是所述狀態(tài)變量、所述標(biāo)記掩模和/或所述測(cè)試掩模的比特?cái)?shù)量。在這種情況下,所述方法可以包括生成可以通知操作者所述檢查點(diǎn)檢查不成功的警報(bào)信號(hào)例如視覺(jué)和/或聽(tīng)覺(jué)信號(hào)的步驟。所述方法也可以隨后自動(dòng)改變?yōu)橐环N不同的生成一致檢查點(diǎn)的方法。例如,由于不再可能跟蹤新變化,作為一種應(yīng)急措施,所述方法可以恢復(fù)為針對(duì)所述檢查點(diǎn)中的每個(gè)檢查點(diǎn)創(chuàng)建所有對(duì)象的副本。這是耗費(fèi)資源的,但與不存儲(chǔ)已變化對(duì)象相比可能是優(yōu)選的。
在根據(jù)所述第一方面的所述方法的第九實(shí)施方式中,所述標(biāo)記掩模和/或所述測(cè)試掩模是全局變量和/或所述對(duì)象的所述狀態(tài)變量是所述對(duì)象的局部變量。通過(guò)使用局部變量,可以確保只有所述對(duì)象本身可以訪問(wèn)它們的狀態(tài)變量,即,可以防止對(duì)它們的狀態(tài)變量的未授權(quán)訪問(wèn)。
在根據(jù)所述第一方面的所述方法的第十實(shí)施方式中,對(duì)象的狀態(tài)變量和對(duì)應(yīng)影子對(duì)象的狀態(tài)變量是共用的。這允許更為高效的實(shí)施方式,因?yàn)榭梢员苊馑鰻顟B(tài)變量的不必要的復(fù)制。
在根據(jù)所述第一方面的所述方法的第十一實(shí)施方式中,更新所述對(duì)應(yīng)對(duì)象的所述狀態(tài)變量包括將所述狀態(tài)變量中的一個(gè)或多個(gè)設(shè)置為所述狀態(tài)變量中的所述一個(gè)或多個(gè)的按位異或組合以及所述狀態(tài)變量與所述測(cè)試掩模的所述按位與組合。
在根據(jù)所述第一方面的所述方法的第十二實(shí)施方式中,所述對(duì)象的所述狀態(tài)變量由所述對(duì)象進(jìn)行管理。這可以適用于所述(初始)對(duì)象以及對(duì)應(yīng)于所述對(duì)象的所述影子對(duì)象。這種實(shí)現(xiàn)確保了對(duì)所述狀態(tài)變量的未授權(quán)訪問(wèn)被防止。
根據(jù)本發(fā)明的第二方面,提供了一種用于在多個(gè)時(shí)間間隔期間在第一存儲(chǔ)器中跟蹤對(duì)象的裝置,其中所述裝置包括所述第一存儲(chǔ)器、第二存儲(chǔ)器、第一處理核心和第二處理核心,其中
所述第一處理核心用于執(zhí)行一個(gè)或多個(gè)更新線程,所述一個(gè)或多個(gè)更新線程更新已變化對(duì)象的狀態(tài)變量,所述已變化對(duì)象是在當(dāng)前時(shí)間間隔期間已變化的對(duì)象,并且
所述第二處理核心用于執(zhí)行執(zhí)行以下步驟的一個(gè)或多個(gè)測(cè)試線程:
當(dāng)新的時(shí)間間隔開(kāi)始時(shí),為每個(gè)對(duì)象創(chuàng)建捕獲所述對(duì)象的狀態(tài)并且對(duì)應(yīng)于所述對(duì)象的影子對(duì)象,
評(píng)估所述影子對(duì)象的狀態(tài)變量以確定包括非復(fù)制變化的一個(gè)或多個(gè)非復(fù)制影子對(duì)象,
將所述一個(gè)或多個(gè)非復(fù)制影子對(duì)象復(fù)制到第二存儲(chǔ)器,
確定復(fù)制所述一個(gè)或多個(gè)非復(fù)制影子對(duì)象是否成功,以及
更新對(duì)應(yīng)于復(fù)制成功的所述一個(gè)或多個(gè)非復(fù)制影子對(duì)象的對(duì)應(yīng)對(duì)象的狀態(tài)變量,
其中所述狀態(tài)變量的后續(xù)比特對(duì)應(yīng)于后續(xù)時(shí)間間隔,并且其中所述一個(gè)或多個(gè)更新線程和所述一個(gè)或多個(gè)測(cè)試線程對(duì)所述狀態(tài)變量的不相交比特集進(jìn)行操作。具體而言,所述裝置用于執(zhí)行所述第一方面或所述第一方面的所述實(shí)施方式之一的所述方法。也就是說(shuō),所述裝置用于包括必要裝置以執(zhí)行所述第一方面或所述第一方面的所述實(shí)施方式之一的所述方法。
本發(fā)明的第三方面提供一種存儲(chǔ)程序代碼的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述程序代碼包括用于執(zhí)行所述第一方面或所述第一方面的所述實(shí)施方式之一的所述方法的指令。
如上所述,本發(fā)明實(shí)施例可以強(qiáng)加所述拍攝快照的方法與所述變化集計(jì)算方法之間的關(guān)注點(diǎn)的明確分離??梢韵龝和8戮€程的需要。所述一個(gè)或多個(gè)更新線程的標(biāo)記開(kāi)銷可以是輕量的并且無(wú)需等待,因?yàn)闆](méi)有使用鎖。在一些實(shí)施例中,所有對(duì)象的變化狀態(tài)變量利用按位運(yùn)算自動(dòng)地更新。在實(shí)施例中,變化可以跨越連續(xù)檢查點(diǎn)進(jìn)行跟蹤,下一檢查點(diǎn)檢查開(kāi)始是自動(dòng)且瞬時(shí)的。所述方法的正確性,包括避免競(jìng)爭(zhēng)情況,包含在其設(shè)計(jì)之中。最后,以上特征可以意味著冪等檢查點(diǎn):盡管有故障,但所有數(shù)據(jù)對(duì)象變化都被持久化。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例中的技術(shù)特征,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)單地介紹。下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,這些實(shí)施例在不違背本發(fā)明如權(quán)力要求書(shū)中所定義的保護(hù)范圍的情況下,可以進(jìn)行修改。
圖1示出根據(jù)本發(fā)明的將多個(gè)時(shí)間間隔期間的對(duì)象變化持久化的方法的示意圖,
圖2a示出本發(fā)明實(shí)施例的由一個(gè)或多個(gè)測(cè)試線程執(zhí)行的方法步驟的流程圖,以及
圖2b示出本發(fā)明實(shí)施例的由一個(gè)或多個(gè)更新線程執(zhí)行的方法步驟的流程圖。
具體實(shí)施方式
圖1提供檢查點(diǎn)方法的圖示,其中在三個(gè)時(shí)間間隔11、12、13上跟蹤四個(gè)對(duì)象31、32、33和34。第一時(shí)間間隔11先于第一檢查點(diǎn)21。第二和第三間隔12、13被定義為第一、第二和第三檢查點(diǎn)21、22、23之間的間隔。第四時(shí)間間隔14在第三檢查點(diǎn)24之后。第一和第四對(duì)象31、34在第一間隔11中被改變(利用參考編號(hào)41、42指示)。第四對(duì)象在第二間隔12中再次被改變43。在第三間隔13中,第二和第三對(duì)象32、33被改變44、45。
在第一時(shí)間間隔11(其在第一檢查點(diǎn)21時(shí)結(jié)束)中,變化集由第一和第四對(duì)象31、34,即在第一檢查點(diǎn)21之前被修改的對(duì)象,組成。在第一檢查點(diǎn)時(shí),即當(dāng)?shù)诙r(shí)間間隔開(kāi)始時(shí),對(duì)象被標(biāo)記為相對(duì)于第一檢查點(diǎn)發(fā)生變化。由第一和第四對(duì)象31、34組成的變化集在第二時(shí)間間隔期間被成功持久化。
在第三時(shí)間間隔開(kāi)始時(shí),由第四對(duì)象組成的變化集被檢測(cè)到,即檢測(cè)到obj4已在第一和第二檢查點(diǎn)21、22之間被修改過(guò)。嘗試將第二變化集刷新到磁盤(pán)。這導(dǎo)致(由于未知原因)磁盤(pán)寫(xiě)入失敗。在第四時(shí)間間隔14中,計(jì)算所得變化集由第二、第三和第四對(duì)象32、33、34組成。這一變化集來(lái)自在第三時(shí)間間隔13中未能持久化的第四對(duì)象34與由被檢測(cè)為在第三時(shí)間間隔13中發(fā)生變化的第二和第三對(duì)象32、33組成的變化集的并集。
一般而言,通過(guò)應(yīng)用概念“關(guān)注點(diǎn)分離”,只要?jiǎng)?chuàng)建了對(duì)象的狀態(tài)的一致的不可變副本,快照捕捉的方法就不必為檢查點(diǎn)檢查方法的關(guān)注點(diǎn)。
在新的檢查點(diǎn)開(kāi)始時(shí),需要保留對(duì)象的相對(duì)于上一檢查點(diǎn)已變化的狀態(tài)變量,連同將所有對(duì)象標(biāo)記為在即將來(lái)臨的檢查點(diǎn)的持續(xù)時(shí)間期間未變化,所有這些在存在多個(gè)并行更新時(shí)進(jìn)行。
圖2a是測(cè)試線程執(zhí)行的方法步驟的流程圖。圖2a中所示的實(shí)施例是基于存儲(chǔ)器中數(shù)據(jù)庫(kù)fork()的、快照一致的且增量的檢查點(diǎn)方法的示例。
下文中,change_mark_mask是標(biāo)記掩膜的示例,change_test_mask是測(cè)試掩模的示例,change_status、change_status_i和change_status_j是對(duì)象和/或影子對(duì)象的狀態(tài)變量的示例。
存在與它們之一在數(shù)據(jù)庫(kù)中運(yùn)行的若干線程,稱為測(cè)試線程,以管理增量檢查點(diǎn)的執(zhí)行。測(cè)試線程在步驟s10中旋轉(zhuǎn)change_mark_mask,在s20中派生子進(jìn)程,從而創(chuàng)建與對(duì)應(yīng)于父線程的對(duì)象的影子對(duì)象一致的快照,并且隨后在步驟s30中父測(cè)試線程等待子進(jìn)程報(bào)告其退出狀態(tài)。
在步驟s25中,控制流程取決于是父進(jìn)程還是子進(jìn)程被執(zhí)行。
在步驟s50中,子進(jìn)程在應(yīng)用狀態(tài)測(cè)試中遍歷所有影子對(duì)象,如果它們已使用change_test_mask被改變的話。這是通過(guò)對(duì)change_test_mask與對(duì)象的change_status成員變量進(jìn)行和運(yùn)算完成的。如果結(jié)果為非零,則意味著檢測(cè)到變化,并且隨后該影子對(duì)象被持久化到文件系統(tǒng)作為新文件,而將現(xiàn)存文件復(fù)制到備份副本(步驟s60)。如果所有的新文件被安全地存儲(chǔ)在文件系統(tǒng)中,那么檢查點(diǎn)被認(rèn)為是成功的。否則,如果任何新文件未能被存儲(chǔ)在文件系統(tǒng)中,所有的備份副本被恢復(fù)為當(dāng)前檢查點(diǎn)文件(步驟s80)。在這種情況下,子進(jìn)程退出并報(bào)告失敗作為其退出狀態(tài)。
當(dāng)子進(jìn)程退出時(shí),父進(jìn)程醒來(lái)(步驟s30)并測(cè)試子進(jìn)程的退出狀態(tài)。如果退出狀態(tài)是成功的,父進(jìn)程清除change_status中表示已變化對(duì)象的變化的所有比特(步驟s100)。這是為了確保change_mark_mask外包時(shí)的干凈狀態(tài)。外包可以例如在時(shí)間間隔的數(shù)量大于標(biāo)識(shí)變量和/或標(biāo)記掩模的大小(以比特計(jì))時(shí)發(fā)生。
然后,在步驟s110中,父進(jìn)程通過(guò)使用change_mark_mask的值來(lái)設(shè)置change_test_mask。正常情況下,在成功的檢查點(diǎn)之后,change_test_mask中僅剩余一個(gè)比特。如果檢查點(diǎn)不成功,則對(duì)change_test_mask與change_mark_mask進(jìn)行或運(yùn)算,從而將當(dāng)前變化集與前一變化集結(jié)合起來(lái)。這發(fā)生在步驟s90中。change_test_mask中的多個(gè)“1”指示一個(gè)或多個(gè)連續(xù)檢查點(diǎn)已失敗。最后,測(cè)試線程開(kāi)始等待下一檢查點(diǎn)請(qǐng)求。
下文中,該方法的執(zhí)行利用狀態(tài)變量change_status_i和change_status_j、測(cè)試掩模change_test_mask和標(biāo)記掩模change_mark_mask的特定示例值進(jìn)行說(shuō)明。在該示例中,展示了所涉及的狀態(tài)變量和掩模的值在緊跟系統(tǒng)的初始化的兩個(gè)時(shí)間間隔期間如何演變。本示例跟隨兩個(gè)對(duì)象的變化狀態(tài):oi和oj。還假設(shè)第一檢查點(diǎn)操作失敗,這導(dǎo)致需要最終對(duì)在兩個(gè)時(shí)間間隔期間變化的數(shù)據(jù)對(duì)象進(jìn)行檢查點(diǎn)檢查。第二檢查點(diǎn)操作成功。出于示例的簡(jiǎn)明起見(jiàn),使用4比特值。
系統(tǒng)初始化時(shí)的初始值是:
change_test_mask=0001
change_mark_mask=0001
假設(shè)存在兩個(gè)數(shù)據(jù)對(duì)象oi和oj。它們各自的狀態(tài)變量最初具有零值:
change_status_i=0000
change_status_j=0000
假設(shè)對(duì)象oi在第一檢查點(diǎn)請(qǐng)求發(fā)出之前被更新。這導(dǎo)致以以下方式設(shè)置其change_status:
change_status_i←change_status_iorchange_mark_mask
change_status_i=0000
or
change_mark_mask=0001
---------------------------------------
change_status_i=0001
在步驟s10中,在新檢查點(diǎn)請(qǐng)求時(shí),主測(cè)試線程被激活,并且change_mark_mask被左旋轉(zhuǎn)并變?yōu)閇0010]。在步驟s20中,測(cè)試線程派生子進(jìn)程,并且在父進(jìn)程中,等待子進(jìn)程退出(步驟s30)。
在步驟s40中,在父進(jìn)程中,對(duì)象oj被更新線程更新。首先,檢查變化還沒(méi)有被標(biāo)記。這是為了防止不必要的寫(xiě)入。
change_status_j=0000
and
change_mark_mask=0010
--------------------------------------
result=0000
由于結(jié)果為零(未記錄到變化),針對(duì)對(duì)象oj記錄變化:
change_status_j=0000
or
change_mark_mask=0010
---------------------------------------
change_status_j=0010
注意,這一變化在子(派生)進(jìn)程中是不可見(jiàn)的。與此同時(shí),在子進(jìn)程中,發(fā)生檢查點(diǎn)處理。在步驟s50中,利用change_test_mask對(duì)所有數(shù)據(jù)對(duì)象的change_status成員進(jìn)行測(cè)試(使用and)。如果結(jié)果為非零,則給定對(duì)象被持久化。
change_status_i=0001
and
change_test_mask=0001
--------------------------------------
result=0001
change_status_j=0000(在子進(jìn)程中可見(jiàn)的值)
and
change_test_mask=0001
--------------------------------------
result=0000
變化測(cè)試結(jié)果為非零的對(duì)象被持久化。在這種情況下,對(duì)象oi在該時(shí)間間隔期間被持久化。
在步驟s60中,在永久性存儲(chǔ)中創(chuàng)建現(xiàn)有永久性對(duì)象oi的備份副本。然后,對(duì)象oi本身被持久化。
此時(shí),假設(shè)測(cè)試線程的子進(jìn)程已經(jīng)由于某種原因如i/o錯(cuò)誤而失敗。對(duì)象oi的備份副本被恢復(fù)來(lái)替代被持久化的對(duì)象oi,以回復(fù)到檢查點(diǎn)開(kāi)始之前的狀態(tài)(步驟s80)。然后,測(cè)試線程的子進(jìn)程以“失敗”退出狀態(tài)退出。
測(cè)試主線程測(cè)試子進(jìn)程的退出狀態(tài),并且因?yàn)樽舆M(jìn)程“失敗”,它使用change_mark_maskorchange_test_mask的結(jié)果替代change_test_mask(步驟s90)。
change_test_mask←change_mark_maskorchange_test_mask
change_mark_mask=0010
or
change_test_mask=0001
-----------------------------------------
change_test_mask=0011
在下一檢查點(diǎn)請(qǐng)求時(shí),新的時(shí)間間隔開(kāi)始。change_mark_mask被測(cè)試線程左旋轉(zhuǎn)并變?yōu)閇0100](步驟s10)。
在步驟s20中,測(cè)試線程派生子進(jìn)程,并且在父進(jìn)程(在步驟s25中確定)中,等待子進(jìn)程退出(步驟s30)。
假設(shè)對(duì)象oj此時(shí)在更新線程中被更新。對(duì)應(yīng)的變化比特被設(shè)置。
change_status_j=0010
or
change_mark_mask=0100
---------------------------------------
change_status_j=0110
注意:這一變化僅在父進(jìn)程中可見(jiàn)。
與此同時(shí),在子進(jìn)程中,發(fā)生檢查點(diǎn)處理。在步驟s50中,利用change_test_mask對(duì)所有數(shù)據(jù)對(duì)象的change_status成員進(jìn)行測(cè)試(使用and)。如果結(jié)果為非零,則給定對(duì)象被持久化。
change_status_i=0001
and
change_test_mask=0011
--------------------------------------
result=0001
change_status_j=0010(在子進(jìn)程中可見(jiàn)的值)
and
change_test_mask=0011
--------------------------------------
result=0010
變化測(cè)試結(jié)果為非零的對(duì)象被持久化。在這種情況下,對(duì)象oi和oj均在該時(shí)間間隔期間被持久化。
在步驟s60中,首先,在永久性存儲(chǔ)中創(chuàng)建現(xiàn)有對(duì)象oi和oj的備份副本。然后,對(duì)象oi和oj被持久化。
這一次,檢查點(diǎn)被成功執(zhí)行。oi和oj的備份副本被丟棄(從永久性存儲(chǔ)移除)(步驟s70)。然后,測(cè)試線程的子進(jìn)程以“成功”退出狀態(tài)退出。
圖2b圖示出本發(fā)明實(shí)施例的由一個(gè)或多個(gè)更新線程執(zhí)行的方法步驟。更新線程使用change_mark_mask中的值來(lái)測(cè)試對(duì)象的change_status是否已被更新。這是為了在對(duì)象的change_status已被該線程或同時(shí)修改change_status的其它并發(fā)線程所更新的情況下不必要的緩存線無(wú)效和更新序列化。如果change_status尚未更新(在步驟s5中確定),那么它在步驟s40中被更新。
上文所有描述僅僅為本發(fā)明的實(shí)施方式,本發(fā)明所保護(hù)的范圍并不僅限于此。本領(lǐng)域的技術(shù)人員可以容易地得到任何變體或替代。因此,本發(fā)明的保護(hù)范圍應(yīng)依據(jù)所附權(quán)利要求的保護(hù)范圍。