-
DOM DataStore
修改记录
版本号
V0.1
V0.2
V0.3
V0.4
V0.5
修改人
***
***
***
***
***
修改日期
2014-07-29
2014-07-30
改和扩充
2014-07-31
2014-08-01
2014-08-04
事务的相关流程以及
Data
Store Tracer
Binding
模型
BindingBroker
以及相关
connect
or
总结
新增
/
修改
内容概要
DOM
DataStore
原理研究
事务链和
DOM Data
Broker
及上版本内容的修
新标准化树形数据模型
对于数据的新标准化模型将代表后面的
YANG
规格的实际概念。
这将不再是基于序列化
格式(定义
见
YANG
规格和使用的
SAL-<
/p>
经纪参数
impl1.0
)
。
?
NormalizedNode
代表在树结构中的一个
节点的基本类型
;
所有其他节点类型是来自这
个基本类型。它包
含一个叶子识别符和一个值。
?
DataContainerNode
其中包含
多个叶节点
;
它在
YANG
语法中没有直
接表示。
?
ContainerNode
p>
容器节点
,它包含了多个子叶片和映射到
Y
ANG
容器陈述。
(
Node,
which
represents a leaf
which can occur only once per parent node; it
contains
multiple child
leaves and maps to the
container
statement in
YANG.
)
?
MapEntryNode
节点代表一个叶子,
叶子是唯一识别的键的值。
MapEntryNode
中可以包含多
个。
(
Node which represents a leaf,
which can occur multiple times; a leave is
uniquely
identified
by
the
value
of
its
key.
A
MapEntryNode
may
contain
multiple
)
?
ChoiceNode
节点代表一个叶子,
这大多发生一次,
每个父节点
,
但可能的值可以有不同的
类型。地图来选择语句。类型映射到
该选择的
case
语句。
?
AugmentationNode
Node which represents a leaf, which
occurs mostly once per parent node.
?
?
?
?
LeafNode
叶子节点,存放相关值(
PS
:官网解释是
Contains simple value.
)
。
LeafSetEntryNode
LeafSetNode
MapNode
Data Store
接口
publicinterface
DataStore
extends
Path
, D>
extends
//
DataReader
,
//
DataModificationTransactionFactory
{
@Override
public
DataModification
beginTransaction();
//
数据修改
@Override
public
D
readConfigurationData(P path);
@Override
public
D
readOperationalData(P path);
}
目前还没有发现
Data Store
和上面的联系,
以及
Data Store
里面存储结构。
估计和
path
有
关。
DOM Data Broker
提供访问概念性数据树存储方法,并提供接口对存储树的某一分支下的数据更改。
具体定义的类
publicabst
ractclass
DomDataBroker
extend
s
ServiceType
{
publicstaticfinal
QName
QNAME
=
.
< br>create
(
s:xml:n
s:yang:controller:md:sal:dom
,
,
)
public
DomDataBroker() {
}
}
执行过程
当前的
DOM
数据代理(
DOM
Data Broker
)并没有设计成一个智能化的内存缓存树形
结构,
这种内存缓存树形结构能够跟踪依赖关系,
计算变更
和维护提交处理程序,
通知监听
器和实现数据之间的关系假设。
这可能会导致效率低下,
执行两个阶段提交,
< br>其中在由数据
代理本身所做的一切状态跟踪。如下所示:
1.
计算受影响的子树。
2.
过滤提交处理受影响的子树。
3.
过滤数据受影响子树的数据改变监听器。
4.
捕获初始状态数据的更改监听器。
5.
启动所有受影响的提交处理程序的提交申请。
6.
完成提交的所有受影响的提交处理程序。
7.
捕获最后的数据状态改变监听器。
8.
向受影响的数据更改监听器发布数据更改事件。
DOM Data
Broker
和
Data Store
DOM Data
Broker
获取事务链中的事务
SAL
层中
DOM Data
Broker
是怎样调用
Data
Store
的呢?
?
DataBrokerImpl
private
AtomicLong
nextTransaction
=
new
AtomicLong();
privatefinal
AtomicLong
createdTransactionsCount
=
new
AtomicLong();
里面有一个
AtomicLong
(原子变量)类型
nextTrans
action
的的变量,而
nextTransaction<
/p>
就是指下一个事务。
可以看出
DOM
Data Broker
是读取事务链里面的事务来对
Data
Store
操
作。而
nextTran
saction
更像是一个指针指向下次操作的事务。
public
DataTransactionImpl beginTransaction() {
String transactionId =
+
nextTransactio
n
.getAndIncrement();
created
TransactionsCount
.getAndIncrement();
returnnew
DataTransactionImp
l(transactionId,
this
);
}
其
通
过
p>
将
nextTransaction
传
p>
入
到
beginTransaction(
)
函
数
里
,<
/p>
返
回
一
个
DataTransactionImpl
类
型
的
对
象
。<
/p>
DataTransactionImpl
是
继
承
AbstractDataTransaction<
/p>
的。下面先看看
AbstractDataTransactio
n
。
?
AbstractDataTransaction
其构造函数:
protected
AbstractDataTransa
ction(
final
Object
identifier,
final
AbstractDataBroker
extends
Object> dataBroker)
{
super
(dataBroker);
this
.
identifier
= Preconditions.
checkNotNull
< br>(identifier);
this
.
broker
= Preconditions.
checkNotNull
(dataBroker);
th
is
.
allocationTime
= System.
nanoTime
();
LOG
.debug(
,
identifier);
}
其中传入的参数:
identifier
是标示事务链中要操作的事务。而
dataBroker
则是要
连接的数据代理。
p>
?
DataTransactionImpl
例举了如下相关函数:
@Override
public
ListenerRegistration
registerListener(DataTransactionListener
listener) {
return
listeners<
/p>
.register(listener);
}
registerListener()
用于注册监听,说道这里引用下上次分析的读数据图
:
DOM
Data
Broker
操作
Data
Store
,是通过监听完成的,而这个监听函数注册就是
DataTransactionImpl
类里面的
registerListener()
。
到这里我们只能认识到
DOMDat
aBroker
是怎么样读取事务链中的事务。
DOMData
Broker
是怎么联系上
DOM
stroe
的呢?
DOMDataB
roker
绑定
DOM Store
publicvoid
setupStore() {
略
ImmutableMap
ImmutableMap.
builder
()
//
.put(
CONFIGURATION
,
configStore)
//
.put(
OPERATIONAL
, operStore)
//
.build();
ListeningExecutorService executor =
Mor
eExecutors.
listeningDecorator
(Executors.
newSingleThreadExecutor
());
domBroker =
new
DOMDataBrokerImpl(stores, executor);
}
通过这个实例就可以看出
DOMDataBroker
是怎么绑定
DOM Store
的。
DOMD
ataBroker
操作
DOM Data Store
publicvoid
testTransactionChainNoConflict()
throws
InterruptedException,
ExecutionException, TimeoutException {
……
DOMDataReadTransaction secondReadTx =
dOnlyTransaction();
assertTestContainer
Exists
(secondReadTx);
DOMDataReadWriteTransaction
thirdDeleteTx =
allocateAndDelete
(txChain);
assertCommitSuccessful(firstWriteTxFutu
re);
}
通过上面的函数调用,可以看出
DOMDataBroker
要操作
DOM
Data
Store
里面的内容,<
/p>
是通
过调用事务链中定义好的方法。
DOM Data
Broker
和
Connector
?
Binding
independent
Connector
是怎么样连接
DOM Data
Broker
和
FW Data
Broker
的?
BindingIndependentConnector
里面内容较多,很多都和框架服务有关,暂时先不看。
?
BindingDomConnectorDeployer
因为其是一个具体的实现类,里面内容较多,目前有一个笼统的认识。
< br>
先看看里面的函数:
STEP1
:
publicstatic
BindingIndependentConnector
createConne
ctor(BindingIndependentMappingService
mappingService) {
BindingIndependentConnector connector =
new
BindingIndependentConnector();
pingService(mappingService);
return
connector;
}
通过<
/p>
mappingService
创建一个
connector
,
其中
mappi
ngService
的作用有待研究。
STEP2
:
publicstatic
BindingIndependentConnecto
r
tryToDeployConnector(RootB
indingAwareBroker baBroker,
ProviderSession domSession) {
checkNotNull
(baBroker);
checkNotNull
(domSession);
BindingIndependentConnector
connector =
}
<
/p>
createConnector
(
ma
ppingService
);
return
connector;
其可以将
BaData
转化成
DOM
Data
,
到这里就可以看出
FW
Data Broker
中的数据是怎么被转
换成
DOM Data
的
。
Asynchronous
Read
(异步读)
大部分的
MD-SAL
的
API
是异步的
,以前的读数据操作是个例外,这似
乎是直接和快
速的。但是当额外的读数据用例引入,如慵懒的编解码器生成,远程系统提
供读操作
(
NETCONF
)
,多读者的支持,集群,这不再是真实的。
所
以需要开发一个更加有效快
速的模型
-Asynchronou
s Read
。
Requirements
?
事务
?
在事务过程中一致的数据存储视图:
1.
应用程序可以读回所有它的数据存储所做的修改。
2.
应用程序没有看到事务的任何写操作,当事务(隔离)后启动。
What We Need to Do
?
yang-data-api
p>
需要进行扩展以提供树状结构,是一个更好的匹配由杨架构定义的数据
结构。
?
数据结构需要密切与实例标识符一致。
?
数据结构应为原子操作支持。
?
对
sal-common-api,
sal-core-api
and
sal-binding-
api
APIs
扩展,以更好地指定
用户的
意图。
?
独立的运营数据存储和配置数据存储。
异步读的好缺处
优点:
异
步读的好处就是提高设备使用率,从而在宏观上提升程序运行效率。
缺点:
容易出现冲突操作和读入脏数据。
事务链
官方给的定义:
A chain of DOM Data t
ransactions
。
一系列相关对
DOM Data
的操作
就称为事务链
。
MD-SAL
的
API
需要扩展,以允许使用核心的
DOM
数据代理
p>
API
和使用
各种工具适配器隐式链接显式
事务链的支持。事务链允许创建的先决条件
-
一次事务是基
于成功完成一个或多个先前的事务。
事务链的类型
?
Join
Transaction
?
Data Modification
Transaction
数据改变监听器
?
Operational
Data change only
只监听操作数据改变。
?
Configuration
Data change only
只监听配置数据改变。
?
Operational and
Configuration data store changed
监听配置数据和操作数据改变
?
其他触发事件
?
Base
?
One
?
Subtree
事务链接口
publicinterface
AsyncDataTransactionFactory
extends
Path
, D> {
}
AsyncReadOnlyTransaction
newReadOnlyTransaction();
AsyncReadWriteTransaction
newReadWriteTransaction();
AsyncWriteTransaction
newWriteOnlyTransaction();
事务链的具体实现类
?
DOMDataBrokerTransactionChainImpl
其构造函数:
public
DOMDataBrokerTransactionChainImpl(
finallong
chainId,
final
ImmutableMap
final
DOMDataCommitExecutor
coordinator,
final
TransactionChainListener
listener) {
super
(chains);
th
is
.
chainId
=
chainId;
this
.
coo
rdinator
= Preconditions.
che
ckNotNull
(coordinator);
this
.
listener
= Preco
nditions.
checkNotNull
(listen
er);
}
DOM Data
Broker
和事务链
?
DOMDataBrokerImpl
public
DOMTransactionChain
createTransactionChain(
final
TransactionChainListener listener) {
。。。
}
可以看出调用
DOMDataBrokerImpl
里面的
createTransactionChain
< br>就可以创建一
个事务链了
事务
链中事务的
id
:
?
定义
privatefinal
AtomicLong
txNum
=
new
AtomicLong();
?
赋值
protected
Object
newTransactionIdentifier() {
return
+
txNum
.getAndIncrement()
}
-
-
-
-
-
-
-
-
-
上一篇:大象版三年级科学下册知识点(2020年)
下一篇:ZXA10F803G命令手册