我遇到了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上的流程,为每个表返回这些流程 .

问题:这怎么可能?

EDIT 我刚刚意识到超时"suddenly fix everything"的规则也是在ODL中产生警告的规则's log (OpenFlowPlugin to be more specific). I did not observe any obvious issue, so I' d将它抛到了一边 .

以下是与错误相关的代码:

https://pastebin.com/yJDZesXU

以下是每次安装遍历这些行的规则时出现的错误:

https://pastebin.com/c9HYLBt6

我必须强调这些规则按预期工作,并且打印它们显示没有明显的格式问题 . 同样,它们在倾倒时看起来很好 . 我的假设是,这个警告是ODL“搞乱”的一个症状,试图将规则存储在MD-SAL中,最终搞乱了很多规则读取查询 . 在卸载随后的垃圾时,规则读取查询将再次起作用 .

这对我来说很有意义,但是......我还没有理解如何解决这些警告,或者首先是这些警告的内容 .

EDIT 2 :通过评论怀疑导致上述pastebin中的警告的行:

//ipv4MatchBuilder.setIpv4SourceAddressNoMask(...);
//ipv4MatchBuilder.setIpv4SourcenArbitraryBitmask(...);

警告消失,并且在ping时,流量在所有表格上正确显示 . 这证实了我的假设,即在某个地方,数据存储中出现了错误 .

EDIT 3: 我发现通过设置任何非平凡的任意位掩码,此错误消失了 . 也就是说,我试过设置一个既不是空也不是"255.255.255.255"的任意位掩码,这个错误已经消失了 . 问题是我可能想为源提供一个位掩码,但是在目标上有完全匹配 . 甚至将位掩码设置为"127.255.255.255"(正如我尝试的那样)仍然令人不安 . 不过,我觉得这是一个OpenFlowPlugin故障 .

EDIT 4: Steps for reproducing the bug

  • 使用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() 应返回一个空列表 .