[MDSAL-328] ClassCastException when accessing augmentations Created: 22/Mar/18 Updated: 21/Jun/18 Resolved: 21/Jun/18 |
|
| Status: | Resolved |
| Project: | mdsal |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | Fluorine, Oxygen SR3 |
| Type: | Bug | Priority: | Medium |
| Reporter: | Claudio David Gasparini | Assignee: | Robert Varga |
| Resolution: | Done | Votes: | 0 |
| Labels: | None | ||
| Remaining Estimate: | Not Specified | ||
| Time Spent: | Not Specified | ||
| Original Estimate: | Not Specified | ||
| Attachments: |
|
||||||||
| Issue Links: |
|
||||||||
| Description |
|
Using Port configuration for Peer Group under XML config file at the first run of KARAF will end on Cast Exception, when receiving onDataTreeChanged notification. On the other side if the configuration is used once karaf is already running, no cast exception will be trowed. Line causing the exception is the getAugmantation
if (config != null) { final NeighborTransportConfig peerTc = config.getAugmentation(NeighborTransportConfig.class); <----Line 156 .... ....
2018-03-22 08:38:33,898 | ERROR | on-dispatcher-45 | DataTreeChangeListenerActor | 250 - org.opendaylight.controller.sal-clustering-commons - 1.8.0.SNAPSHOT | member-1-shard-default-config: Error notifying listener org.opendaylight.controller.cluster.databroker.compat.LegacyDOMDataBrokerAdapter$2$$Lambda$1065/1620722541@7125d1ae |
| Comments |
| Comment by Claudio David Gasparini [ 22/Mar/18 ] |
|
Steps
|
| Comment by Claudio David Gasparini [ 22/Mar/18 ] |
|
maybe introduce by |
| Comment by Tom Pantelis [ 22/Mar/18 ] |
|
That link doesn't exist - don't know which patch you mean. I suspect this is related to the recent yangtools bump. |
| Comment by Claudio David Gasparini [ 22/Mar/18 ] |
|
link updated |
| Comment by Tom Pantelis [ 22/Mar/18 ] |
|
I don't see where that patch could be the culprit. Why do you think it is? As mentioned, this seems much more likely related to yangtools/mdsal changes - getAugmentation is generated code which is the binding layer, CDS is DOM. LegacyDOMDataBrokerAdapter was added by my patch but it shows up in the trace b/c the error was generated via a DTCL notification. |
| Comment by Claudio David Gasparini [ 23/Mar/18 ] |
|
tpantelis Thanks Tom, I ll move it to MD SAL, for me is not clear where is this issue coming from. Regards, |
| Comment by Robert Varga [ 13/Jun/18 ] |
|
This looks very weird, https://git.opendaylight.org/gerrit/#/c/72961/ adds some more debugs. |
| Comment by Robert Varga [ 13/Jun/18 ] |
|
Please re-run with https://git.opendaylight.org/gerrit/#/c/72961/, there should we warnings preceding the ClassCastException. |
| Comment by Claudio David Gasparini [ 13/Jun/18 ] |
2018-06-13 19:27:44,484 | WARN | on-dispatcher-51 | LazyDataObject | 280 - org.opendaylight.mdsal.binding-dom-codec - 0.13.0.SNAPSHOT | Returning object PeerGroupTransportConfig{getRemotePort=PortNumber{_value=179}} class class com.sun.proxy.$Proxy182 does not implement required augmentation interface org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTransportConfig
2018-06-13 19:27:44,485 | WARN | on-dispatcher-51 | LazyDataObject | 280 - org.opendaylight.mdsal.binding-dom-codec - 0.13.0.SNAPSHOT | Superclass: class java.lang.reflect.Proxy
2018-06-13 19:27:44,486 | WARN | on-dispatcher-51 | LazyDataObject | 280 - org.opendaylight.mdsal.binding-dom-codec - 0.13.0.SNAPSHOT | Implemented interfaces: [interface org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.PeerGroupTransportConfig, interface org.opendaylight.yangtools.yang.binding.AugmentationHolder]
2018-06-13 19:27:44,487 | WARN | on-dispatcher-51 | LazyDataObject | 280 - org.opendaylight.mdsal.binding-dom-codec - 0.13.0.SNAPSHOT | This LDO: Config{isMtuDiscovery=false, isPassiveMode=true, augmentations={interface org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.PeerGroupTransportConfig=PeerGroupTransportConfig{getRemotePort=PortNumber{_value=179}}}}
2018-06-13 19:27:44,501 | WARN | on-dispatcher-51 | LazyDataObject | 280 - org.opendaylight.mdsal.binding-dom-codec - 0.13.0.SNAPSHOT | This NN: ImmutableContainerNode{nodeIdentifier=(urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions?revision=2018-03-29)config, value=[ImmutableLeafNode{nodeIdentifier=(urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions?revision=2018-03-29)mtu-discovery, value=false, attributes={}}, ImmutableAugmentationNode{nodeIdentifier=AugmentationIdentifier{childNames=[(urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions?revision=2018-03-29)remote-port]}, value=[ImmutableLeafNode{nodeIdentifier=(urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions?revision=2018-03-29)remote-port, value=179, attributes={}}]}, ImmutableLeafNode{nodeIdentifier=(urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions?revision=2018-03-29)passive-mode, value=true, attributes={}}], attributes={}}
2018-06-13 19:27:44,502 | WARN | on-dispatcher-51 | LazyDataObject | 280 - org.opendaylight.mdsal.binding-dom-codec - 0.13.0.SNAPSHOT | Dynamic proxy handler: org.opendaylight.mdsal.binding.dom.codec.impl.LazyDataObject@594dfee1
2018-06-13 19:27:44,503 | ERROR | on-dispatcher-51 | DataTreeChangeListenerActor | 261 - org.opendaylight.controller.sal-clustering-commons - 1.8.0.SNAPSHOT | member-1-shard-default-config: Error notifying listener org.opendaylight.controller.cluster.databroker.compat.LegacyDOMDataBrokerAdapter$2$$Lambda$1094/864549882@66ec700d
java.lang.ClassCastException: com.sun.proxy.$Proxy182 cannot be cast to org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTransportConfig
at org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getPort(OpenConfigMappingUtil.java:158) ~[224:org.opendaylight.bgpcep.bgp-rib-impl:0.10.0.SNAPSHOT]
|
| Comment by Robert Varga [ 13/Jun/18 ] |
|
So NeighborTransportConfig and PeerGroupTransportConfig are being confused. I'll take a peek at why is that. |
| Comment by Robert Varga [ 14/Jun/18 ] |
--- target/generated-sources/mdsal-binding/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/bgp/openconfig/extensions/rev180329/NeighborTransportConfig.java 2018-06-14 10:42:11.311592335 +0200 +++ target/generated-sources/mdsal-binding/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/bgp/openconfig/extensions/rev180329/PeerGroupTransportConfig.java 2018-06-14 10:42:11.328592412 +0200 @@ -3,7 +3,7 @@ import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.DataObject; -public interface NeighborTransportConfig +public interface PeerGroupTransportConfig extends DataObject, Augmentation<Config>, and package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.Config; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.DataObject; public interface NeighborTransportConfig extends DataObject, Augmentation<Config>, TransportConfig { } i.e. both are augmentations of the same grouping, albeit different instantiations of it. I am not sure what we can do about this, as bindign does not differentiate between grouping instantiations. I suggest eliminating one of them and treating them as equivalent.
|
| Comment by Robert Varga [ 14/Jun/18 ] |
|
Given the context where this is used, it should be sufficient to receive TransportConfig interface, which makes it oblivious to the actual augment – which should unblock you. |
| Comment by Robert Varga [ 14/Jun/18 ] |
|
Claudio, the way I am reading this right, internal state is correct and LazyDataObject should be returning null here. Can you confirm? |
| Comment by Claudio David Gasparini [ 14/Jun/18 ] |
|
Yes, I expect a null to be received.
final NeighborTransportConfig peerTc = config.augmentation(NeighborTransportConfig.class); if (peerTc != null) { return peerTc.getRemotePort(); } final PeerGroupTransportConfig peerGroupTc = config.augmentation(PeerGroupTransportConfig.class); if (peerGroupTc != null) { return peerGroupTc.getRemotePort(); } I will give a try to remove one, but I think I already try that, and it was an issue when trying to add it later. I'll check it again and provide you some feeback. |
| Comment by Claudio David Gasparini [ 14/Jun/18 ] |
|
provided bgp patch, solves BGP side issues. therefore this is not longer a blocker for us. Thanks |
| Comment by Claudio David Gasparini [ 15/Jun/18 ] |
2018-06-15 13:20:04,564 | WARN | on-dispatcher-46 | LazyDataObject | 280 - org.opendaylight.mdsal.binding-dom-codec - 0.13.0.SNAPSHOT | Returning object PeerGroupTransportConfig{getRemotePort=PortNumber{_value=179}} class class com.sun.proxy.$Proxy271 does not implement required augmentation interface org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborTransportConfig
java.lang.Throwable: null
at org.opendaylight.mdsal.binding.dom.codec.impl.LazyDataObject.verifyAugmentationObject(LazyDataObject.java:210) ~[280:org.opendaylight.mdsal.binding-dom-codec:0.13.0.SNAPSHOT]
at org.opendaylight.mdsal.binding.dom.codec.impl.LazyDataObject.getAugmentationImpl(LazyDataObject.java:196) ~[280:org.opendaylight.mdsal.binding-dom-codec:0.13.0.SNAPSHOT]
at org.opendaylight.mdsal.binding.dom.codec.impl.LazyDataObject.invoke(LazyDataObject.java:73) ~[280:org.opendaylight.mdsal.binding-dom-codec:0.13.0.SNAPSHOT]
at com.sun.proxy.$Proxy264.augmentation(Unknown Source) ~[?:?]
at org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getPort(OpenConfigMappingUtil.java:158) ~[224:org.opendaylight.bgpcep.bgp-rib-impl:0.10.0.SNAPSHOT]
at org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getPort(OpenConfigMappingUtil.java:426) ~[224:org.opendaylight.bgpcep.bgp-rib-impl:0.10.0.SNAPSHOT]
at org.opendaylight.protocol.bgp.rib.impl.config.BgpPeer$BgpPeerSingletonService.<init>(BgpPeer.java:279) ~[224:org.opendaylight.bgpcep.bgp-rib-impl:0.10.0.SNAPSHOT]
at org.opendaylight.protocol.bgp.rib.impl.config.BgpPeer$BgpPeerSingletonService.<init>(BgpPeer.java:218) ~[224:org.opendaylight.bgpcep.bgp-rib-impl:0.10.0.SNAPSHOT]
at org.opendaylight.protocol.bgp.rib.impl.config.BgpPeer.start(BgpPeer.java:138) ~[224:org.opendaylight.bgpcep.bgp-rib-impl:0.10.0.SNAPSHOT]
at org.opendaylight.protocol.bgp.rib.impl.config.BGPClusterSingletonService.initiatePeerInstance(BGPClusterSingletonService.java:343) ~[224:org.opendaylight.bgpcep.bgp-rib-impl:0.10.0.SNAPSHOT]
at org.opendaylight.protocol.bgp.rib.impl.config.BGPClusterSingletonService.onNeighborCreated(BGPClusterSingletonService.java:264) ~[224:org.opendaylight.bgpcep.bgp-rib-impl:0.10.0.SNAPSHOT]
at org.opendaylight.protocol.bgp.rib.impl.config.BGPClusterSingletonService.onNeighborModified(BGPClusterSingletonService.java:247) ~[224:org.opendaylight.bgpcep.bgp-rib-impl:0.10.0.SNAPSHOT]
at org.opendaylight.protocol.bgp.rib.impl.config.BGPClusterSingletonService.onNeighborsChanged(BGPClusterSingletonService.java:235) ~[224:org.opendaylight.bgpcep.bgp-rib-impl:0.10.0.SNAPSHOT]
at org.opendaylight.protocol.bgp.rib.impl.config.BgpDeployerImpl.onNeighborsChanged(BgpDeployerImpl.java:207) ~[224:org.opendaylight.bgpcep.bgp-rib-impl:0.10.0.SNAPSHOT]
at org.opendaylight.protocol.bgp.rib.impl.config.BgpDeployerImpl.onDataTreeChanged(BgpDeployerImpl.java:137) ~[224:org.opendaylight.bgpcep.bgp-rib-impl:0.10.0.SNAPSHOT]
at org.opendaylight.controller.md.sal.binding.impl.BindingDOMDataTreeChangeListenerAdapter.onDataTreeChanged(BindingDOMDataTreeChangeListenerAdapter.java:42) ~[256:org.opendaylight.controller.sal-binding-broker-impl:1.8.0.SNAPSHOT]
at org.opendaylight.controller.cluster.databroker.compat.LegacyDOMDataBrokerAdapter$2.lambda$registerDataTreeChangeListener$0(LegacyDOMDataBrokerAdapter.java:102) ~[269:org.opendaylight.controller.sal-distributed-datastore:1.8.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataTreeChangeListenerActor.dataChanged(DataTreeChangeListenerActor.java:67) [269:org.opendaylight.controller.sal-distributed-datastore:1.8.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataTreeChangeListenerActor.handleReceive(DataTreeChangeListenerActor.java:41) [269:org.opendaylight.controller.sal-distributed-datastore:1.8.0.SNAPSHOT]
at org.opendaylight.controller.cluster.common.actor.AbstractUntypedActor.onReceive(AbstractUntypedActor.java:38) [261:org.opendaylight.controller.sal-clustering-commons:1.8.0.SNAPSHOT]
at akka.actor.UntypedActor$$anonfun$receive$1.applyOrElse(UntypedActor.scala:167) [78:com.typesafe.akka.actor:2.5.11]
at akka.actor.Actor.aroundReceive(Actor.scala:517) [78:com.typesafe.akka.actor:2.5.11]
at akka.actor.Actor.aroundReceive$(Actor.scala:515) [78:com.typesafe.akka.actor:2.5.11]
at akka.actor.UntypedActor.aroundReceive(UntypedActor.scala:97) [78:com.typesafe.akka.actor:2.5.11]
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:590) [78:com.typesafe.akka.actor:2.5.11]
at akka.actor.ActorCell.invoke(ActorCell.scala:559) [78:com.typesafe.akka.actor:2.5.11]
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257) [78:com.typesafe.akka.actor:2.5.11]
at akka.dispatch.Mailbox.run(Mailbox.scala:224) [78:com.typesafe.akka.actor:2.5.11]
at akka.dispatch.Mailbox.exec(Mailbox.scala:234) [78:com.typesafe.akka.actor:2.5.11]
at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [78:com.typesafe.akka.actor:2.5.11]
at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [78:com.typesafe.akka.actor:2.5.11]
at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [78:com.typesafe.akka.actor:2.5.11]
at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [78:com.typesafe.akka.actor:2.5.11]
2018-06-15 13:20:04,569 | INFO | rint Extender: 1 | TldScanner | 363 - org.ops4j.pax.web.pax-web-jsp - 6.0.9 | found TLD bundleresource://363.fwk2101153819/META-INF/c-1_0.tld
2018-06-15 13:20:04,856 | WARN | on-dispatcher-46 | LazyDataObject | 280 - org.opendaylight.mdsal.binding-dom-codec - 0.13.0.SNAPSHOT | Superclass: class java.lang.reflect.Proxy
2018-06-15 13:20:04,856 | WARN | on-dispatcher-46 | LazyDataObject | 280 - org.opendaylight.mdsal.binding-dom-codec - 0.13.0.SNAPSHOT | Implemented interfaces: [interface org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.PeerGroupTransportConfig, interface org.opendaylight.yangtools.yang.binding.AugmentationHolder]
2018-06-15 13:20:04,856 | WARN | on-dispatcher-46 | LazyDataObject | 280 - org.opendaylight.mdsal.binding-dom-codec - 0.13.0.SNAPSHOT | This LDO: Config{isMtuDiscovery=false, isPassiveMode=true, augmentations={interface org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.PeerGroupTransportConfig=PeerGroupTransportConfig{getRemotePort=PortNumber{_value=179}}}}
2018-06-15 13:20:04,857 | WARN | on-dispatcher-46 | LazyDataObject | 280 - org.opendaylight.mdsal.binding-dom-codec - 0.13.0.SNAPSHOT | This NN: ImmutableContainerNode{nodeIdentifier=(urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions?revision=2018-03-29)config, value=[ImmutableLeafNode{nodeIdentifier=(urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions?revision=2018-03-29)mtu-discovery, value=false, attributes={}}, ImmutableAugmentationNode{nodeIdentifier=AugmentationIdentifier{childNames=[(urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions?revision=2018-03-29)remote-port]}, value=[ImmutableLeafNode{nodeIdentifier=(urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions?revision=2018-03-29)remote-port, value=179, attributes={}}]}, ImmutableLeafNode{nodeIdentifier=(urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions?revision=2018-03-29)passive-mode, value=true, attributes={}}], attributes={}}
2018-06-15 13:20:04,857 | WARN | on-dispatcher-46 | LazyDataObject | 280 - org.opendaylight.mdsal.binding-dom-codec - 0.13.0.SNAPSHOT | Dynamic proxy handler: org.opendaylight.mdsal.binding.dom.codec.impl.LazyDataObject@758cd40e
|
| Comment by Robert Varga [ 15/Jun/18 ] |
|
So it's the secondary resolution pass which needs to re-validate whether the result it got from possibleStreamChild() actually conforms to what we're looking for. |