源文件:https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL:Architecture:DOM_DataStore#The_In-Memory_MD-SAL_Data_Store_Implementationgit
問題描述數據庫
在MD-SAL數據存儲和數據存儲自己的當前實現中,存在幾個有關數據結構問題:json
爲了提升MD-SAL的可靠性和性能,上述問題須要解決。 api
當前MD-SAL DOM數據代理 緩存
目前,DOM數據代理沒有被設計成具備樹狀結構的智能內存緩存,其可以記錄依賴性,計算變化集合並維護提交處理程序、通知監聽器和實際數據之間的關係。 這可能致使兩階段提交的低效實施,其中全部狀態記錄由Data Broker自己完成,以下所示: 數據結構
DOM數據代理保留和維護的狀態是:併發
另外,如今DOM數據代理的職責是:異步
異步讀取 工具
大多數MD-SAL API是異步的--有一個例外是用於讀取*數據操做,這個操做比較快。 當引入額外的讀取*數據用例時,例如懶編解碼生成,提供讀取操做的遠程系統(Netconf),支持多個讀取器和集羣,這個速度就會慢下來。性能
所提出的改變是使DataReader約束也是異步的,這容許讀取連接,並容許調用者線程在讀取期間不被阻塞。 這將致使更簡潔的併發模型。
需求
交易
在交易期間一致的數據存儲視圖:
咱們須要作什麼
建議的變動
新規範化數據樹模型
新規範化模型將表明YANG規範背後的實際理念。 它將再也不基於序列化格式(如YANG規範中定義並由sal-broker-impl 1.0使用)。
NormalizedNode - 表示樹結構中的節點的基本類型;全部其餘節點類型都是今後基本類型派生的。它包含一個葉子標識符和一個值。
DataContainerNode - 包含多個葉子的節點;它在YANG語法中沒有直接的表示。
ContainerNode - 節點,表示每一個父節點只能有一個;它包含多個葉子,並映射到YANG中的容器語句。
MapEntryNode - 表示葉子的節點,能夠出現屢次。 MapEntryNode可能包含多個葉子。 MapEntryNode映射到YANG中的列表List實例。
ChoiceNode - 表明葉子的節點,每一個父節點大多出現一次,但可能的值可能有不一樣的類型。映射到選擇語句choice。類型映射到該選擇的案例語句。
AugmentationNode - 表示葉子的節點,每一個父節點大多發生一次。
LeafNode - 表示葉子的節點,每一個父節點大多出現一次。包含簡單的值。
LeafSetEntryNode - 表示葉子的節點,每一個父節點能夠屢次出現該類型的節點。映射到YANG中的葉子列表的實例。
LeafSetNode - 特殊節點,每一個父節點只能出現一次;其葉子是指定類型的LeafSetEntryNode節點。
MapNode - 特殊節點,每一個父節點只能出現一次;其葉子是MapEntryNode節點。
當前模型不提供InstanceIdentifier和Data Store之間的綁定。 在該建議中經過定義InstanceIdentifier中的路徑參數與數據樹節點之間的關係來解決此問題。
請參閱OpenDaylight_Controller:MD-SAL:Design:Normalized_DOM_Model
提出的API的代碼在:http://git.opendaylight.org/gerrit/5441
對現有組件的影響
此建議將影響執行 perform schema aware data normalization 的組件:
Yangtools
yang-data-impl - XmlDocumentUtils - Netconf工具使用的一組實用程序和編解碼器,用於根據提供的Schema將輸入XML歸一化爲yang-data-api
binding-generator-impl - LazyGeneratedCodecRegistry - 從Java DTO到yang-data-api的運行時生成的編解碼器
Controller
sal-rest-connector RestconfContext - 將輸入json / xml轉換爲中間格式,使用Schema上下文進行規範化;
sal- * DataBroker - 統一Java DTO和yang-data-api之間的概念,定義正確的格式將提升數據代理的代碼可重用性,可讀性和性能;
DataStore - 數據存儲實現將受益於規範化數據模型,這將致使更有效的實現
這些組件將被修改成使用新的規範化數據模型(提供更有效的API)。
新組件
內存數據庫/緩存
新的DOM數據代理的契約和部署模型將假定存在內存數據庫(緩存),它將從如下職責中代替DOM數據代理: