Description
In case of data tree operation errors we end up dumping the NormalizedNode involved in the operation this way:
[pool-3-thread-5] ERROR org.opendaylight.mdsal.dom.spi.store.SnapshotBackedWriteTransaction - Tx: OPER-34, failed to write /(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)bgp-rib/rib/rib[{(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)id=test-rib}]/loc-rib/tables/tables[{(urn:ope
ndaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)afi=(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)ipv4-address-family, (urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)safi=(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)unicast-subsequent-address-fam
ily}]/(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)ipv4-routes/ipv4-route/ipv4-route[{(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)path-id=1, (urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)route-key=1.1.1.1/32}]:ImmutableMapEntryNode{identifier=(urn:opend
aylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)ipv4-route[{(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)path-id=1, (urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)route-key=1.1.1.1/32}], value=[ImmutableLeafNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet
?revision=2018-03-29)prefix, value=1.1.1.1/32}, ImmutableContainerNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)attributes, value=[ImmutableContainerNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)origin, value=[ImmutableLeafNode{identifier=(urn:
opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)value, value=igp}]}, ImmutableContainerNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)multi-exit-disc, value=[ImmutableLeafNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)med, value=0}]}
, ImmutableChoiceNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)c-next-hop, value=[ImmutableContainerNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)ipv4-next-hop, value=[ImmutableLeafNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?r
evision=2018-03-29)global, value=2.2.2.2}]}]}, ImmutableContainerNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)local-pref, value=[ImmutableLeafNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)pref, value=100}]}, ImmutableContainerNode{identifier=(
urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)as-path, value=[]}]}, ImmutableLeafNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)path-id, value=1}, ImmutableLeafNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=2018-03-29)route-key, value=1.1
.1.1/32}]} in MutableDataTree [modification=ModifiedNode{identifier=(urn:ietf:params:xml:ns:netconf:base:1.0)data, operation=TOUCH, childModification={(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)bgp-rib=ModifiedNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)bgp
-rib, operation=TOUCH, childModification={(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)rib=ModifiedNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)rib, operation=TOUCH, childModification={(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)rib[{(urn:
opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)id=test-rib}]=ModifiedNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)rib[{(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)id=test-rib}], operation=TOUCH, childModification={(urn:opendaylight:params:xml:ns:
yang:bgp-rib?revision=2018-03-29)loc-rib=ModifiedNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)loc-rib, operation=TOUCH, childModification={(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)tables=ModifiedNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-rib?
revision=2018-03-29)tables, operation=TOUCH, childModification={(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)tables[{(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)afi=(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)ipv4-address-family, (urn:opendaylight:para
ms:xml:ns:yang:bgp-rib?revision=2018-03-29)safi=(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)unicast-subsequent-address-family}]=ModifiedNode{identifier=(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)tables[{(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)afi
=(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)ipv4-address-family, (urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)safi=(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)unicast-subsequent-address-family}], operation=NONE}}}}}}}}}}}}}]
org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaValidationFailedException: Child /(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)bgp-rib/rib/rib[{(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)id=test-rib}]/loc-rib/tables/tables[{(urn:opendaylight:params:xml:ns:yang:b
gp-rib?revision=2018-03-29)afi=(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)ipv4-address-family, (urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=2018-03-29)safi=(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=2020-01-20)unicast-subsequent-address-family}]/(urn:opendaylight:params
:xml:ns:yang:bgp-inet?revision=2018-03-29)ipv4-routes is not present in schema tree.
at org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeModification.resolveModificationFor(InMemoryDataTreeModification.java:182)
at org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeModification.write(InMemoryDataTreeModification.java:95)
at org.opendaylight.mdsal.dom.spi.store.SnapshotBackedWriteTransaction.write(SnapshotBackedWriteTransaction.java:72)
at org.opendaylight.mdsal.dom.broker.DOMForwardedWriteTransaction.put(DOMForwardedWriteTransaction.java:87)
at org.opendaylight.mdsal.dom.spi.ForwardingDOMDataReadWriteTransaction.put(ForwardingDOMDataReadWriteTransaction.java:48)
at org.opendaylight.protocol.bgp.rib.impl.LocRibWriter.updateLocRib(LocRibWriter.java:372)
at org.opendaylight.protocol.bgp.rib.impl.LocRibWriter.walkThrough(LocRibWriter.java:344)
at org.opendaylight.protocol.bgp.rib.impl.LocRibWriter.onDataTreeChanged(LocRibWriter.java:216)
at org.opendaylight.mdsal.dom.store.inmemory.InMemoryDOMStoreTreeChangePublisher.lambda$new$0(InMemoryDOMStoreTreeChangePublisher.java:43)
at org.opendaylight.yangtools.util.concurrent.AbstractQueuedNotificationManager.executeBatch(AbstractQueuedNotificationManager.java:88)
at org.opendaylight.yangtools.util.concurrent.AbstractBatchingExecutor$DispatcherTask.invokeWorker(AbstractBatchingExecutor.java:305)
at org.opendaylight.yangtools.util.concurrent.AbstractBatchingExecutor$DispatcherTask.run(AbstractBatchingExecutor.java:292)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
which does contain a lot of information, but it is in a very unfriendly format.
Improve NormalizedNode with:
interface NormalizedNode { Supplier<String> prettyTree(); }
which will return a memoizing supplier:
final class NormalizedNodePrettyTree implements Supplier<String> {
private @Nullable String str;
// Lazy init, etc.
@Override
public String toString() {
return get();
}
}
The resulting string should be very similar to what NormalizedNodes.toStringTree() does, except it needs to print augmentations (as a list of single-namespace nodes) and omit namespaces only when unnecessary.
Attachments
Issue Links
- split to
-
YANGTOOLS-1280 Improve MutableDataTree formatting capabilities
-
- Confirmed
-