源文件: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数据代理: