欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

硬件支持的存儲臨時拷貝的制作方法

文檔序號:6539528閱讀:284來源:國知局
硬件支持的存儲臨時拷貝的制作方法
【專利摘要】本發(fā)明涉及硬件支持的存儲臨時拷貝。提供截至指定時間的物理存儲區(qū)的快照包括:將對生成截至所述指定時間的所述物理存儲區(qū)的快照的請求從第一處理器發(fā)送至第二處理器;以及使用所述第二處理器,至少部分地基于所述物理存儲區(qū)的已知狀態(tài)和與所述物理存儲區(qū)的更新活動有關(guān)的日志信息來生成所述物理存儲區(qū)的快照。
【專利說明】硬件支持的存儲臨時拷貝
[0001]其他申請的交叉引用
本申請要求2013年3月8日提交的名稱為HARDWARE-SUPPORTED MEMORY TEMPORALCOPY AND LOGGING的美國臨時專利申請N0.61/775,041的優(yōu)先權(quán),該美國臨時專利申請出于所有目的通過引用并入于此。
【技術(shù)領(lǐng)域】
[0002]本發(fā)明涉及硬件支持的存儲臨時拷貝。
【背景技術(shù)】
[0003]數(shù)據(jù)庫系統(tǒng)的普通需求是在指定時間點處提供數(shù)據(jù)庫的快照(S卩,拷貝)的能力。特別地,許多數(shù)據(jù)庫的“一致性讀取”能力需要提供在指定時間點處運行針對特定數(shù)據(jù)(例如,數(shù)據(jù)庫)的所提交的狀態(tài)的查詢的能力。普通情況是在與該查詢處理的開始相對應(yīng)的時間時。其他時間是可能的并一般需要被支持。例如,查詢可以選擇截至昨日停業(yè)具有多于100萬美元訂單的黃金客戶。附加需求包括恢復(fù)處于故障中的數(shù)據(jù)庫的所提交的狀態(tài)以及提供與數(shù)據(jù)集有關(guān)的時間序列數(shù)據(jù)(即,其在價值上隨時間的改變)的能力。
[0004]典型地,以軟件實現(xiàn)一致性讀取和恢復(fù)功能?,F(xiàn)有實施方式通常導(dǎo)致存儲密集型操作,其對處理器高速緩存的性能有負面影響,這是由于這些操作將額外數(shù)據(jù)(例如,日志數(shù)據(jù)和/或元數(shù)據(jù))帶到處理器高速緩存中。特別地,該處理通常被擱置,等待來自主存儲器的數(shù)據(jù),并且,可以從處理器高速緩存驅(qū)逐與進行中的處理相關(guān)的其他數(shù)據(jù),以提供額外數(shù)據(jù)的空間。
[0005]此外,在增加的負載下,事務(wù)通常需要對自查詢開始已修改的數(shù)據(jù)塊的一致性讀取,從而帶來使當前狀態(tài)回退到開始查詢的時間的成本。這些成本往往隨系統(tǒng)上的負載的增加而增加,導(dǎo)致不好的降級。
[0006]一致性讀取和恢復(fù)功能的典型軟件實施方式進一步遭受與在相同系統(tǒng)上運行的其他處理器核心的同步開銷,這是由于有必要與系統(tǒng)中的其他處理器核心同時地訪問日志和緩存池的數(shù)據(jù)結(jié)構(gòu)。該同步實際上是附加的核心間高速緩存業(yè)務(wù),進一步減弱每個核心的性能以及總體系統(tǒng)性能。
[0007]一致性讀取和恢復(fù)功能的典型軟件實施方式依賴于撤銷和重作日志。上面提到的相同問題發(fā)生于在數(shù)據(jù)庫更新時寫入到撤銷和重作日志的軟件實施方式,這是由于處理器核心需要頻繁地訪問元數(shù)據(jù)和數(shù)據(jù)和同步。特別地,為了作為記錄事務(wù)中的更新的一部分而將撤銷記錄添加至撤銷日志并將重作記錄添加至重作日志,處理器需要訪問與撤銷日志的結(jié)尾相對應(yīng)的數(shù)據(jù)以及與重作日志的結(jié)尾相對應(yīng)的數(shù)據(jù),并且然后執(zhí)行向這兩者的寫入。該更新過程還必須訪問與這些日志相關(guān)聯(lián)的任何附屬/管理數(shù)據(jù)結(jié)構(gòu)以及存儲用于執(zhí)行這些動作的指令的代碼段。其還需要與其他處理器核心進行同步以對這些日志執(zhí)行更新。因此,對性能有負面影響?!緦@綀D】

【附圖說明】
[0008]在下面的【具體實施方式】和附圖中公開了本發(fā)明的各個實施例。
[0009]圖1A是圖示了被配置成提供存儲器的硬件支持的臨時拷貝的系統(tǒng)的實施例的框圖。
[0010]圖1B是圖示了間接存儲表示的示例的圖。
[0011]圖1C是圖不了間接存儲表不的另一不例的圖。
[0012]圖2是圖示了在諸如圖1A的100之類的系統(tǒng)上實現(xiàn)的一致性讀取過程的實施例的流程圖。
[0013]圖3是圖示了臨時拷貝過程的實施例的流程圖。
[0014]圖4A-4C是圖示了在示例一致性讀取過程中使用的數(shù)據(jù)和日志的示例數(shù)據(jù)圖。
[0015]圖5是圖示了合并-更新拷貝過程的實施例的示例數(shù)據(jù)圖。
[0016]圖6A是圖示了存儲器中的物理數(shù)據(jù)行的實施例的圖。
[0017]圖6B是圖不了基于圖6A的數(shù)據(jù)行表不的日志表不的實施例的圖。
[0018]圖7是圖示了用于生成日志信息的過程的實施例的流程圖。
【具體實施方式】
[0019]本發(fā)明可以以許多方式實現(xiàn),包括被實現(xiàn)為:過程;設(shè)備;系統(tǒng);物質(zhì)組成;體現(xiàn)在計算機可讀存儲介質(zhì)上的計算機程序產(chǎn)品;和/或處理器,諸如下述處理器:其被配置成執(zhí)行存儲在耦合到該處理器的存儲器上和/或由耦合到該處理器的存儲器提供的指令。在本說明書中,這些實施方式或本發(fā)明可采用的任何其他形式可以被稱為技術(shù)。一般來說,所公開過程的步驟的順序可以在本發(fā)明的范圍內(nèi)變更。除非另外聲明,諸如被描述為被配置成執(zhí)行任務(wù)的處理器或存儲器之類的部件可以被實現(xiàn)為被臨時配置成在給定時間處執(zhí)行任務(wù)的一般部件或被制造成執(zhí)行任務(wù)的具體部件。如在本文中使用的那樣,術(shù)語“處理器”涉及一個或多個裝置、電路、和/或被配置成處理數(shù)據(jù)(諸如計算機程序指令)的處理核心。
[0020]下面與圖示本發(fā)明原理的附圖一起提供了本發(fā)明的一個或多個實施例的詳細描述。結(jié)合這些實施例描述了本發(fā)明,但是本發(fā)明不限于任何實施例。本發(fā)明的范圍僅由權(quán)利要求限定,并且本發(fā)明包含許多替換、修改和等同物。在下面的描述中闡述了許多特定細節(jié)以提供對本發(fā)明的透徹理解。出于示例的目的提供了這些細節(jié),并且在不具有一些或所有這些特定細節(jié)的情況下可以根據(jù)權(quán)利要求來實施本發(fā)明。為了清楚的目的,沒有詳細描述與本發(fā)明有關(guān)的【技術(shù)領(lǐng)域】中已知的技術(shù)材料,以便不會不必要地使本發(fā)明模糊。
[0021]描述了存儲器的硬件支持的臨時拷貝和日志記錄。在一些實施例中,使用與中央處理單元分離的硬件部件來提供硬件支持。在各個實施例中,為了支持臨時拷貝,基于已知的存儲狀態(tài)和日志信息來生成快照。在各個實施例中,至少部分地基于間接存儲表示來確定日志信息。
[0022]圖1A是圖示了被配置成提供存儲器的硬件支持的臨時拷貝的系統(tǒng)的實施例的框圖。
[0023]系統(tǒng)100包括被配置成執(zhí)行程序指令的一個或多個中央處理單元(CPU,也被稱為應(yīng)用處理器或處理器)102、被配置成給CPU 102提供臨時低等待時間存儲的一個或多個高速緩存104、以及被配置成給CPU 102提供指令和數(shù)據(jù)的主存儲器108。主存儲器108典型地具有比高速緩存104更大的容量和更高的等待時間。在一些實施例中,高速緩存是使用靜態(tài)隨機存取存儲器(SRAM)實現(xiàn)的,并且主存儲器是使用動態(tài)隨機存取存儲器(DRAM)實現(xiàn)的。其他實施方式是可能的。此外,該系統(tǒng)可以具有輔助存儲器,諸如盤。
[0024]頻繁使用的數(shù)據(jù)的拷貝被存儲在高速緩存104中。當CPU 102需要數(shù)據(jù)時(例如,當應(yīng)用從數(shù)據(jù)庫請求特定段的數(shù)據(jù)時),首先檢驗高速緩存104。如果未在高速緩存104中找到數(shù)據(jù),則發(fā)生高速緩存遺漏,并且檢驗主存儲器108以定位數(shù)據(jù)。
[0025]在該示例中,存儲控制器106被配置成管理去往和來自主存儲器108的數(shù)據(jù)流(包括指令),從而便于由CPU 102對主存儲器108的訪問。存儲控制器106被實現(xiàn)為與CPU 102分離的模塊,并且這兩個部件不必直接彼此通信(換言之,它們不必具有直接接口或連接)。存儲控制器106和CPU 102可以經(jīng)由高速緩存104來交換數(shù)據(jù)。
[0026]拷貝協(xié)處理器(CCP)110被配置成與CPU協(xié)作以支持一致性讀取和日志記錄功能。如下面將更加詳細地描述的那樣,CCP 110被配置成執(zhí)行諸如拷貝數(shù)據(jù)和提供快照之類的動作。CCP 110被視為與CPU 102分離的硬件部件。CCP不必具有與CPU的直接連接(例如,接口、總線)。在一些實施例中,CCP和CPU被實現(xiàn)在分離的芯片或電路上。在各個實施例中,CCP通過向和從存儲控制器106和/或高速緩存104發(fā)送數(shù)據(jù)來與CPU 102對接。在一些實施例中,CCP 110被實現(xiàn)為與存儲控制器分離的部件,并且這兩個部件經(jīng)由通信接口來彼此通信。在一些實施例中,CCP 110與存儲控制器106集成,作為存儲控制器的電路的一部分。
[0027]數(shù)據(jù)(諸如數(shù)據(jù)庫或數(shù)據(jù)的其他收集)被存儲在主存儲器108中。在一些實施例中,特定存儲區(qū)被指定為被日志記錄。例如,操作系統(tǒng)可以將一個或多個配置寄存器設(shè)置成指定被日志記錄的存儲區(qū)的地址和大小。對向存儲區(qū)的寫入進行日志記錄。在該示例中,撤銷日志112和重作日志114被CCP 110維持在主存儲器108中。對于特定存儲區(qū)(例如,特定地址處的存儲頁面),重作日志包括已執(zhí)行的更新,即,自上一個檢驗點起的新值。撤銷日志包括自上一個檢驗點起已通過這些更新而蓋寫的值(即,舊值)。
[0028]在一些系統(tǒng)中,頻繁地提交數(shù)據(jù),但是在特定檢驗點處較不頻繁地將數(shù)據(jù)保存到后備存儲器(例如,寫入到持久數(shù)據(jù)存儲器,諸如盤)。重作日志允許通過下述操作來在故障后恢復(fù)所提交的狀態(tài):在與較早時間相對應(yīng)的檢驗點處從后備存儲器讀取數(shù)據(jù)狀態(tài)的快照,并且然后將重作日志中的所提交的狀態(tài)應(yīng)用于檢驗點狀態(tài),以使數(shù)據(jù)狀態(tài)在時間上提前到最后提交和日志記錄的狀態(tài)。因此,重作日志允許系統(tǒng)避免必須在每次提交時將原地更新寫出到持久存儲器的成本同時仍允許從存儲狀態(tài)的損失的恢復(fù)。
[0029]撤銷日志用于通過按倒序?qū)⒊蜂N日志的條目應(yīng)用于狀態(tài)的較晚時間拷貝直到狀態(tài)已被“撤銷”回到其在指定時間處的狀態(tài)來提供較早時間處的數(shù)據(jù)狀態(tài)。該“較晚時間”的普通情況是當前時間,在這種情況下,已知的狀態(tài)與數(shù)據(jù)庫的當前狀態(tài)相對應(yīng)。撤銷日志便于原子事務(wù)的實現(xiàn)(原子事務(wù)包括必須一起提交的寫入操作的集合或根本不包括寫入操作的集合),這是由于由寫入到相同數(shù)據(jù)的不同事務(wù)引起的沖突可能被撤銷。
[0030]例如,存儲區(qū)最初存儲值“ I ”,并隨后被修改成存儲值“2”,然后,“ I ”被存儲在撤銷日志中并且“2”被存儲在重作日志中。給定初始狀態(tài)“I”并基于重作日志,可以確定較晚提交的狀態(tài)是“2”。給定較晚狀態(tài)“2”和撤銷日志,可以確定較早提交的狀態(tài)是“ I”。
[0031]在一些實施例中,使用間接存儲表示將諸如108之類的物理存儲器表示給處理器,在間接存儲表示中,在處理器發(fā)布的物理地址與物理存儲器中的實際數(shù)據(jù)行(也被稱作高速緩存行)位置之間存在一定級別的間接性。這種間接存儲表示的詳細示例可見于出于所有目的以其整體通過引用并入于此的代理人案號為HICAP001的美國專利N0.8,407, 428和出于所有目的以其整體通過引用并入于此的代理人案號為HICAP003的美國專利 N0.7,650,460 中。
[0032]圖1B是圖示了間接存儲表示的示例的圖。在該示例中,主存儲器中的頁面被劃分為段或行。這些行中的一些用于存儲實際數(shù)據(jù)內(nèi)容并被稱為數(shù)據(jù)行。這些行中的一些存儲引用數(shù)據(jù)行的物理行標識符(PLID),并被稱為轉(zhuǎn)換行或間接行。如所示,數(shù)據(jù)行152-156存儲實際數(shù)據(jù),并且物理行標識符(PLID) P1-P4引用用于形成與適當數(shù)據(jù)相對應(yīng)的存儲器的數(shù)據(jù)行。處理器(例如,CPU)將從處理器發(fā)布的地址計算出的PLID地址用作用于間接地訪問由PLID引用的數(shù)據(jù)行的處理器發(fā)布的物理地址。例如,PLID Pl和P2集合(間接行)引用數(shù)據(jù)行152和154集合,其與數(shù)據(jù)內(nèi)容“AB⑶”相對應(yīng)。另一 PLID P3和P4集合引用數(shù)據(jù)行156和154集合,其與數(shù)據(jù)內(nèi)容“ETOD”相對應(yīng)。為了訪問數(shù)據(jù)內(nèi)容“AB⑶”,處理器訪問包括PLID Pl和P2的間接行的物理地址,并且然后使用這些PLID來定位包含該數(shù)據(jù)的數(shù)據(jù)行,即,與PLIDl和PLID2相對應(yīng)的數(shù)據(jù)行。在一些實施例中,存儲控制器通過提供PLID到數(shù)據(jù)行的映射來便于數(shù)據(jù)訪問。包括PLID集合(其引用包括實際數(shù)據(jù)內(nèi)容的物理數(shù)據(jù)行的對應(yīng)集合)的數(shù)據(jù)結(jié)構(gòu)被稱作間接行。寫入操作等效于將與寫入地址相對應(yīng)的轉(zhuǎn)換行條目中的位置處存儲的PLID改變?yōu)椴煌琍LID以使得不同數(shù)據(jù)行被引用。
[0033]在一些實施例中,將用于存儲數(shù)據(jù)的存儲器組織為固定大小的數(shù)據(jù)行的陣列,每個數(shù)據(jù)行是通過PLID尋址的。對數(shù)據(jù)行進行引用計數(shù),并可以共享該數(shù)據(jù)行。換言之,可以存在引用單個數(shù)據(jù)行的多個PLID。數(shù)據(jù)行的大小取決于實施方式,并可以在不同實施例中不同。在一些實施例中,對數(shù)據(jù)行進行去重復(fù)(deduplicate)(換言之,每個數(shù)據(jù)行具有唯一內(nèi)容,并且引用相同數(shù)據(jù)內(nèi)容的PLID通過引用相同數(shù)據(jù)行來這樣做)。例如,數(shù)據(jù)內(nèi)容“CD”由多個PLID使用,但僅被存儲在單個數(shù)據(jù)行中。
[0034]在一些實施例中,每個數(shù)據(jù)行是不可變的。換言之,一旦數(shù)據(jù)行被指派有特定值,其就在應(yīng)用的持續(xù)時間內(nèi)不改變。如果需要寫入數(shù)據(jù),則將存儲引用舊數(shù)據(jù)的PLID的間接行條目改變成存儲引用新數(shù)據(jù)的不同PLID。例如,間接行條目最初存儲PLID P1,其引用數(shù)據(jù)內(nèi)容AB。如果數(shù)據(jù)內(nèi)容需要被代之以改變?yōu)镋F,則將條目改變?yōu)镻LID P3。
[0035]本文描述的技術(shù)一般適用于使用間接存儲表示而表示的存儲器。盡管下面全面地討論了與圖1B中所示的內(nèi)容類似的間接存儲表示,但是可以使用其他間接存儲表示。圖1C是圖示了間接存儲表示的另一示例的圖,其中,PLID被組織成有向非循環(huán)圖(DAG)。
[0036]一致性讀取
圖2是圖示了在諸如圖1A的100之類的系統(tǒng)上實現(xiàn)的一致性讀取過程的實施例的流程圖。在該示例中,過程200由CCP響應(yīng)于由CPU請求的一致性讀取請求來調(diào)用。
[0037]在202處,接收針對存儲區(qū)截至特定時間的快照的一致性讀取請求。一致性讀取請求包括與感興趣的存儲區(qū)的位置以及存儲區(qū)的快照(即,拷貝)被請求的特定時間點有關(guān)的信息。在一些實施例中,一致性讀取請求是由CPU經(jīng)由存儲控制器向CCP發(fā)送的指令。
[0038]在204處,執(zhí)行臨時拷貝操作。
[0039]在一些實施例中,撤銷日志和重作日志二者均由臨時拷貝使用。在一些實施例中,臨時拷貝操作包括根據(jù)上下文來選擇撤銷或重作日志。在一些實施例中,在調(diào)用臨時拷貝操作之前選擇日志,并且所選擇的日志由臨時拷貝操作使用。該選擇可以由CPU、存儲控制器、CCP自身等進行。如將更加詳細地描述的那樣,日志選擇取決于一致性讀取過程是被用于執(zhí)行撤銷操作以獲得處于較早提交的狀態(tài)的數(shù)據(jù)的快照,還是被用于執(zhí)行重作操作以獲得處于較晚提交的狀態(tài)的數(shù)據(jù)的快照。在一些實施例中,根據(jù)調(diào)用者的規(guī)范來選擇日志;在一些實施例中,基于所請求的時間來選擇日志。
[0040]臨時拷貝操作包括基于所選擇的日志、存儲區(qū)的已知狀態(tài)(例如,處于所提交的狀態(tài)的存儲區(qū)的現(xiàn)有快照)和與快照相關(guān)聯(lián)的時間戳來生成快照。臨時拷貝在指定時間處生成存儲區(qū)的快照。物理存儲器的所生成的快照被提供給第一處理器以由在第一處理器中執(zhí)行的應(yīng)用使用。
[0041]圖3是圖示了臨時拷貝過程的實施例的流程圖。過程300可以用于實現(xiàn)204過程200。在該示例中,臨時拷貝操作被指定為具有下述函數(shù)接口:
temporalCopy(src, dest, timestamp);
其中,src和dest分別對應(yīng)于源存儲位置(例如,源緩存位置)和目的地存儲位置(例如,目的地緩存位置)。截至指定時間戳處的時間(例如:2014年I月12日上午11:00;201401121100等),該函數(shù)產(chǎn)生包括位置src (例如,0x10001111)處的緩存狀態(tài)的位置dest(例如,物理地址0x1000000)處的緩存。Src的存儲狀態(tài)是已知的,并且dest的存儲狀態(tài)是待定的。在該函數(shù)接口中,已知的狀態(tài)對應(yīng)于當前時間處src的狀態(tài)。在一些實施例中,該函數(shù)接口可以提供用于指定除當前時間外的時間(諸如,src被設(shè)檢驗點(checkpointed)和存留至盤的時間)處的src狀態(tài)的附加參數(shù)。在一些實施例中,臨時拷貝函數(shù)被CPU調(diào)用以指示CCP執(zhí)行臨時拷 貝函數(shù)。
[0042]在一些實施例中,對包括一個或多個頁面的存儲區(qū)執(zhí)行臨時拷貝。在一些實施例中,存儲區(qū)獨立于頁面子結(jié)構(gòu)。例如,存儲區(qū)可以包括間接存儲結(jié)構(gòu)的多個間接行(例如,PLID的陣列)。例如,大小為4千字節(jié)(傳統(tǒng)頁面的大小)的存儲區(qū)可以被劃分為每個有64字節(jié)的64個行。如果PLID的大小為32比特,則每頁面使用每個存儲16個PLID的4個轉(zhuǎn)換行來引用該區(qū)中的數(shù)據(jù)行。在其他實施例中,可以使用其他存儲區(qū)/數(shù)據(jù)行/PLID大小。
[0043]在一些實施例中,src和dest指定每個均指示單獨的數(shù)據(jù)結(jié)構(gòu),其提供與源和目的地存儲區(qū)自身有關(guān)的附加信息。例如,在一些實施例中,該應(yīng)用將src指定為虛擬地址而不是物理地址。在這種實施例中,單獨的數(shù)據(jù)結(jié)構(gòu)包括操作系統(tǒng)的虛擬存儲映射,這可以將與源區(qū)相關(guān)聯(lián)的文件、用于撤銷和重作對該區(qū)的改變的日志以及其他屬性(諸如事務(wù)行為)指定為附加信息。Dest可以被類似地指定。操作系統(tǒng)軟件將該虛擬地址轉(zhuǎn)換至物理存儲位置,確保該物理存儲位置包含與該邏輯內(nèi)容相關(guān)聯(lián)的內(nèi)容并進一步確定日志要從該附加信息由臨時拷貝使用。在另一實施例中,src被指定為邏輯數(shù)據(jù)集內(nèi)的區(qū)。即,其標識了可能已位于另一物理地址處或未位于指定時間處的任何物理地址處的邏輯數(shù)據(jù)單元。在這種情況下,實現(xiàn)該數(shù)據(jù)集的軟件維持指示邏輯數(shù)據(jù)的拷貝被存儲于何處(例如,在什么檢驗點和高速緩存中)、與src相關(guān)聯(lián)的日志以及控制如何對存儲器中的數(shù)據(jù)進行實例化的其他配置參數(shù)的附加信息。在一些實施例中,dest參數(shù)被省略,并且臨時拷貝返回對作為臨時拷貝的結(jié)果的數(shù)據(jù)被存儲于其中的位置的指示。
[0044]在該示例中,在302處,將源存儲位置中的數(shù)據(jù)拷貝至目的地存儲位置。在使用間接存儲表示(諸如,圖1B-1C中所示的那些間接存儲表示)來表示存儲器的實施例中,拷貝操作包括拷貝在轉(zhuǎn)換行中的PLID。由于由PLID引用的實際數(shù)據(jù)行未被拷貝,則所拷貝的數(shù)據(jù)的量可以顯著地小于源存儲區(qū)中的所有數(shù)據(jù)內(nèi)容,使拷貝操作非常高效。
[0045]在304處,將與源存儲位置的已知狀態(tài)相關(guān)聯(lián)的已知時間戳(例如,在已知狀態(tài)是當前狀態(tài)的情況下的當前時間)和與要生成的狀態(tài)相關(guān)聯(lián)的指定時間戳進行比較。比較的結(jié)果被用于選擇適當日志。在一些實施例中,在臨時拷貝操作之前向CCP指定已知時間戳(或日志中的條目的對應(yīng)位置)。在一些實施例中,temporalCopy函數(shù)包括指定該信息的一個或多個附加參數(shù)。
[0046]如果時間戳相同(例如,已知狀態(tài)和指定時間戳二者均對應(yīng)于當前時間),則已知狀態(tài)與指定狀態(tài)相同,并且不存在改變。因此,在318處創(chuàng)建處于其已知狀態(tài)的存儲區(qū)的未修改拷貝,并且該過程在320處終止。
[0047]比指定時間戳晚的已知時間戳指示要通過撤銷導(dǎo)致源存儲區(qū)中的數(shù)據(jù)的改變來生成數(shù)據(jù)的較早狀態(tài),并且因此,選擇撤銷日志。相應(yīng)地,在306處,對撤銷日志進行掃描,以識別在指定時間與已知時間之間可應(yīng)用于源存儲區(qū)的所提交的改變。在一些實施例中,該掃描從撤銷日志中的比已知時間戳早的最晚點(或在當前時間被用作已知時間的情況下日志的結(jié)尾)開始,并且,當在日志中達到比指定時間早的時間戳?xí)r或者當整個日志已經(jīng)被掃描時,該掃描終止。在308處,按下述這種順序?qū)⒏淖儜?yīng)用于目的地緩存:首先應(yīng)用最晚的改變,從而撤銷在指定時間與已知時間之間對源緩存進行的改變。目的地緩存中的所得到的數(shù)據(jù)是截至指定時間的期望數(shù)據(jù)。如果未識別出改變,則不應(yīng)用改變。該過程隨后在320處終止。
[0048]比指定時間戳早的已知時間戳指示要通過重新應(yīng)用在源存儲區(qū)中提交了已知狀態(tài)之后發(fā)生的改變來生成數(shù)據(jù)的較晚狀態(tài),并且因此,選擇重作日志。相應(yīng)地,在310處,對重作日志進行掃描,以識別在已知時間與指定時間之間可應(yīng)用于源存儲區(qū)的所提交的改變。在一些實施例中,該掃描從重作日志中的比已知時間戳晚的最早點開始,并且,當在日志中達到比指定時間晚的時間戳?xí)r或者當整個日志已經(jīng)被掃描時,該掃描終止。在312處,按下述這種順序?qū)⒏淖儜?yīng)用于目的地緩存:首先應(yīng)用最早的改變,從而重新應(yīng)用在已知時間與指定時間之間對源緩存進行的改變。如果未識別出改變,則不應(yīng)用改變。該過程隨后在320處終止。
[0049]在一些實施例中,該過程可選地確定在指定時間處是否存在存儲區(qū)的拷貝。例如,保持存儲區(qū)被設(shè)檢驗點的時間的單獨日志,并使用該單獨日志來確定在該時間處是否存在拷貝,并且對撤銷/重作日志進行檢驗以確定是否存在對設(shè)檢驗點的快照的進一步改變。如果存在設(shè)檢驗點的快照并且不存在改變,則提供快照的邏輯拷貝,并且不調(diào)用如上闡述的重新創(chuàng)建快照的過程。
[0050]在一些實施例中,給CCP提供虛擬至物理地址轉(zhuǎn)換信息,并且CCP從而支持使用虛擬地址的臨時拷貝。其可以進一步使用虛擬地址而不是物理地址來存儲日志信息。
[0051]圖4A-4C是圖示了在示例一致性讀取過程中使用的數(shù)據(jù)和日志的示例數(shù)據(jù)圖。圖4A圖示了經(jīng)歷事務(wù)內(nèi)的改變的數(shù)據(jù)集。在該示例中,數(shù)據(jù)被存儲在結(jié)構(gòu)化存儲器中。具體地,存儲區(qū)存儲間接行,該間接行存儲引用數(shù)據(jù)行的對應(yīng)集合的PLID集合。注意,PLID的值可以是任意的,并被選擇成引用第一、第二、第三和第四數(shù)據(jù)行。[0052]在t0=ll:00處,間接行存儲PLID P0、P1、P2和P3,其分別引用存儲A、E、C和F的數(shù)據(jù)行。這是在事務(wù)開始時存儲區(qū)的初始提交的狀態(tài)。在撤銷或重作日志中不存在條目。
[0053]在tl=ll:05處,存儲PLID P3的轉(zhuǎn)換行條目被修改為PLID P9,PLID P9引用D而不是F。因此,撤銷日志記錄了:在時間tl處,從行的開始處偏移3處的條目存儲PLID P3;并且重作日志記錄了:在時間tl處,從行的開始處偏移3處的條目存儲PLID P9。
[0054]在t2=ll:10處,存儲PLID Pl的轉(zhuǎn)換行條目被修改為PLID P10,PLID PlO引用B而不是E。因此,撤銷日志添加指定下述內(nèi)容的條目:在時間t2處,從行的開始處偏移2處的條目存儲PLID Pl ;并且重作日志記錄了:在時間t2處,從行的開始處偏移2處的條目存儲PLID 10。在該點處,事務(wù)準備好被提交。
[0055]在一些實施例中,改變需要被回退(可能由于與其他事務(wù)的沖突)。因此,在圖4B中,使用較晚的快照來恢復(fù)較早的快照。已知時間是11:10并且指定時間是11:00。對目的地進行源狀態(tài)的拷貝(即,對包含A、B、C和D的相同數(shù)據(jù)行的引用進行源PLID PO、P10、P2和P9的拷貝)。對撤銷日志進行掃描以確定如何復(fù)原目的地數(shù)據(jù)行A、B、C和D集合。根據(jù)圖4A中所示的撤銷日志,將第二條目從P 10復(fù)原至Pl (使得下層的數(shù)據(jù)內(nèi)容B被復(fù)原至E),并且將第四條目從P9復(fù)原至P3 (使得數(shù)據(jù)內(nèi)容D被復(fù)原至F)。該復(fù)原是通過從撤銷日志得到舊值的PLID并將其寫入到指定轉(zhuǎn)換條目來執(zhí)行的。生成引用數(shù)據(jù)行A、E、C和F的目的地緩存。
[0056]在一些實施例中,使用較早設(shè)檢驗點的快照來生成較晚狀態(tài)。這在圖4C中圖示。已知時間是11:00并且指定時間是11:10。在目的地處進行源PLID PO、P1、P2和P3的拷貝。對重作日志進行掃描以將改變重新應(yīng)用于目的地數(shù)據(jù)行A、E、C、F集合,其中,第四條目從P3改變?yōu)镻9 (并且數(shù)據(jù)內(nèi)容從F改變?yōu)镈),并且第二數(shù)據(jù)行從Pl改變?yōu)镻lO (并且數(shù)據(jù)內(nèi)容從E改變?yōu)锽)。生成引用A、B、C和D的PLID PO、P10、P2、P9的目的地緩存。
[0057]在一些實施例中,日志的掃描(過程300的306或310)在源中的數(shù)據(jù)被拷貝至目的地之前進行。對于每個頁面(或子頁面),維持與數(shù)據(jù)行相對應(yīng)的比特集,其中,每個比特對應(yīng)于行。在存儲區(qū)的狀態(tài)已知時的已知時間(諸如,事務(wù)的開始)處重置比特集。如果日志記錄指示了間接行中的特定條目被改變,則對對應(yīng)比特進行標記。僅未被標記的源PLID被拷貝至目的地。仍應(yīng)用改變以導(dǎo)出目的地中的期望數(shù)據(jù)行。為了使用圖4B和4C來圖示,使用比特掩碼0000來表示事務(wù)開始處的條目0-3。在事務(wù)結(jié)尾處,所得到的比特掩碼是0101,這是由于引用第二和第四數(shù)據(jù)行的PLID改變了。源緩存的第一和第三數(shù)據(jù)行(PLIDPO和P2)不變,并且因此,對應(yīng)的比特未被標記。這些PLID被拷貝至目的地緩存中的對應(yīng)位置。第二和第四條目由于在日志中記錄的改變而被標記,并且未被拷貝至目的地緩存的第二和第四數(shù)據(jù)行。取而代之,僅根據(jù)日志的改變被拷貝至目的地緩存中的對應(yīng)位置。在該示例中,根據(jù)哪個日志被使用,將引用數(shù)據(jù)行E和F的Pl和P3 (圖4B)或引用數(shù)據(jù)行B和D的PlO和P9 (圖4C)拷貝至行中的第二和第四位置。
[0058]CCP可以實現(xiàn)其他操作作為臨時拷貝的退化或變型。在一些實施例中,CCP實現(xiàn)了源到目的地的“同時”拷貝(即,在指定時間與已知時間相同的情況下的臨時拷貝),在利用PLID拷貝作為相對于實際拷貝數(shù)據(jù)的優(yōu)化的同時進行精確拷貝。在一些實施例中,CCP實現(xiàn)了存儲區(qū)上的“清除”,作為拷貝全零源段的優(yōu)化版本。在一些實施例中,CCP可以實現(xiàn)清除源區(qū)中的每個PLID的存儲區(qū)上的移動,作為將其移動至目的地區(qū)的一部分,從而避免了引用計數(shù)改變的開銷并同時提供了源區(qū)上的“清除”。
[0059]合并-更新拷貝
在一些實施例中,CCP被配置成執(zhí)行原子合并-更新拷貝操作(也被稱作合并-更新操作)。在出于所有目的以其整體通過引用而并入的代理人案號為HICAP004的美國專利申請12/804,901中討論了該操作及其實現(xiàn)的細節(jié)。合并-更新操作允許即使當存在與由不同線程或進程進行的修改的沖突時也合并同時更新,只要該沖突在邏輯上一致且可以被解決以達到可預(yù)測存儲狀態(tài)即可。
[0060]在一些實施例中,更新進程或線程在更新操作或邏輯事務(wù)的開始處維持原始數(shù)據(jù)結(jié)構(gòu)的拷貝,并執(zhí)行對拷貝的更新。在完成更新時,將與原始數(shù)據(jù)結(jié)構(gòu)相關(guān)聯(lián)的信息(諸如指針)同與數(shù)據(jù)結(jié)構(gòu)的當前版本相關(guān)聯(lián)的信息進行比較。如果其指向相同結(jié)構(gòu),則不存在沖突的更新,并且執(zhí)行比較和交換(CAS)操作以利用數(shù)據(jù)結(jié)構(gòu)的新的修改后的版本替換原始版本。然而,如果原始數(shù)據(jù)結(jié)構(gòu)與當前數(shù)據(jù)結(jié)構(gòu)不同,則可以將當前數(shù)據(jù)結(jié)構(gòu)的更新合并到新的修改后的版本中,只要區(qū)別在邏輯上一致即可。邏輯上一致的區(qū)別是由不同線程或進程進行的、可被解決以達到與應(yīng)用語義一致的存儲狀態(tài)的同時修改。當由多個線程對存儲結(jié)構(gòu)進行的邏輯上一致的修改被合并時,好像每個線程或進程已經(jīng)以原子方式且獨立地對存儲結(jié)構(gòu)進行其修改。如下面更詳細地解釋的那樣,對于不同類型的數(shù)據(jù),存在確定修改是否在邏輯上一致的不同方式。在一些實施例中,使用從潛在約束的集合當中選擇的邏輯一致性約束來確定邏輯一致性。一旦區(qū)別被合并,就重試CAS操作。如果區(qū)別在邏輯上不一致,諸如當兩個當前進程每個均試圖將條目添加至與相同鍵的映射時,合并-更新操作失敗,并且重試一些操作。
[0061 ] 在一些實施例中,撤銷/重作日志中的條目與由當前事務(wù)的開始與目前時間之間的單獨提交的事務(wù)對存儲區(qū)的更新相對應(yīng)。CCP被配置成拷貝存儲區(qū)中已被同時的事務(wù)改變成指定存儲區(qū)的行,只要這些改變不與由當前事務(wù)進行的更新相沖突。在一些實施例中,CCP進一步被配置成解決特定的邏輯上一致的沖突。
[0062]圖5是圖示了合并-更新拷貝過程的實施例的示例數(shù)據(jù)圖。下面示出并結(jié)合圖5來解釋對合并-更新拷貝進行圖示的偽代碼。
[0063]如圖5中所示,在t0 (初始狀態(tài))處,存儲區(qū)中的間接行包括分別引用數(shù)據(jù)行A、B和C的PLID P1、P2和P3。兩個同時的事務(wù)具有間接行的快照的拷貝,每個事務(wù)對其拷貝進行其自身的一組改變。在修改期間,每個事務(wù)拍攝初始狀態(tài)的快照,其涉及創(chuàng)建引用相同數(shù)據(jù)行A、B和C的間接行拷貝。相應(yīng)地,由一個事務(wù)進行的改變對另一事務(wù)來說不可見。
[0064]第一過程通過將PLID Pl改變至PLID P4從而將從A引用的數(shù)據(jù)改變至A’,并將PLID P3改變至P5從而將從C引用的數(shù)據(jù)改變至D,來改變間接行中的第一位置。在時間tl處提交改變,并且將由P4、P2和P5形成的間接行稱為狀態(tài)的當前提交的拷貝。
[0065]同時,第二過程通過將PLID P2改變至PLID P8 (以及將從B引用的數(shù)據(jù)行改變至B’)來改變間接行中的第二位置,并通過將PLID P3改變至PLID 9 (以及將從C引用的數(shù)據(jù)行改變至E)來改變第三位置。尚未提交由第二事務(wù)進行的改變(并且因此,引用由虛線指示),并且將由P1、P8和P9形成的間接行稱為狀態(tài)的當前事務(wù)拷貝。在時間t2 (其晚于tl)處,第二事務(wù)需要提交其改變。由于改變由兩個同時的事務(wù)進行,因此該改變經(jīng)歷合并-更新過程。[0066]下面討論C樣式的偽代碼。在該偽代碼中,最初指定了下述指針:scp最初指向快照拷貝的第一位置,因此,*scp最初引用與數(shù)據(jù)行A相對應(yīng)的PLID ;ccp最初指向狀態(tài)的當前提交的拷貝的第一位置,因此*ccp最初引用與數(shù)據(jù)行A’相對應(yīng)的PLID ;以及ctp最初指向狀態(tài)的當前事務(wù)拷貝的第一位置,因此*ctp最初引用與數(shù)據(jù)行A相對應(yīng)的PLID。每個指針的遞增將該指針提前以引用下一行的PLID。該偽代碼指定:
對于與該存儲區(qū)中的數(shù)據(jù)行相對應(yīng)的每個位置,
if *ccp被相對于*scp修改
if *ctp等于*scp //因此未被當前事務(wù)所修改
將*ccp寫入到*ctp;
else
Il處理寫入-寫入沖突
mergedLine=

Ii neMergeUpdate(氺scp,氺ccp,氺ctp, mergeCategory);
if合并失敗,返回失敗;

將 mergedLine 寫入到 *ctp;
++scp; ++ccp; ++ctp。
[0067]參照圖5,對于第一數(shù)據(jù)行,*ccp (PLID P4)被相對于*scp (PLID Pl)修改,但*ctp (PLID PI)等于*scp (PLID PI)。因此,該行僅被一個事務(wù)修改,并且*ccp被寫入到*ctp (PLID Pl 被改變至 PLID P4)。
[0068]對于第二數(shù)據(jù)行,*ccp (PLID P2)未被相對于*scp (PLID P2)修改,因此,該行再次被至多一個事務(wù)修改,并且*ctp (PLID P8)不變。
[0069]對于第三數(shù)據(jù)行,*ccp (PLID P5)被相對于*scp (PLID P3)修改,并且*ctp(PLID P9)不與*scp (PLID P3)相同。這被稱作寫入-寫入沖突,由于兩個事務(wù)均試圖對相同數(shù)據(jù)進行改變。因此,IineMergeUpdate函數(shù)被調(diào)用以確定寫入-寫入沖突是否在邏輯上一致,并在一致的情況下合并該沖突。參數(shù)mergeCategory指示要使用的合并的形式。IineMergeUpdate的缺省結(jié)果是失敗(諸如,圖5中所示的情況,其中兩個不同字母D和E的數(shù)據(jù)內(nèi)容導(dǎo)致邏輯上不一致且不能被解決的寫入-寫入沖突)。當IineMergeUpdate失敗時,中止當前未提交的事務(wù)。然而,特定其他類型的合并是可允許的(即,寫入-寫入沖突在邏輯上一致)。例如,如果mergeCategory指示該數(shù)據(jù)行中的值被視為計數(shù)器,則IineMergeUpdate函數(shù)將確定快照拷貝與當前事務(wù)值之間的差值,并將該差值加到該行中的計數(shù)器,以提供mergedLine, mergedLine提供用于解決沖突的語義。mergeCategory還可以指定特定約束。例如,在單調(diào)遞增計數(shù)器的情況下,如果合并后的值違反計數(shù)器值必須單調(diào)遞增這一約束(諸如當計數(shù)器被事務(wù)之一重置時),則合并-更新操作失敗。
[0070]在該示例中,當前事務(wù)的存儲區(qū)狀態(tài)實際上是在時間t0處創(chuàng)建、利用要在時間t2(當前事務(wù)的結(jié)束時間)處執(zhí)行的各種更新而修改的狀態(tài)的快照。合并-更新拷貝實際上并入有已由其他同時的事務(wù)在時間t0與時間t2之間提交到存儲區(qū)的更新。具體地,如果更新可以被合并(即,如果不存在沖突或者如果沖突在邏輯上一致),則對這些更新進行合并。因此,合并-更新拷貝操作可以被實現(xiàn)為具有已知開始時間to的針對給定區(qū)的臨時拷貝操作并結(jié)束于指定時間t2處。該臨時拷貝操作附加地檢測寫入-寫入沖突(例如,通過跟蹤是否來自不同事務(wù)的多個日志修改相同PLID位置),并在可能時執(zhí)行合并操作。
[0071]在一些實施例中,每個重作日志條目包括與進行了改變的對應(yīng)事務(wù)有關(guān)的信息,使得合并-更新拷貝操作可以使用重作日志來確定所提交的修改并執(zhí)行合并-更新拷貝操作。
[0072]在一些實施例中,在針對事務(wù)的每個修改后的存儲區(qū)的事務(wù)提交時調(diào)用合并-更新拷貝。重作日志用于檢測任何提交沖突,在可能時解決它們并在不可能時中止事務(wù)。相比之下,在現(xiàn)有系統(tǒng)中,需要事務(wù)來針對是否存在由另一事務(wù)向相同位置的寫入進行顯式檢驗,以檢測寫入-寫入沖突,該沖突引發(fā)大量開銷。在實現(xiàn)硬件支持的臨時拷貝的系統(tǒng)中,重作日志可以用于在事務(wù)要提交其改變時檢測寫入-寫入沖突。在一些實施例中,重作日志條目包括與哪個事務(wù)進行了改變有關(guān)的信息,并且在事務(wù)要提交其改變時,對重作日志中的可應(yīng)用條目進行定位和檢查以確定是否存在沖突。在可能時解決所識別的沖突。如果沖突不可能解決,則中止該事務(wù)。
[0073]在一些實施例中,僅當相同頁面被當前事務(wù)和另一所提交的同時事務(wù)二者所修改時,才調(diào)用合并-更新操作。這是由于如果頁面僅被單個事務(wù)修改,則將不存在沖突并且不需要合并。在一些實施例中,每個物理頁面包括指示其已被多個事務(wù)修改的元數(shù)據(jù),并且該元數(shù)據(jù)信息被操作系統(tǒng)使用以確定是否針對該物理頁面調(diào)用合并-更新操作。
[0074]日志表示
圖6A是圖示了存儲器中的物理數(shù)據(jù)行的實施例的圖。如所示的那樣,物理存儲器被劃分為子頁面。每個子頁面包括預(yù)置數(shù)目的數(shù)據(jù)行(在該示例中為32個,但在其他實施例中可以使用其他數(shù)目)。子頁面的開始地址被表示為subpageAddr??梢允褂眯醒诖a來表示行,其中,行中的每個比特對應(yīng)于特定行。
[0075]在該示例中,行掩碼是具有子頁面單元中的比特每行的32比特值,其中,掩碼中的第i個比特對應(yīng)于子頁面的第i行。最初,行掩碼被設(shè)置為缺省值,諸如O。如果行被修改,則其對應(yīng)的行掩碼比特值被設(shè)置為I。因此,可以使用具有下述字段的子頁面更新記錄(SPUR)來表示與特定數(shù)據(jù)行的位置有關(guān)的信息以及引用該數(shù)據(jù)行的PLID是否已被修改:
[subpageAddr, IineMask],
其中,subpageAddr是子頁面中該行定位于其上的地址,并且IineMask是行掩碼,其包括用于指示對應(yīng)行的修改狀態(tài)的比特集合。
[0076]子頁面的大小由IineMask的大小乘以行的大小來確定。在使用64字節(jié)行和32比特IineMask的實施例中,子頁面大小是2千字節(jié)。
[0077]圖6B是圖示了基于圖6A的數(shù)據(jù)行表示的日志表示的實施例的圖。在該示例中,撤銷日志602被表示為與已被蓋寫的數(shù)據(jù)行相對應(yīng)的PLID值的序列。類似地,重作日志604被表示為與已被寫入的修改后或新的數(shù)據(jù)行相對應(yīng)的PLID值的序列。
[0078]每個PLID映射到對應(yīng)的物理數(shù)據(jù)行位置。在該示例中,物理信息被存儲在元數(shù)據(jù)日志606中以節(jié)約日志條目所需的存儲器。參照圖6A,在每個子頁面上,元數(shù)據(jù)日志被表示為SPUR的序列。在每個SPUR中,與該子頁面上的第i行相對應(yīng)的第i個比特被設(shè)置為指定值(例如,1),指示該行被切換。如果行被切換,則新PLID處于重作日志中并且前一 PLID處于撤銷日志中。因此,相同的元數(shù)據(jù)日志可以用于生成撤銷日志和重作日志二者。
[0079]在一些實施例中,子頁面地址和行掩碼字段的大小可以被進一步優(yōu)化,尤其是在SPUR大小被允許在大小上不為2的冪次個比特的情況下。優(yōu)化的目的在于:最小化需要被掃描以執(zhí)行撤銷處理作為一致性讀取塊生成的一部分的數(shù)據(jù)的量。例如,在8比特掩碼的情況下,每個記錄覆蓋0.5千字節(jié),因此在34比特頁面地址字段的情況下,每個SPUR是42個比特,而尋址能夠處理8太字節(jié)的存儲器。對參數(shù)的這種選擇將所需要的用于日志訪問的存儲帶寬是在幾乎所有更新都是每頁面單行的情況下使用64比特SPUR所需要的大致百分之70??梢曰趯υ诓僮髌陂g每頁面更新的期望行數(shù)的統(tǒng)計來進行優(yōu)化。
[0080]可以通過預(yù)留指示SPUR存儲元數(shù)據(jù)信息而不是實際頁面數(shù)據(jù)更新的特殊地址的集合,將附加元數(shù)據(jù)信息存儲在日志中。例如,可以通過利用被預(yù)留以指明時間戳且不與子頁面地址(例如,在其中每個單個比特被設(shè)置為I的地址)相對應(yīng)的地址寫入SPUR,來存儲時間戳。這種特殊地址也被稱作標志??梢灶愃频靥幚碓獢?shù)據(jù)信息,諸如事務(wù)的開始、事務(wù)的結(jié)尾等。通過針對每個這種值預(yù)留2的冪次個地址塊,可以使用頁面地址字段的低位比特來增強掩碼字段中的低位比特以存儲大值。例如,通過針對時間地址使用256個地址的塊,頁面地址的低位8個比特可以用于增強掩碼字段以在使用16比特行掩碼的配置中針對該時間戳提供24個比特。
[0081]可以通過將該至存儲為相對于某基礎(chǔ)值的偏移而不是存儲絕對值,來降低這些參數(shù)的大小需求。例如,可以將時間戳存儲為相對于某時期基礎(chǔ)值的偏移。然后,絕對時間戳可以是偏移的24個比特加上時期基礎(chǔ)的24個比特,用于有效時間戳的總共48個比特。通過利用與時期寄存器相對應(yīng)的特殊頁面地址將SPUR寫入到日志來更新時期基礎(chǔ)值。
[0082]使用該表示,CCP維持向撤銷和重作PLID日志中的指針,在讀取SPUR時將這些指針調(diào)整在SPUR中指示的PLID數(shù)目。因此,不需要顯式地將該對應(yīng)關(guān)系存儲在日志中。
[0083]固定大小的SPUR表示還允許向后以及向前讀取元數(shù)據(jù)日志。該表示還便于由CCP容易地生成撤銷/重作日志。
[0084]日志記錄
在一些實施例中,應(yīng)用的物理存儲器的一個或多個區(qū)被指明為被日志記錄。這可以由設(shè)置特定配置寄存器的操作系統(tǒng)或存儲控制器進行,以指示這種存儲區(qū)的位置和大小。隨后,向日志記錄的存儲區(qū)的每個寫入操作使所寫入的PLID連同元數(shù)據(jù)日志中存儲的SPUR一起拷貝到日志區(qū)。
[0085]圖7是圖示了用于生成日志信息的過程的實施例的流程圖。過程700可以由CCP和/或存儲控制器執(zhí)行。
[0086]在702處,檢測由CPU向日志記錄的物理存儲區(qū)的寫入操作。在一些實施例中,向高速緩存或?qū)嶋H基礎(chǔ)存儲系統(tǒng)(例如,主存儲器)的寫入操作由存儲控制器和/或CCP中的邏輯通過對照日志記錄的存儲區(qū)檢驗與寫入操作相關(guān)聯(lián)的標識地址來檢測。對于使用如上所討論的間接存儲表示而表示的存儲區(qū),寫入操作修改物理數(shù)據(jù)行的間接表示(例如,PLID的內(nèi)容,或者PLID引用到哪個數(shù)據(jù)),但不改變數(shù)據(jù)行自身的數(shù)據(jù)內(nèi)容。
[0087]在704處,記錄與寫入操作相關(guān)聯(lián)的一個或多個日志記錄。具體地,在撤銷日志中記錄得到改變的內(nèi)容的舊值,在重作日志中記錄新值,或者在相應(yīng)日志中記錄這兩個值。在一些實施例中,與存儲區(qū)相關(guān)聯(lián)的配置信息指定是更新撤銷日志、重作日志、還是這兩者。對所修改的內(nèi)容的間接表示相關(guān)聯(lián)的標識信息和與物理數(shù)據(jù)行相關(guān)聯(lián)的標識信息進行記錄。在一些實施例中,將已被修改成引用不同數(shù)據(jù)行的PLID插入到PLID隊列中的當前(尾部)位置處適當日志中的下一條目中。此外,基于引用的與該改變相對應(yīng)的數(shù)據(jù)行來生成SPUR,并將該SPUR寫入到元數(shù)據(jù)日志。
[0088]在一些實施例中,每當寫入操作發(fā)生時,都創(chuàng)建撤銷、重作和SPUR記錄的集合。然而,每次寫入時的日志記錄可能是低效的,這是由于相同存儲片段可能被寫入許多次。例如,如果間接行中的PLID首先引用A,然后B,然后C,均在事務(wù)被提交之前,則出于跟蹤所提交的存儲狀態(tài)的目的,僅值C是相關(guān)的。因此,在一些實施例中,日志記錄不是一發(fā)生寫入操作就創(chuàng)建的,而是在涉及一個或多個寫入操作的事務(wù)準備好要提交時創(chuàng)建的。拍攝如使用間接存儲結(jié)構(gòu)而表示的存儲區(qū)的快照來完成這一點。
[0089]在一些實施例中,拍攝快照(拷貝)包括對間接表示感興趣的存儲區(qū)中的存儲行的PLID進行拷貝。在一些實施例中,存儲訪問中的間接性意味著:可以通過拷貝與存儲區(qū)相關(guān)聯(lián)的PLID而不是拷貝由PLID引用的實際數(shù)據(jù)行來創(chuàng)建快照。在一些實施例中,作為在指定時間與當前時間相同的情況下的臨時拷貝的退化形式,CCP應(yīng)請求而執(zhí)行對PLID的這種拷貝,并且,不存在撤銷或重作,這是由于沒有內(nèi)容將被改變。行的引用計數(shù)和這些共享行的不變性意味著所拷貝的PLID構(gòu)成存儲區(qū)狀態(tài)的快照,即便實際數(shù)據(jù)尚未被拷貝。
[0090]在一些實施例中,在初始狀態(tài)處(即,在存儲區(qū)被改變并經(jīng)歷日志記錄之前日志記錄時間間隔的開始處)拍攝存儲區(qū)的快照。然而,拍攝整個區(qū)的快照可能在計算上昂貴。因此,在一些實施例中,當檢測到第一次寫入操作時,應(yīng)需求而拍攝快照。在一些實施例中,當針對整個存儲區(qū)檢測到第一寫入操作時,應(yīng)需求而生成快照,并且如果自將不存在日志條目起,存儲區(qū)未被修改,則不需要快照。在一些實施例中,以子區(qū)的粒度(諸如頁面)拍攝快照。僅有實際上寫入的頁面使其快照在日志記錄時間間隔期間拍攝。具體地,檢測向頁面的第一次寫入并通知操作系統(tǒng)以創(chuàng)建頁面的快照。操作系統(tǒng)可以調(diào)用CCP以輔助創(chuàng)建該快照。通過將引用頁面的數(shù)據(jù)行的PLID拷貝到頁面的陰影間接結(jié)構(gòu)來創(chuàng)建頁面的快照。在感興趣的時間間隔期間針對向頁面的每個首次寫入而重復(fù)該過程,其中,與每次寫入有關(guān)的信息被記錄在快照數(shù)據(jù)結(jié)構(gòu)中。如果每個PLID是32個比特并對應(yīng)于64個字節(jié)(512個比特)的行大小,則被拷貝以創(chuàng)建頁面的快照的數(shù)據(jù)的量可以是該頁面的大小的僅1/16。
[0091]相應(yīng)地,存儲區(qū)的當前狀態(tài)的完整快照由如上所述的顯式拍快照的頁面和來自當前狀態(tài)的尚未被修改的頁面組成。
[0092]在支持上面討論的快照技術(shù)的實施例中,對于已被修改的頁面,CCP可以通過將存儲區(qū)的當前狀態(tài)中的PLID與初始狀態(tài)快照中的對應(yīng)偏移處的那些PLID進行比較并將與日志不同的當前PLID連同標識信息一起傳送,來在日志記錄時間間隔期間創(chuàng)建被切換的數(shù)據(jù)行的重作日志(換言之,改變了哪些數(shù)據(jù)行正被引用的PLID)。其可以類似地通過相同的比較來創(chuàng)建撤銷日志,從而取而代之僅保存來自初始狀態(tài)快照的對應(yīng)PLID。在一些實施例中,執(zhí)行該操作的時間是提交事務(wù)的時間。
[0093]舉圖4A-4C為例,可以使用該技術(shù)來生成撤銷日志和重作日志。假定PLID P0-P3引用相同頁面上的數(shù)據(jù)行。當?shù)谝淮螌懭氩僮靼l(fā)生在該頁面上時,拍攝原始頁面的快照,從而復(fù)制PLID值。當要生成日志時,將存儲區(qū)的當前狀態(tài)中的PLID與快照中的PLID進行比較,并且識別與初始狀態(tài)快照中的PLID不同的當前PLID并將信息保存到日志。此外,一旦生成了重作日志,就可以通過在重作日志中記錄對應(yīng)的條目并在快照中記錄其對應(yīng)值來導(dǎo)出撤銷日志。例如,參照圖4A,在11:10處,假定重作日志包括從行的開始偏移3處的條目(P9)并且在初始狀態(tài)快照中該偏移處的條目具有P3的值,可以確定撤銷日志還包括存儲值P3的相同位置處的條目。因此,可以基于重作日志記錄(其包括與被日志記錄的改變的位置有關(guān)的信息)以及初始狀態(tài)快照中的對應(yīng)位置處的舊值來確定間接行中的撤銷日志記錄。
[0094]用于在提交時間處將日志信息附加到撤銷和重作日志的示例偽代碼的集合如下:
for快照中的每個子頁面 for子頁面中的每行i
if快照中的第i個PLID與當前子頁面中的第i個PLID不同
if重作日志記錄,將該當前PLID排隊到重作日志;
if撤銷日志記錄,將該第i個快照PLID排隊到撤銷日志;
將如在IineMask中設(shè)置的該第i個比特記錄在該頁面的SPUR中;
將該子頁面的SPUR排隊到元數(shù)據(jù)日志;
end。
[0095]在一些實施例中,在間接存儲結(jié)構(gòu)中存在針對每PLID條目維持的“修改”標志。該標志是在對應(yīng)條目被修改時設(shè)置的,并可以在軟件/硬件控制之下被清除。例如,“修改”標志可以在感興趣的事務(wù)或時段的結(jié)尾處被重置。在出于所有目的以其整體通過引用并入于此的代理人案號為HICAP010的美國專利申請N0.13/712,878中描述修改標志的示例。在這些實施例中,CCP 可以通過掃描定義存儲區(qū)的PLID條目并僅將被標示為被修改的那些PLID拷貝到日志來創(chuàng)建被修改的行的重作日志。
[0096]在事務(wù)的開始處進行快照的一些實施例中,在接收到事務(wù)的結(jié)束的指示(諸如,傳統(tǒng)的準備提交指示)時,向CCP給出生成重作和非日志記錄信息并將其附加到重作和撤銷日志的指示。在完成該日志記錄時,向元數(shù)據(jù)日志寫入結(jié)束事務(wù)指示,該結(jié)束事務(wù)指示包括事務(wù)id和時間戳。在一些實施例中,可以中止事務(wù)。因此,根據(jù)該事務(wù)是被提交還是被中止,提供提交或中止的指示。在后一種情況下,還提供了該事務(wù)的日志記錄的開始的指示(例如,時間戳、日志條目號碼)。
[0097]在一些實施例中,不是所有數(shù)據(jù)行都被引用計數(shù)。例如,實際上可以在遇到復(fù)制存儲系統(tǒng)中的溢出區(qū)域中的數(shù)據(jù)行時將這種行拷貝到新行位置。然后,將與所拷貝的行相關(guān)聯(lián)的PLID存儲在日志中。
[0098]在各個實施例中,可以在對性能造成最小影響的情況下用軟件完成維持其初始生成之外的日志和由CCP支持的臨時拷貝。下面描述可用軟件支持的這些特征中的一些。
[0099]在一些實施例中,用軟件實現(xiàn)將頂級高速緩存沖刷到事務(wù)提交時的高速緩存或存儲器,使得以相對于事務(wù)的完成適時的方式對作為事務(wù)的一部分的向行的寫入進行日志記錄。在一些實施例中,作為提交指令的一部分,處理器可以執(zhí)行該動作。
[0100]在一些實施例中,在更新(諸如事務(wù))的開始處,在CPU中運行的軟件傳送開始事務(wù)并在結(jié)束處傳送結(jié)束事務(wù)操作到CCP,以分別指示事務(wù)的開始和結(jié)束。在開始事務(wù)的指示時,分配事務(wù)標識符并記錄當前時間戳。
[0101]在一些實施例中,CCP直接將所生成的日志記錄串行化到外部輸入/輸出(I/O)設(shè)備(諸如網(wǎng)絡(luò)),而不是將這些記錄存儲在存儲器中。類似地,CCP還可以直接將從I/O設(shè)備接收和解串行化的重作日志記錄應(yīng)用于存儲區(qū),以有效地使存儲區(qū)的存儲狀態(tài)在時間上提前到與重作日志記錄相關(guān)聯(lián)的存儲狀態(tài)。例如,第一計算節(jié)點(例如,計算設(shè)備)可以有效地將其存儲狀態(tài)設(shè)檢驗點到第二計算節(jié)點。具體地,第一計算節(jié)點通過拍攝其存儲狀態(tài)的完整快照來對其存儲狀態(tài)設(shè)檢驗點,并將設(shè)檢驗點的存儲狀態(tài)發(fā)送至第二計算節(jié)點。第一計算節(jié)點還使用其CCP來生成重作日志記錄,并通過網(wǎng)絡(luò)連接將該記錄傳輸至第二節(jié)點,第二節(jié)點將這些重作日志記錄應(yīng)用于從第一計算節(jié)點接收的設(shè)檢驗點的狀態(tài),從而在引發(fā)最小網(wǎng)絡(luò)和應(yīng)用處理開銷的同時維持第一節(jié)點的存儲狀態(tài)的最近拷貝。
[0102]在一些情況下,使用該高效網(wǎng)絡(luò)拷貝技術(shù)來將運行的應(yīng)用從一個網(wǎng)絡(luò)主機移動至另一個,同時通過拷貝該應(yīng)用的設(shè)檢驗點的存儲狀態(tài)并且此后僅拷貝該應(yīng)用的自前一設(shè)檢驗點的狀態(tài)起已改變的行來最小化對該運行的應(yīng)用的中斷。在一些實施例中,日志記錄、設(shè)檢驗點和更新由CCP在向傳輸緩存器中的網(wǎng)絡(luò)傳輸之前執(zhí)行,以確保CCP操作不是流控制的,以便匹配網(wǎng)絡(luò)的限制,尤其是當網(wǎng)絡(luò)擁塞時。
[0103]周期性地,軟件可以將撤銷、重作和/或元數(shù)據(jù)日志的CCP生成的部分拷貝-轉(zhuǎn)換成其自身的日志格式,將面向行/頁面的記錄轉(zhuǎn)換成傳統(tǒng)數(shù)據(jù)庫形式,典型地然后將結(jié)果拷貝到持久性儲存器,諸如數(shù)據(jù)庫、盤等。示例日志格式具有下述字段:
記錄標識符I事務(wù)id I偏移I舊數(shù)據(jù)值I新數(shù)據(jù)值
其中,字段對應(yīng)于記錄的標識符、執(zhí)行了該更新的事務(wù)、記錄中的更新字段的偏移、該字段的舊數(shù)據(jù)值和被寫入到該字段的新數(shù)據(jù)值。該日志表示不使用PLID,這是由于數(shù)據(jù)可以被存儲在不具有對相同物理級間接結(jié)構(gòu)的訪問的輔儲存器上
在一些實施例中,軟件被用于在指定時間內(nèi)維持從頁面到緩存的映射,因此其可以確定截至修改時間的給定頁面到虛擬存儲地址的綁定。例如,如果物理頁面P需要被記錄為在ti到t j之間的時間段內(nèi)存儲塊B,則軟件可以將CCP生成的日志記錄信息轉(zhuǎn)換成與物理存儲地址無關(guān)的形式或至少適于由數(shù)據(jù)庫管理系統(tǒng)進行的長期持久日志記錄的形式。在一些實施例中,上級軟件將物理存儲器映射到較高級數(shù)據(jù)結(jié)構(gòu),并在日志記錄中記錄映射信息,使得上級應(yīng)用可以使用日志記錄來更容易地恢復(fù)或重構(gòu)適當數(shù)據(jù)。例如,軟件確定被改變的PLID對應(yīng)于公司的雇員數(shù)據(jù)庫中的雇員的記錄,特別地,雇員記錄中的工作年限字段(years of service field)。因此,日志記錄由軟件生成和轉(zhuǎn)換,以包括指示改變發(fā)生于雇員的工作年限字段的信息。使用日志的應(yīng)用可以基于日志記錄和雇員數(shù)據(jù)庫的快照,通過根據(jù)日志記錄的值改變雇員的工作年限字段,來高效地恢復(fù)或重構(gòu)雇員數(shù)據(jù)庫。
[0104]在一些實施例中,CCP被提供有與給定物理頁面或子頁面相對應(yīng)的邏輯塊指明(LB),并且CCP自動地將該信息記錄在日志中。
[0105]在實施例中,軟件管理處于存儲器中的日志的部分,并周期性地將這些日志的部分沖刷到非易失性儲存器(諸如盤或FLASH存儲器),以提供持久拷貝。管理這些日志的軟件被配置成在接收到針對快照的請求時確定存儲器中日志緩存是否具有將緩存撤銷回到所需時間或提前到期望時間所需的數(shù)據(jù)。如果否,則從其持久儲存位置訪問所需的附加日志數(shù)據(jù)并將所需的附加日志數(shù)據(jù)傳送至主存儲器以允許執(zhí)行操作。
[0106]日志記錄及其對快照的支持的硬件實現(xiàn)避免了用于執(zhí)行這些動作的應(yīng)用開銷,包括在攪動處理器高速緩存以訪問與該日志記錄實現(xiàn)相關(guān)聯(lián)的代碼和數(shù)據(jù)時的成本。
[0107]硬件實現(xiàn)還減少了作為日志處理的一部分而與其他應(yīng)用過程進行同步(B卩,應(yīng)對針對日志記錄數(shù)據(jù)結(jié)構(gòu)的競爭)的開銷。CCP可以通過允許在先前發(fā)布的操作已完成之前發(fā)起新的拷貝操作、充分利用存儲系統(tǒng)來支持多個同時操作,從而避免成為存儲系統(tǒng)自身的性能限制之外的性能瓶頸。
[0108]公開了存儲器的硬件支持的臨時拷貝和日志記錄。間接存儲表示允許以與保存指針相當?shù)目臻g和時間成本將整個行保存到日志,這是由于對該行的引用被存儲在日志中,而不是數(shù)據(jù)自身。間接存儲表示允許通過拷貝對行的引用而不是數(shù)據(jù)自身、使用空間和時間高效的方式來創(chuàng)建存儲快照。該快照在比必須將撤銷應(yīng)用于修改后的狀態(tài)以提供所提交的狀態(tài)更高效的在當前時間處讀取的普通情況期間進行“一致性讀取”。其還允許以較低空間成本保存來自早先時間的快照,從而降低重復(fù)一致性讀取事務(wù)的成本。
[0109]該技術(shù)還避免了必須關(guān)于向存儲器的應(yīng)用寫入進行調(diào)解,該應(yīng)用寫入原本將在L1/L2高速緩存中被吸收。換言之,其僅依賴于在從處理器高速緩存寫回該行的點處檢測到修改,例如,該修改可以是在回合或事務(wù)的結(jié)尾處強制的。
[0110]該技術(shù)還提供了一種方式,用于確定要在缺少修改后的標簽時對行進行日志記錄,同時避免將行寫入到日志直到日志記錄間隔的結(jié)尾為止。推遲行向日志的寫入直到日志記錄間隔的結(jié)尾避免了作為向相同行或相同(子)頁面的多次寫入的結(jié)果的多個日志條目,并避免了迫使從處理器高速緩存寫出。
[0111]該技術(shù)還允許在事務(wù)的情況下簡化日志,這是由于與事務(wù)相關(guān)聯(lián)的日志記錄僅在事務(wù)的結(jié)尾處寫入,因而,在假定的提交的情況下,日志不必包含與所中止的事務(wù)相關(guān)聯(lián)的日志信息。換言之,日志僅當事務(wù)非常有可能(如果不是肯定的話)將要提交時才被寫入。(如果不是分布式事務(wù),則其可以是肯定的。)這是可行的,原因在于狀態(tài)的快照在沒有日志支持的情況下使撤銷可行。
[0112]快照還允許導(dǎo)出撤銷日志信息作為快照與重作日志之間的差異。
[0113]硬件日志記錄技術(shù)還意味著:即使改變是由相對不可信的應(yīng)用代碼執(zhí)行的,也確保對該改變進行日志記錄。這是由于CCP與CPU的執(zhí)行無關(guān)地進行操作,并且因此,即使應(yīng)用代碼不正確地執(zhí)行,CCP也可以對信息進行日志記錄而不影響CPU的操作。
[0114]盡管已經(jīng)出于理解清楚的目的而相當詳細地描述了前述實施例,但是本發(fā)明不限于所提供的細節(jié)。存在實現(xiàn)本發(fā)明的許多可替換方式。所公開的實施例是說明性的而非限制性的。
【權(quán)利要求】
1.一種系統(tǒng),包括: 第一處理器; 存儲器,包括物理存儲區(qū),被配置為給所述第一處理器提供指令;以及 第二處理器,被配置為: 從所述第一處理器接收對生成截至指定時間的所述物理存儲區(qū)的快照的請求;以及 至少部分地基于所述物理存儲區(qū)的已知狀態(tài)和與所述物理存儲區(qū)的更新活動有關(guān)的日志信息來生成 所述物理存儲區(qū)的快照。
2.根據(jù)權(quán)利要求1所述的系統(tǒng),進一步包括存儲控制器,所述存儲控制器被配置為管理去往和來自存儲器的數(shù)據(jù)流,并且其中,所述第二處理器與所述存儲控制器集成。
3.根據(jù)權(quán)利要求1所述的系統(tǒng),其中,所述物理存儲區(qū)是使用間接存儲表示來表示的。
4.根據(jù)權(quán)利要求1所述的系統(tǒng),其中,所述日志信息包括撤銷日志信息、重作日志信息或這兩者。
5.根據(jù)權(quán)利要求1所述的系統(tǒng),其中,所述日志信息包括元數(shù)據(jù),所述元數(shù)據(jù)包括子頁面地址和行掩碼。
6.根據(jù)權(quán)利要求1所述的系統(tǒng),其中,所述第二處理器被配置為選擇撤銷日志或重作日志。
7.根據(jù)權(quán)利要求6所述的系統(tǒng),其中,所述撤銷日志是在與所述已知狀態(tài)相關(guān)聯(lián)的已知時間晚于所述指定時間的情況下選擇的。
8.根據(jù)權(quán)利要求6所述的系統(tǒng),其中,所述重作日志是在與所述已知狀態(tài)相關(guān)聯(lián)的已知時間早于所述指定時間的情況下選擇的。
9.根據(jù)權(quán)利要求1所述的系統(tǒng),其中,生成所述物理存儲區(qū)的快照包括執(zhí)行臨時拷貝操作,所述臨時拷貝操作的功能接口指定源存儲位置、目的地存儲位置和所述指定時間。
10.根據(jù)權(quán)利要求9所述的系統(tǒng),其中,執(zhí)行臨時拷貝操作包括: 將與所述源存儲位置相關(guān)聯(lián)的數(shù)據(jù)拷貝至所述目的地存儲位置; 識別已知時間與所述指定時間之間的一個或多個可應(yīng)用的改變,所述識別基于所選日志;以及 將所述一個或多個可應(yīng)用的改變應(yīng)用于所述目的地存儲位置。
11.根據(jù)權(quán)利要求9所述的系統(tǒng),其中,執(zhí)行臨時拷貝操作包括: 基于與關(guān)聯(lián)于所述源存儲位置的數(shù)據(jù)行相對應(yīng)的比特集以及標記是否每個數(shù)據(jù)行被切換來識別未被標記為被切換的數(shù)據(jù)行; 將所識別的未被標記為被切換的數(shù)據(jù)行從所述源存儲位置拷貝至所述目的地存儲位置;以及 將根據(jù)所述日志信息而未被標記的數(shù)據(jù)行拷貝至所述目的地存儲位置。
12.根據(jù)權(quán)利要求1所述的系統(tǒng),其中,所述第二處理器被配置為執(zhí)行合并-更新拷貝操作。
13.根據(jù)權(quán)利要求12所述的系統(tǒng),其中,執(zhí)行合并-更新拷貝操作包括: 將所述物理存儲區(qū)的初始快照提供事務(wù),所述事務(wù)對所述初始快照進行改變以生成修改后的快照; 合并由另一同時的事務(wù)在創(chuàng)建了所述初始快照的時間與當前時間之間對存儲區(qū)的所提交的狀態(tài)進行的更新; 檢測修改后的快照中的寫入-寫入沖突; 確定所述寫入-寫入沖突是否在邏輯上一致;以及 如果所述寫入-寫入沖突在邏輯上一致,則合并所述寫入-寫入沖突,以生成合并后的快照。
14.根據(jù)權(quán)利要求13所述的系統(tǒng),其中,所述寫入-寫入沖突是基于記錄由多個同時的事務(wù)進行的改變的重作日志信息來檢測到的。
15.根據(jù)權(quán)利要求1所述的系統(tǒng),其中,所述日志信息是在所述第一處理器執(zhí)行時由所述第二處理器生成的。
16.一種提供截至指定時間的物理存儲區(qū)的快照的方法,包括: 將對生成截至所述指定時間的所述物理存儲區(qū)的快照的請求從第一處理器發(fā)送至第二處理器;以及 使用所述第二處理器,至少部分地基于所述物理存儲區(qū)的已知狀態(tài)和與所述物理存儲區(qū)的更新活動有關(guān)的日志信息來生成所述物理存儲區(qū)的快照。
17.根據(jù)權(quán)利要求16所述的方法,其中,所述物理存儲區(qū)是使用間接存儲表示來表示的。
18.根據(jù)權(quán)利要求16所述的方法,其中,所述日志信息包括撤銷日志信息、重作日志信息或這兩者。
19.根據(jù)權(quán)利要求16所述的方法,其中,所述日志信息包括元數(shù)據(jù),所述元數(shù)據(jù)包括子頁面地址和行掩碼。
20.根據(jù)權(quán)利要求16所述的方法,進一步包括選擇撤銷日志或重作日志以由所述第二處理器使用。
21.根據(jù)權(quán)利要求16所述的方法,其中,生成所述物理存儲區(qū)的快照包括執(zhí)行臨時拷貝操作,所述臨時拷貝操作的功能接口指定源存儲位置、目的地存儲位置和所述指定時間。
22.根據(jù)權(quán)利要求16所述的方法,進一步包括執(zhí)行原子合并-更新拷貝操作。
【文檔編號】G06F11/14GK104035952SQ201410077796
【公開日】2014年9月10日 申請日期:2014年3月5日 優(yōu)先權(quán)日:2013年3月8日
【發(fā)明者】D.R.徹里頓 申請人:??财障到y(tǒng)股份有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
东兴市| 崇州市| 和顺县| 衡山县| 新竹市| 白朗县| 宁蒗| 双辽市| 迁西县| 彭阳县| 洮南市| 隆安县| 南溪县| 遂宁市| 茂名市| 义乌市| 龙门县| 通州区| 松滋市| 荥经县| 女性| 富阳市| 滕州市| 永昌县| 靖安县| 永德县| 玉林市| 武冈市| 海淀区| 永德县| 古交市| 股票| 巴塘县| 新沂市| 桓仁| 卫辉市| 东明县| 定远县| 屏东市| 彰化市| 繁昌县|