[MDSAL-731] Failure to start Binding/DOM codec Created: 11/Mar/22  Updated: 17/Mar/22  Resolved: 17/Mar/22

Status: Resolved
Project: mdsal
Component/s: Binding runtime
Affects Version/s: None
Fix Version/s: 9.0.0

Type: Bug Priority: Highest
Reporter: Robert Varga Assignee: Robert Varga
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Relates
relates to MDSAL-735 StackOverflowError with bgp-linkstate Resolved

 Description   

Observed in OVSDB tests:

 

2022-03-11T13:43:20,963 | ERROR | features-3-thread-1 | OSGiBindingRuntime               | 168 - org.opendaylight.mdsal.binding-runtime-osgi - 9.0.0.SNAPSHOT | bundle org.opendaylight.mdsal.binding-runtime-osgi:9.0.0.SNAPSHOT (168)[org.opendaylight.mdsal.binding.runtime.osgi.impl.OSGiBindingRuntime(10)] : The activ
ate method has thrown an exception

java.lang.IllegalArgumentException: Multiple entries with same key: org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.ConnectionInfo=DefaultContainerRuntimeType{javaType=GeneratedTypeImpl{identifier=org.opendaylight.yang.gen.v1.urn.opendaylight.params.x
ml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.ConnectionInfo, annotations=[], enclosedTypes=[], enumerations=[], constants=[Constant [type=ConcreteTypeImpl{identifier=org.opendaylight.yangtools.yang.common.QName}, name=QNAME, value=org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.
hwvtep.rev150901.$YangModuleInfoImpl=connection-info]], methodSignatures=[MethodSignatureImpl [name=implementedInterface, comment=null, returnType=ParametrizedTypeImpl{identifier=java.lang.Class}, params=[], annotations=[AnnotationTypeImpl{identifier=java.lang.Override, annotations=[], parameters=[]}]], MethodSigna
tureImpl [name=bindingHashCode, comment=null, returnType=ConcreteTypeImpl{identifier=int}, params=[], annotations=[]], MethodSignatureImpl [name=bindingEquals, comment=null, returnType=ConcreteTypeImpl{identifier=boolean}, params=[], annotations=[]], MethodSignatureImpl [name=bindingToString, comment=null, returnTy
pe=ConcreteTypeImpl{identifier=java.lang.String}, params=[], annotations=[]]]}, statement=EmptyContainerEffectiveStatement{argument=(urn:opendaylight:params:xml:ns:yang:ovsdb:hwvtep?revision=2015-09-01)connection-info}} and org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvt
ep.global.attributes.ConnectionInfo=DefaultContainerRuntimeType{javaType=GeneratedTypeImpl{identifier=org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.ConnectionInfo, annotations=[], enclosedTypes=[], enumerations=[], constants=[Constant [type=Concrete
TypeImpl{identifier=org.opendaylight.yangtools.yang.common.QName}, name=QNAME, value=org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.$YangModuleInfoImpl=connection-info]], methodSignatures=[MethodSignatureImpl [name=implementedInterface, comment=null, returnType=ParametrizedT
ypeImpl{identifier=java.lang.Class}, params=[], annotations=[AnnotationTypeImpl{identifier=java.lang.Override, annotations=[], parameters=[]}]], MethodSignatureImpl [name=bindingHashCode, comment=null, returnType=ConcreteTypeImpl{identifier=int}, params=[], annotations=[]], MethodSignatureImpl [name=bindingEquals, 
comment=null, returnType=ConcreteTypeImpl{identifier=boolean}, params=[], annotations=[]], MethodSignatureImpl [name=bindingToString, comment=null, returnType=ConcreteTypeImpl{identifier=java.lang.String}, params=[], annotations=[]]]}, statement=EmptyContainerEffectiveStatement{argument=(urn:opendaylight:params:xml
:ns:yang:ovsdb?revision=2015-01-05)connection-info}}
    at com.google.common.collect.ImmutableMap.conflictException(ImmutableMap.java:377) ~[?:?]
    at com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:371) ~[?:?]
    at com.google.common.collect.RegularImmutableMap.checkNoConflictInKeyBucket(RegularImmutableMap.java:241) ~[?:?]
    at com.google.common.collect.RegularImmutableMap.fromEntryArrayCheckingBucketOverflow(RegularImmutableMap.java:132) ~[?:?]
    at com.google.common.collect.RegularImmutableMap.fromEntryArray(RegularImmutableMap.java:94) ~[?:?]
    at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:573) ~[?:?]
    at com.google.common.collect.ImmutableMap$Builder.buildOrThrow(ImmutableMap.java:601) ~[?:?]
    at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:588) ~[?:?]
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:582) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.rt.AbstractCompositeRuntimeType.<init>(AbstractCompositeRuntimeType.java:55) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.rt.DefaultListRuntimeType.<init>(DefaultListRuntimeType.java:26) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.ListGenerator.createRuntimeType(ListGenerator.java:87) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.ListGenerator.createRuntimeType(ListGenerator.java:34) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractCompositeGenerator.lambda$createRuntimeType$0(AbstractCompositeGenerator.java:174) ~[?:?]
    at java.util.Optional.map(Optional.java:265) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractCompositeGenerator.createRuntimeType(AbstractCompositeGenerator.java:172) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractCompositeGenerator.createRuntimeType(AbstractCompositeGenerator.java:117) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractExplicitGenerator.runtimeType(AbstractExplicitGenerator.java:88) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractExplicitGenerator.recursiveRuntimeType(AbstractExplicitGenerator.java:101) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractExplicitGenerator.runtimeTypeOf(AbstractExplicitGenerator.java:95) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractCompositeGenerator.indexChildren(AbstractCompositeGenerator.java:200) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractCompositeGenerator.lambda$createRuntimeType$0(AbstractCompositeGenerator.java:174) ~[?:?]
    at java.util.Optional.map(Optional.java:265) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractCompositeGenerator.createRuntimeType(AbstractCompositeGenerator.java:172) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractCompositeGenerator.createRuntimeType(AbstractCompositeGenerator.java:117) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractExplicitGenerator.runtimeType(AbstractExplicitGenerator.java:88) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractExplicitGenerator.recursiveRuntimeType(AbstractExplicitGenerator.java:101) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractExplicitGenerator.runtimeTypeOf(AbstractExplicitGenerator.java:95) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractCompositeGenerator.indexChildren(AbstractCompositeGenerator.java:200) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractCompositeGenerator.lambda$createRuntimeType$0(AbstractCompositeGenerator.java:174) ~[?:?]
    at java.util.Optional.map(Optional.java:265) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractCompositeGenerator.createRuntimeType(AbstractCompositeGenerator.java:172) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractCompositeGenerator.createRuntimeType(AbstractCompositeGenerator.java:117) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractExplicitGenerator.runtimeType(AbstractExplicitGenerator.java:88) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractExplicitGenerator.recursiveRuntimeType(AbstractExplicitGenerator.java:101) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractExplicitGenerator.runtimeTypeOf(AbstractExplicitGenerator.java:95) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractCompositeGenerator.indexChildren(AbstractCompositeGenerator.java:200) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractCompositeGenerator.lambda$createRuntimeType$0(AbstractCompositeGenerator.java:174) ~[?:?]
    at java.util.Optional.map(Optional.java:265) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractCompositeGenerator.createRuntimeType(AbstractCompositeGenerator.java:172) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractCompositeGenerator.createRuntimeType(AbstractCompositeGenerator.java:117) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.reactor.AbstractExplicitGenerator.runtimeType(AbstractExplicitGenerator.java:88) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.BindingRuntimeTypesFactory.indexModules(BindingRuntimeTypesFactory.java:76) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.BindingRuntimeTypesFactory.createTypes(BindingRuntimeTypesFactory.java:64) ~[?:?]
    at org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator.generateTypeMapping(DefaultBindingRuntimeGenerator.java:30) ~[?:?]
    at org.opendaylight.mdsal.binding.runtime.osgi.impl.OSGiBindingRuntime$ActiveInstances.add(OSGiBindingRuntime.java:101) ~[?:?]


 



 Comments   
Comment by Robert Varga [ 11/Mar/22 ]

So the problem seems to be related to augmentations and groupings and equal naming.

Startup here brings in two unrelated models, for hwvtep and southbound, which are essentially copy&pasted, both augmenting topology node with a 'uses' statement, adding ovsdb-node-attributes and hwvtep-global-attributes, both of which feature a 'connection-info' container.

This leads to the ovsdb statement ending up in the wrong original – and picking up the generated type for hwvtep.

Comment by Robert Varga [ 14/Mar/22 ]

This is also found in netconf:

[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.358 s <<< FAILURE! - in org.opendaylight.netconf.sal.connect.netconf.sal.NetconfDeviceTopologyAdapterTest
[ERROR] org.opendaylight.netconf.sal.connect.netconf.sal.NetconfDeviceTopologyAdapterTest  Time elapsed: 0.358 s  <<< ERROR!
java.lang.IllegalArgumentException: Multiple entries with same key: org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev190614.netconf.node.augmented.optional.fields.IgnoreMissingSchemaSources=DefaultContainerRuntimeType{javaType=GeneratedTypeImpl{identifier=org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev190614.netconf.node.augmented.optional.fields.IgnoreMissingSchemaSources, annotations=[], enclosedTypes=[], enumerations=[], constants=[Constant [type=ConcreteTypeImpl{identifier=org.opendaylight.yangtools.yang.common.QName}, name=QNAME, value=org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev190614.$YangModuleInfoImpl=ignore-missing-schema-sources]], methodSignatures=[MethodSignatureImpl [name=implementedInterface, comment=null, returnType=ParametrizedTypeImpl{identifier=java.lang.Class}, params=[], annotations=[AnnotationTypeImpl{identifier=java.lang.Override, annotations=[], parameters=[]}]], MethodSignatureImpl [name=bindingHashCode, comment=null, returnType=ConcreteTypeImpl{identifier=int}, params=[], annotations=[]], MethodSignatureImpl [name=bindingEquals, comment=null, returnType=ConcreteTypeImpl{identifier=boolean}, params=[], annotations=[]], MethodSignatureImpl [name=bindingToString, comment=null, returnType=ConcreteTypeImpl{identifier=java.lang.String}, params=[], annotations=[]], MethodSignatureImpl [name=getAllowed, comment=TypeMemberComment{reference=Allows reconnection of the mount point. Default false.}, returnType=ConcreteTypeImpl{identifier=java.lang.Boolean}, params=[], annotations=[]], MethodSignatureImpl [name=requireAllowed, comment=TypeMemberComment{reference=Allows reconnection of the mount point. Default false.}, returnType=ConcreteTypeImpl{identifier=java.lang.Boolean}, params=[], annotations=[]], MethodSignatureImpl [name=getReconnectTime, comment=TypeMemberComment{reference=Time for reconnection - in units milliseconds. Default 5000 ms.}, returnType=ConcreteTypeImpl{identifier=org.opendaylight.yangtools.yang.common.Uint32}, params=[], annotations=[]], MethodSignatureImpl [name=requireReconnectTime, comment=TypeMemberComment{reference=Time for reconnection - in units milliseconds. Default 5000 ms.}, returnType=ConcreteTypeImpl{identifier=org.opendaylight.yangtools.yang.common.Uint32}, params=[], annotations=[]]]}, statement=RegularContainerEffectiveStatement{argument=(urn:opendaylight:netconf-node-topology?revision=2015-01-14)ignore-missing-schema-sources}} and org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev190614.netconf.node.augmented.optional.fields.IgnoreMissingSchemaSources=DefaultContainerRuntimeType{javaType=GeneratedTypeImpl{identifier=org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev190614.netconf.node.augmented.optional.fields.IgnoreMissingSchemaSources, annotations=[], enclosedTypes=[], enumerations=[], constants=[Constant [type=ConcreteTypeImpl{identifier=org.opendaylight.yangtools.yang.common.QName}, name=QNAME, value=org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev190614.$YangModuleInfoImpl=ignore-missing-schema-sources]], methodSignatures=[MethodSignatureImpl [name=implementedInterface, comment=null, returnType=ParametrizedTypeImpl{identifier=java.lang.Class}, params=[], annotations=[AnnotationTypeImpl{identifier=java.lang.Override, annotations=[], parameters=[]}]], MethodSignatureImpl [name=bindingHashCode, comment=null, returnType=ConcreteTypeImpl{identifier=int}, params=[], annotations=[]], MethodSignatureImpl [name=bindingEquals, comment=null, returnType=ConcreteTypeImpl{identifier=boolean}, params=[], annotations=[]], MethodSignatureImpl [name=bindingToString, comment=null, returnType=ConcreteTypeImpl{identifier=java.lang.String}, params=[], annotations=[]], MethodSignatureImpl [name=getAllowed, comment=TypeMemberComment{reference=Allows reconnection of the mount point. Default false.}, returnType=ConcreteTypeImpl{identifier=java.lang.Boolean}, params=[], annotations=[]], MethodSignatureImpl [name=requireAllowed, comment=TypeMemberComment{reference=Allows reconnection of the mount point. Default false.}, returnType=ConcreteTypeImpl{identifier=java.lang.Boolean}, params=[], annotations=[]], MethodSignatureImpl [name=getReconnectTime, comment=TypeMemberComment{reference=Time for reconnection - in units milliseconds. Default 5000 ms.}, returnType=ConcreteTypeImpl{identifier=org.opendaylight.yangtools.yang.common.Uint32}, params=[], annotations=[]], MethodSignatureImpl [name=requireReconnectTime, comment=TypeMemberComment{reference=Time for reconnection - in units milliseconds. Default 5000 ms.}, returnType=ConcreteTypeImpl{identifier=org.opendaylight.yangtools.yang.common.Uint32}, params=[], annotations=[]]]}, statement=EmptyContainerEffectiveStatement{argument=(urn:opendaylight:netconf-node-optional?revision=2019-06-14)ignore-missing-schema-sources}}
	at com.google.common.collect.ImmutableMap.conflictException(ImmutableMap.java:377)
	at com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:371)
	at com.google.common.collect.RegularImmutableMap.checkNoConflictInKeyBucket(RegularImmutableMap.java:241)
	at com.google.common.collect.RegularImmutableMap.fromEntryArrayCheckingBucketOverflow(RegularImmutableMap.java:132)
	at com.google.common.collect.RegularImmutableMap.fromEntryArray(RegularImmutableMap.java:94)
	at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:573)
	at com.google.common.collect.ImmutableMap$Builder.buildOrThrow(ImmutableMap.java:601)
	at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:588)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:582)
	at org.opendaylight.mdsal.binding.generator.impl.rt.AbstractCompositeRuntimeType.<init>(AbstractCompositeRuntimeType.java:55)
Comment by Robert Varga [ 17/Mar/22 ]

So this is related to MDSAL-735. With the rework currently in place, this problem disappears as does the StackOverflowError in MDSAL-735.

Generated at Wed Feb 07 20:10:46 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.