我遇到了OpenDaylight的故障(使用Mininet)。
基本上,我在查询特定节点和特定表上的流规则。相关代码如下,并且由我轮询的每个节点由1个单独的线程运行:
public static final InstanceIdentifier<Nodes NODES_II = InstanceIdentifier
.builder(Nodes.class).build();
public static InstanceIdentifier<Table> makeTableIId(NodeId nodeId, Short tableId) {
return NODES_IID.child(Node.class, new NodeKey(nodeId))
.augmentation(FlowCapableNode.class)
.child(Table.class, new TableKey(tableId));
}
和
InstanceIdentifier<Table> tableIId = makeTableIId(nodeId, tableId);
Optional<Table> tableOptional = dataBroker.newReadOnlyTransaction()
.read(LogicalDatastoreType.OPERATIONAL, tableIId).get();
if(!tableOptional.isPresent()) {
continue;
}
List<Flow> flows = tableOptional.get().getFlow();
行为:tableOptional存在,getFlow()返回一个空列表。
观察:我正在查询的表上的所有节点上都安装了流规则,但由于某些原因,其中一些节点在所有表中都没有显示这些流(这里是表3,4,5,和6)。
奇怪:在一个有问题的节点上,我有四个规则,分别安装在表9,13,17和22上。它们在150秒后同时超时。它们消失后,查询突然开始“看到”表3,4,5和6上安装的流程,并为每个表返回这些流程。
问题:这怎么可能?
编辑我刚刚意识到超时“突然修复所有内容”的规则也是在ODL日志中生成警告的规则(OpenFlowPlugin更具体)。我没有发现任何明显的问题,所以我有点把它放在一边。
以下是与错误相关的代码:
以下是每次安装规则时遇到的错误:
我必须强调这些规则按预期工作,并且将它们打印出来显示没有明显的格式问题。同样,它们在倾倒时看起来很好。 我的假设是,这个警告是ODL“搞乱”的一个症状,试图将规则存储在MD-SAL中,最终搞乱了很多规则读取查询。在卸载随后发生的垃圾时,规则读取查询将再次起作用。
这对我来说很有意义,但后来......我还没有理解如何修复这些警告,或者首先是这些警告的内容。
编辑2 :通过评论怀疑导致上述pastebin中警告的行:
//ipv4MatchBuilder.setIpv4SourceAddressNoMask(...);
//ipv4MatchBuilder.setIpv4SourcenArbitraryBitmask(...);
警告消失,并且当被ping时,流量在所有表格上正确显示。这证实了我的假设,在某个地方,数据存储中发生了错误。
编辑3:我发现通过设置任何非平凡的任意位掩码,此错误消失了。也就是说,我试过设置一个既不为空也不是“255.255.255.255”的任意位掩码,这个错误就消失了。问题是我可能想为源提供一个位掩码,但是在目标上有完全匹配。甚至将位掩码设置为“127.255.255.255”(我试过)仍然令人不安。我觉得这对我来说是一个OpenFlowPlugin故障。
编辑4:重现错误的步骤
使用ipv4任意位掩码匹配安装规则,目标IP设置,目标任意位掩码为null或设置为255.255.255.255。
Ipv4MatchArbitraryBitMaskBuilder ipv4MatchBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
ipv4MatchBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address("10.0.0.1"));
ipv4MatchBuilder.setIpv4DestinationArbitraryBitmask(new DottedQuad("255.255.255.255"));
matchBuilder = new MatchBuilder().setEthernetMatch(ethernetMatchBuilder.build()).setLayer3Match(ipv4MatchBuilder.build());
... and so on ...
额外的可选步骤:为目标安装一个此类规则,为源安装一个此类规则,并安装等位规则,其中将位掩码设置为其他内容,如127.255.255.255。
查询MDSal以从安装了流规则的节点获取流信息。
现在,在ODL控制器中执行“log:display”。您应该收到有关格式错误的目标地址的警告。此外,您查询的Table对象不应包含任何流,因此tableObject.getFlow()
应返回一个空列表。