[MDSAL-213] Serializing DataObject to JSON causes frozen class exception Created: 21/Dec/16  Updated: 12/Jun/18  Resolved: 06/Jun/18

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

Type: Bug
Reporter: Guy Sela Assignee: Michael Vorburger
Resolution: Cannot Reproduce Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Operating System: All
Platform: All


Attachments: File karaf.log.gz     Zip Archive karaf.zip     Zip Archive karafagain.zip    
Issue Links:
Blocks
is blocked by NETVIRT-1089 Add trace:transactions to suite teard... In Progress
is blocked by CONTROLLER-1834 Transaction Trace tool wiring for pin... Resolved
Duplicate
is duplicated by MDSAL-230 Caused by: java.lang.RuntimeException... Resolved
Relates
relates to CONTROLLER-1832 Transaction Trace tool wiring creates... Resolved
External issue ID: 7420

 Description   

Working with a version close to stable/boron.
Trying to deserialize different BindingAware DataObjects to JSON, and sometimes getting this exception:

2016-12-21 14:10:17,114 | ERROR | pool-63-thread-4 | FederationProducerMgr            | 360 - org.opendaylight.federation.service-impl - 0.1.2.SNAPSHOT | com.google.common.util.concurrent.UncheckedExecutionException: java.lang.RuntimeException: org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation$StreamWriter: frozen class (cannot edit)
com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: java.lang.RuntimeException: org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation$StreamWriter: frozen class (cannot edit)
        at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2203)[38:com.google.guava:18.0.0]
        at com.google.common.cache.LocalCache.get(LocalCache.java:3937)[38:com.google.guava:18.0.0]
        at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3941)[38:com.google.guava:18.0.0]
        at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4824)[38:com.google.guava:18.0.0]
        at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4830)[38:com.google.guava:18.0.0]
        at org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry.getSerializer(BindingNormalizedNodeCodecRegistry.java:72)[92:org.opendaylight.mdsal.binding-dom-codec:0.9.2.SNAPSHOT]
        at org.opendaylight.yangtools.binding.data.codec.util.AugmentableDispatchSerializer.emitAugmentation(AugmentableDispatchSerializer.java:77)[92:org.opendaylight.mdsal.binding-dom-codec:0.9.2.SNAPSHOT]
        at org.opendaylight.yangtools.binding.data.codec.util.AugmentableDispatchSerializer.serialize(AugmentableDispatchSerializer.java:51)[92:org.opendaylight.mdsal.binding-dom-codec:0.9.2.SNAPSHOT]
        at org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node$StreamWriter.serialize(DataObjectSerializerPrototype.java)[57:org.opendaylight.mdsal.model.ietf-topology:2013.10.21.9_2-SNAPSHOT]
        at org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology$StreamWriter.serialize(DataObjectSerializerPrototype.java)[57:org.opendaylight.mdsal.model.ietf-topology:2013.10.21.9_2-SNAPSHOT]
        at org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology$StreamWriter.serialize(DataObjectSerializerPrototype.java)[57:org.opendaylight.mdsal.model.ietf-topology:2013.10.21.9_2-SNAPSHOT]
        at org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry$DataObjectSerializerProxy.serialize(BindingNormalizedNodeCodecRegistry.java:295)[92:org.opendaylight.mdsal.binding-dom-codec:0.9.2.SNAPSHOT]
        at org.opendaylight.federation.service.api.message.BindingAwareJsonConverter.jsonStringFromDataObject(BindingAwareJsonConverter.java:147)[359:org.opendaylight.federation.service-api:0.1.2.SNAPSHOT]


 Comments   
Comment by Guy Sela [ 21/Dec/16 ]

Attachment karafagain.zip has been added with description: karaf log

Comment by Guy Sela [ 21/Dec/16 ]

Attachment karaf.zip has been added with description: Another karaf log experiencing this issue

Comment by Peter Kajsa [ 21/Dec/16 ]

It seems like an issue in binding generator, hence moved to md-sal.

Comment by Martin Ciglan [ 22/Dec/16 ]

Hi

what do you mean by "close to stable" ?
Since issue occurs only sometimes, I decrease severity to MAJOR.

Comment by Martin Ciglan [ 22/Dec/16 ]

It looks like we came across this issue in the past

https://lists.opendaylight.org/pipermail/sfc-dev/2015-November/002344.html
https://git.opendaylight.org/gerrit/#/c/18820

investigating ...

Comment by Guy Sela [ 22/Dec/16 ]

Synced from stable boron at 15/12/2016.
I think it is critical because when it happens, the workflow completely fails.
The fact that it is a race bug, which is not deterministic, is a stronger reason to fix that, because any mechanism that will try to workaround it until fixed, can't be actually verified.
Is there a theoretical workaround?
Maybe retrying the serialization can help ? Add a sleep before ? I really don't know what is the possible root cause, so it would really help to get some directions from you guys.

Comment by Guy Sela [ 25/Dec/16 ]

Now I got the same exception while calling tx.merge in a write transaction. It made me think that maybe the concurrent operations i'm doing are:

  • Serializing a DataObject to JSON
  • Merging a write transaction with the same type of DataObject into MD-SAL.

Can this explain the failure?
If it does, will it happen only in the first time serializing the object?

I'm attaching the log of the new failure

Comment by Guy Sela [ 25/Dec/16 ]

Attachment karaf.log.gz has been added with description: Karaf log that fails in merge tx

Comment by Guy Sela [ 25/Dec/16 ]

So as a workaround I added a Thread.sleep of 500 millis and retried the operation, and it actually fixed the problem.

Comment by Guy Sela [ 25/Dec/16 ]

Okay so apparently I can't apply this workaround, because the frozen class issue can stem from places that are not in my control:
com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: java.lang.RuntimeException: org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.ela
n.rev150602.elan.interfaces.ElanInterface$StreamWriter: frozen class (cannot edit)
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2203)[38:com.google.guava:18.0.0]
at com.google.common.cache.LocalCache.get(LocalCache.java:3937)[38:com.google.guava:18.0.0]
at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3941)[38:com.google.guava:18.0.0]
at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4824)[38:com.google.guava:18.0.0]
at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4830)[38:com.google.guava:18.0.0]
at org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry.getSerializer(BindingNormalizedNodeCodecRegistry.java:72)[92:org.opendaylight.mdsal.binding-dom-codec:0.9.2.SNAPSH
OT]
at org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry.toNormalizedNode(BindingNormalizedNodeCodecRegistry.java:106)[92:org.opendaylight.mdsal.binding-dom-codec:0.9.2.SN
APSHOT]
at org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec.toNormalizedNode(BindingToNormalizedNodeCodec.java:132)[146:org.opendaylight.controller.sal-binding-broker-impl:1.4.2.SNAPS
HOT]
at org.opendaylight.controller.md.sal.binding.impl.AbstractWriteTransaction.put(AbstractWriteTransaction.java:39)[146:org.opendaylight.controller.sal-binding-broker-impl:1.4.2.SNAPSHOT]
at org.opendaylight.genius.mdsalutil.MDSALUtil.syncWrite(MDSALUtil.java:521)[281:org.opendaylight.genius.mdsalutil-api:0.1.2.SNAPSHOT]
at org.opendaylight.netvirt.elan.internal.ElanServiceProvider.addElanInterface(ElanServiceProvider.java:271)[325:org.opendaylight.netvirt.elanmanager-impl:0.3.2.SNAPSHOT]
at org.opendaylight.netvirt.elan.internal.ElanServiceProvider.createExternalElanNetwork(ElanServiceProvider.java:489)[325:org.opendaylight.netvirt.elanmanager-impl:0.3.2.SNAPSHOT]
at org.opendaylight.netvirt.elan.internal.ElanServiceProvider.lambda$createExternalElanNetworks$0(ElanServiceProvider.java:469)[325:org.opendaylight.netvirt.elanmanager-impl:0.3.2.SNAPSHOT]
at org.opendaylight.netvirt.elan.internal.ElanServiceProvider.handleExternalElanNetworks(ElanServiceProvider.java:702)[325:org.opendaylight.netvirt.elanmanager-impl:0.3.2.SNAPSHOT]
at org.opendaylight.netvirt.elan.internal.ElanServiceProvider.createExternalElanNetworks(ElanServiceProvider.java:468)[325:org.opendaylight.netvirt.elanmanager-impl:0.3.2.SNAPSHOT]
at org.opendaylight.netvirt.elan.internal.ElanOvsdbNodeListener.add(ElanOvsdbNodeListener.java:97)[325:org.opendaylight.netvirt.elanmanager-impl:0.3.2.SNAPSHOT]
at org.opendaylight.netvirt.elan.internal.ElanOvsdbNodeListener.add(ElanOvsdbNodeListener.java:30)[325:org.opendaylight.netvirt.elanmanager-impl:0.3.2.SNAPSHOT]
at org.opendaylight.genius.mdsalutil.AbstractDataChangeListener.createData(AbstractDataChangeListener.java:68)[281:org.opendaylight.genius.mdsalutil-api:0.1.2.SNAPSHOT]
at org.opendaylight.genius.mdsalutil.AbstractDataChangeListener.onDataChanged(AbstractDataChangeListener.java:54)[281:org.opendaylight.genius.mdsalutil-api:0.1.2.SNAPSHOT]
at org.opendaylight.controller.md.sal.binding.impl.AbstractForwardedDataBroker$TranslatingDataChangeInvoker.onDataChanged(AbstractForwardedDataBroker.java:143)[146:org.opendaylight.controller.sal-binding-broker-impl:1.4.2.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataChangeListener.dataChanged(DataChangeListener.java:71)[176:org.opendaylight.controller.sal-distributed-datastore:1.4.2.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataChangeListener.handleReceive(DataChangeListener.java:43)[176:org.opendaylight.controller.sal-distributed-datastore:1.4.2.SNAPSHOT]
at org.opendaylight.controller.cluster.common.actor.AbstractUntypedActor.onReceive(AbstractUntypedActor.java:26)[170:org.opendaylight.controller.sal-clustering-commons:1.4.2.SNAPSHOT]
at akka.actor.UntypedActor$$anonfun$receive$1.applyOrElse(UntypedActor.scala:165)[158:com.typesafe.akka.actor:2.4.7]
at akka.actor.Actor$class.aroundReceive(Actor.scala:484)[158:com.typesafe.akka.actor:2.4.7]
at akka.actor.UntypedActor.aroundReceive(UntypedActor.scala:95)[158:com.typesafe.akka.actor:2.4.7]
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:526)[158:com.typesafe.akka.actor:2.4.7]
at akka.actor.ActorCell.invoke(ActorCell.scala:495)[158:com.typesafe.akka.actor:2.4.7]
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257)[158:com.typesafe.akka.actor:2.4.7]
at akka.dispatch.Mailbox.run(Mailbox.scala:224)[158:com.typesafe.akka.actor:2.4.7]
at akka.dispatch.Mailbox.exec(Mailbox.scala:234)[158:com.typesafe.akka.actor:2.4.7]
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)[154:org.scala-lang.scala-library:2.11.8.v20160304-115712-1706a37eb8]
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)[154:org.scala-lang.scala-library:2.11.8.v20160304-115712-1706a37eb8]
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)[154:org.scala-lang.scala-library:2.11.8.v20160304-115712-1706a37eb8]
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)[154:org.scala-lang.scala-library:2.11.8.v20160304-115712-1706a37eb8]
Caused by: com.google.common.util.concurrent.UncheckedExecutionException: java.lang.RuntimeException: org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface$StreamWriter: frozen class (cannot edit)

Comment by Robert Varga [ 30/Jan/18 ]

I suspect we need to move away from javassist to get rid of this issue. I suspect this happens because the class loaders are not completely cleaned up and we end up with untracked codec classes.

Comment by Michael Vorburger [ 08/May/18 ]

We've hit this one again, and apparently we (not myself but aswins JankiChhatbar smalleni ?) can now fairly reliably reproduce this...

MDSAL maintainers rovarga tpantelis martin.ciglan can you help with this?

Otherwise I guess I'll have to dig into this code to see if I can make any sense of this...

Comment by Michael Vorburger [ 08/May/18 ]

FTR: As was discussed in MDSAL-230, following MDSAL-200 the stack trace is now .mdsal. instead of .yangtools. but this is the very same issue, here's a current stack trace, from our https://bugzilla.redhat.com/show_bug.cgi?id=1573273 :

2018-04-30T15:08:33,051 | ERROR | org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode_AsyncClusteredDataTreeChangeListenerBase-DataTreeChangeHandler-0 | AsyncClusteredDataTreeChangeListenerBase | 263 - org.opendaylight.genius.mdsalutil-api - 0.4.0.redhat-8 | Thread terminated due to uncaught exception: org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode_AsyncClusteredDataTreeChangeListenerBase-DataTreeChangeHandler-0
com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: java.lang.RuntimeException: org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata$StreamWriter: frozen class (cannot edit)
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2218) [32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.get(LocalCache.java:4147) [32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:4151) [32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:5140) [32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:5146) [32:com.google.guava:23.3.0.jre]
    at org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry.getSerializer(BindingNormalizedNodeCodecRegistry.java:72) [290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry.toNormalizedNode(BindingNormalizedNodeCodecRegistry.java:107) [290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec.toNormalizedNode(BindingToNormalizedNodeCodec.java:134) [220:org.opendaylight.controller.sal-binding-broker-impl:1.7.0.redhat-8]
    at org.opendaylight.controller.md.sal.binding.impl.AbstractWriteTransaction.put(AbstractWriteTransaction.java:39) [220:org.opendaylight.controller.sal-binding-broker-impl:1.7.0.redhat-8]
    at org.opendaylight.genius.mdsalutil.internal.MDSALManager.writeFlowEntityInternal(MDSALManager.java:183) [264:org.opendaylight.genius.mdsalutil-impl:0.4.0.redhat-8]
    at org.opendaylight.genius.mdsalutil.internal.MDSALManager.installFlowInternal(MDSALManager.java:142) [264:org.opendaylight.genius.mdsalutil-impl:0.4.0.redhat-8]
    at org.opendaylight.genius.mdsalutil.internal.MDSALManager.installFlow(MDSALManager.java:609) [264:org.opendaylight.genius.mdsalutil-impl:0.4.0.redhat-8]
    at Proxydde4f757_0177_4930_af4f_a514886e67a6.installFlow(Unknown Source) [?:?]
    at Proxy12933f77_31f6_4e8b_b7ca_4582b0b424a9.installFlow(Unknown Source) [?:?]
    at org.opendaylight.netvirt.ipv6service.Ipv6NodeListener.createTableMissEntry(Ipv6NodeListener.java:91) [356:org.opendaylight.netvirt.ipv6service-impl:0.6.0.redhat-8]
    at org.opendaylight.netvirt.ipv6service.Ipv6NodeListener.add(Ipv6NodeListener.java:74) [356:org.opendaylight.netvirt.ipv6service-impl:0.6.0.redhat-8]
    at org.opendaylight.netvirt.ipv6service.Ipv6NodeListener.add(Ipv6NodeListener.java:36) [356:org.opendaylight.netvirt.ipv6service-impl:0.6.0.redhat-8]
    at org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase$DataTreeChangeHandler.run(AsyncClusteredDataTreeChangeListenerBase.java:155) [263:org.opendaylight.genius.mdsalutil-api:0.4.0.redhat-8]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:?]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:?]
    at java.lang.Thread.run(Thread.java:748) [?:?]
  Caused by: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: java.lang.RuntimeException: org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata$StreamWriter: frozen class (cannot edit)
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2218) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.get(LocalCache.java:4147) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:4151) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:5140) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:5146) ~[32:com.google.guava:23.3.0.jre]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.getSerializer(AbstractStreamWriterGenerator.java:87) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry$GeneratorLoader.load(BindingNormalizedNodeCodecRegistry.java:283) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry$GeneratorLoader.load(BindingNormalizedNodeCodecRegistry.java:280) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3708) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2416) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2299) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2212) ~[32:com.google.guava:23.3.0.jre]
    ... 20 more
  Caused by: com.google.common.util.concurrent.UncheckedExecutionException: com.google.common.util.concurrent.UncheckedExecutionException: java.lang.RuntimeException: org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata$StreamWriter: frozen class (cannot edit)
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2218) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.get(LocalCache.java:4147) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:4151) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:5140) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:5146) ~[32:com.google.guava:23.3.0.jre]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.loadSerializerFor(AbstractStreamWriterGenerator.java:97) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataObjectSerializerSource.staticInvokeEmitter(DataObjectSerializerSource.java:144) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.emitChildInner(DataNodeContainerSerializerSource.java:184) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.emitChild(DataNodeContainerSerializerSource.java:158) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.emitBody(DataNodeContainerSerializerSource.java:148) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.getSerializerBody(DataNodeContainerSerializerSource.java:83) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.lambda$generateEmitter0$0(AbstractStreamWriterGenerator.java:205) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.yangtools.util.ClassLoaderUtils.withClassLoader(ClassLoaderUtils.java:51) ~[425:org.opendaylight.yangtools.util:2.0.1.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.generateEmitter0(AbstractStreamWriterGenerator.java:204) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.access$300(AbstractStreamWriterGenerator.java:45) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.generateSerializer(AbstractStreamWriterGenerator.java:138) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.load(AbstractStreamWriterGenerator.java:124) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.load(AbstractStreamWriterGenerator.java:100) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3708) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2416) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2299) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2212) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.get(LocalCache.java:4147) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:4151) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:5140) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:5146) ~[32:com.google.guava:23.3.0.jre]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.getSerializer(AbstractStreamWriterGenerator.java:87) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry$GeneratorLoader.load(BindingNormalizedNodeCodecRegistry.java:283) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry$GeneratorLoader.load(BindingNormalizedNodeCodecRegistry.java:280) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3708) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2416) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2299) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2212) ~[32:com.google.guava:23.3.0.jre]
    ... 20 more
  Caused by: com.google.common.util.concurrent.UncheckedExecutionException: java.lang.RuntimeException: org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata$StreamWriter: frozen class (cannot edit)
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2218) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.get(LocalCache.java:4147) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:4151) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:5140) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:5146) ~[32:com.google.guava:23.3.0.jre]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.loadSerializerFor(AbstractStreamWriterGenerator.java:97) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataObjectSerializerSource.staticInvokeEmitter(DataObjectSerializerSource.java:144) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.emitChildInner(DataNodeContainerSerializerSource.java:184) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.emitChild(DataNodeContainerSerializerSource.java:158) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.emitBody(DataNodeContainerSerializerSource.java:148) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.getSerializerBody(DataNodeContainerSerializerSource.java:83) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.lambda$generateEmitter0$0(AbstractStreamWriterGenerator.java:205) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.yangtools.util.ClassLoaderUtils.withClassLoader(ClassLoaderUtils.java:51) ~[425:org.opendaylight.yangtools.util:2.0.1.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.generateEmitter0(AbstractStreamWriterGenerator.java:204) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.access$300(AbstractStreamWriterGenerator.java:45) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.generateSerializer(AbstractStreamWriterGenerator.java:138) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.load(AbstractStreamWriterGenerator.java:124) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.load(AbstractStreamWriterGenerator.java:100) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3708) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2416) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2299) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2212) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.get(LocalCache.java:4147) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:4151) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:5140) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:5146) ~[32:com.google.guava:23.3.0.jre]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.loadSerializerFor(AbstractStreamWriterGenerator.java:97) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataObjectSerializerSource.staticInvokeEmitter(DataObjectSerializerSource.java:144) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.emitChildInner(DataNodeContainerSerializerSource.java:184) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.emitChild(DataNodeContainerSerializerSource.java:158) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.emitBody(DataNodeContainerSerializerSource.java:148) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.getSerializerBody(DataNodeContainerSerializerSource.java:83) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.lambda$generateEmitter0$0(AbstractStreamWriterGenerator.java:205) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.yangtools.util.ClassLoaderUtils.withClassLoader(ClassLoaderUtils.java:51) ~[425:org.opendaylight.yangtools.util:2.0.1.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.generateEmitter0(AbstractStreamWriterGenerator.java:204) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.access$300(AbstractStreamWriterGenerator.java:45) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.generateSerializer(AbstractStreamWriterGenerator.java:138) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.load(AbstractStreamWriterGenerator.java:124) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.load(AbstractStreamWriterGenerator.java:100) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3708) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2416) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2299) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2212) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.get(LocalCache.java:4147) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:4151) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:5140) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:5146) ~[32:com.google.guava:23.3.0.jre]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.getSerializer(AbstractStreamWriterGenerator.java:87) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry$GeneratorLoader.load(BindingNormalizedNodeCodecRegistry.java:283) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry$GeneratorLoader.load(BindingNormalizedNodeCodecRegistry.java:280) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3708) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2416) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2299) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2212) ~[32:com.google.guava:23.3.0.jre]
    ... 20 more
  Caused by: java.lang.RuntimeException: org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata$StreamWriter: frozen class (cannot edit)
    at javassist.ClassPool.checkNotFrozen(ClassPool.java:617) ~[66:javassist:3.21.0.GA]
    at javassist.CtClassType.setName(CtClassType.java:353) ~[66:javassist:3.21.0.GA]
    at javassist.ClassPool.getAndRename(ClassPool.java:408) ~[66:javassist:3.21.0.GA]
    at org.opendaylight.mdsal.binding.generator.util.JavassistUtils.instantiatePrototype(JavassistUtils.java:127) ~[293:org.opendaylight.mdsal.binding-generator-impl:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.generateEmitter0(AbstractStreamWriterGenerator.java:208) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.access$300(AbstractStreamWriterGenerator.java:45) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.generateSerializer(AbstractStreamWriterGenerator.java:138) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.load(AbstractStreamWriterGenerator.java:124) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.load(AbstractStreamWriterGenerator.java:100) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3708) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2416) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2299) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2212) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.get(LocalCache.java:4147) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:4151) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:5140) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:5146) ~[32:com.google.guava:23.3.0.jre]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.loadSerializerFor(AbstractStreamWriterGenerator.java:97) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataObjectSerializerSource.staticInvokeEmitter(DataObjectSerializerSource.java:144) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.emitChildInner(DataNodeContainerSerializerSource.java:184) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.emitChild(DataNodeContainerSerializerSource.java:158) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.emitBody(DataNodeContainerSerializerSource.java:148) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.getSerializerBody(DataNodeContainerSerializerSource.java:83) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.lambda$generateEmitter0$0(AbstractStreamWriterGenerator.java:205) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.yangtools.util.ClassLoaderUtils.withClassLoader(ClassLoaderUtils.java:51) ~[425:org.opendaylight.yangtools.util:2.0.1.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.generateEmitter0(AbstractStreamWriterGenerator.java:204) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.access$300(AbstractStreamWriterGenerator.java:45) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.generateSerializer(AbstractStreamWriterGenerator.java:138) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.load(AbstractStreamWriterGenerator.java:124) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.load(AbstractStreamWriterGenerator.java:100) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3708) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2416) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2299) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2212) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.get(LocalCache.java:4147) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:4151) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:5140) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:5146) ~[32:com.google.guava:23.3.0.jre]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.loadSerializerFor(AbstractStreamWriterGenerator.java:97) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataObjectSerializerSource.staticInvokeEmitter(DataObjectSerializerSource.java:144) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.emitChildInner(DataNodeContainerSerializerSource.java:184) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.emitChild(DataNodeContainerSerializerSource.java:158) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.emitBody(DataNodeContainerSerializerSource.java:148) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataNodeContainerSerializerSource.getSerializerBody(DataNodeContainerSerializerSource.java:83) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.lambda$generateEmitter0$0(AbstractStreamWriterGenerator.java:205) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.yangtools.util.ClassLoaderUtils.withClassLoader(ClassLoaderUtils.java:51) ~[425:org.opendaylight.yangtools.util:2.0.1.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.generateEmitter0(AbstractStreamWriterGenerator.java:204) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.access$300(AbstractStreamWriterGenerator.java:45) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.generateSerializer(AbstractStreamWriterGenerator.java:138) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.load(AbstractStreamWriterGenerator.java:124) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator$SerializerImplementationLoader.load(AbstractStreamWriterGenerator.java:100) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3708) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2416) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2299) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2212) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.get(LocalCache.java:4147) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:4151) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:5140) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:5146) ~[32:com.google.guava:23.3.0.jre]
    at org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator.getSerializer(AbstractStreamWriterGenerator.java:87) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry$GeneratorLoader.load(BindingNormalizedNodeCodecRegistry.java:283) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry$GeneratorLoader.load(BindingNormalizedNodeCodecRegistry.java:280) ~[290:org.opendaylight.mdsal.binding-dom-codec:0.12.0.redhat-8]
    at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3708) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2416) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2299) ~[32:com.google.guava:23.3.0.jre]
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2212) ~[32:com.google.guava:23.3.0.jre]
    ... 20 more
Comment by Michael Vorburger [ 08/May/18 ]

> Otherwise I guess I'll have to dig into this code to see if I can make any sense of this...

This having been a purely rhetorical Q, I now at least understand what can cause these Princess Elsa of Arendelle (frozen) situations:

    @Test
    public void testMDSAL_213() throws NotFoundException, CannotCompileException {
        JavassistUtils javassistUtils = JavassistUtils.forClassPool(ClassPool.getDefault());
        Class<String> type = String.class;
        CtClass poolClass = javassistUtils.instantiatePrototype(type.getName(), "Something$StreamWriter", cls -> { });
        @SuppressWarnings({ "unchecked", "unused" })
        Class<? extends DataObjectSerializerImplementation> javaClass = poolClass.toClass(type.getClassLoader(), type.getProtectionDomain());
        javassistUtils.instantiatePrototype(type.getName(), "Something$StreamWriter", cls -> { });
    }

Above is inspired from the real code in org.opendaylight.mdsal.binding.dom.codec.gen.impl.AbstractStreamWriterGenerator but simplified a bit (and we use String as the type instead of the real DataObjectSerializerPrototype just because that is not available in mdsal-binding-dom-codec). If we copy/paste that e.g. into org.opendaylight.mdsal.binding.generator.util.JavassistUtilsTest, then the 2nd instantiatePrototype() indeed causes:

java.lang.RuntimeException: Something$StreamWriter: frozen class (cannot edit)

But if, and only if, the poolClass.toClass() already happened! So this smells of some concurrency problem - we may be creating the $StreamWriter in parallel? The fact that this problem is only seen in cluster load tests, but not eay gone standard CSITs supports that hypothesis. The trouble is... the way I currently understand the code in AbstractStreamWriterGenerator it SHOULD be concurrency/thread safe? But clearly it's not, as we are hitting this problem (and can reproduce it) - so what am I missing? If not found, we could perhaps also build a dumb band aid fix... the way I understand things, that 2nd new $StreamWriter should be the same as the original one? So... we could cheat, and brush the frozen yogurt RuntimeException under the carpet, IFF we meanwhile have the class in the cache? I'll propose something like that - for discussion. I'll also add some additional logging to see if perhaps that could help to make more sense of what is really going on here.

Comment by Robert Varga [ 08/May/18 ]

I think this boils down to classloader vs. classpool vs. cache lifecycle. I do not believe we can just sweep it under the carpet – for that you need to be sure you are sweeping, not smearing ...

Comment by Michael Vorburger [ 08/May/18 ]

> I think this boils down to classloader vs. classpool vs. cache lifecycle. 

right... so the ClassPool (currently) ultimately used in AbstractStreamWriterGenerator is fixed, unless I'm completely mistaken, it's the  private static final JavassistUtils JAVASSIST = JavassistUtils.forClassPool(ClassPool.getDefault()); from the BindingToNormalizedNodeCodecFactory?

the classloader vs. cache lifecycle is a little unclear to me so far, but one of the changes I've raised today under this JIRA (see above) adds more (debug) logging; if I can get that to run on where we can apparently reproduce this fairly reliably, perhaps we'll learn more.

Comment by Michael Vorburger [ 08/May/18 ]

Just for the record, this looks funky, but I don't thinks is our problem here, because we do not evict, at least not programmatically (but GC?):

https://softwaremill.com/race-condition-cache-guava-caffeine/

but we DO have weak Class keys - one of my Gerrits today proposes to remove them.

Comment by Robert Varga [ 15/May/18 ]

While we are using weak keys, it is on Class objects – which means that a GC-induced invalidation of the key simply cannot happen while we are using it for lookup.

Comment by Michael Vorburger [ 31/May/18 ]

jluhrsen meanwhile has also hit this in NETVIRT-1089, and will try to provide us the new debug logs I recently added.

I've just stumbled upon CONTROLLER-1832, which could be related / causing this... TBC if THE or A cause.

Comment by Michael Vorburger [ 04/Jun/18 ]

CONTROLLER-1834 has something else which seems vaguely related - not claiming / no proof (yet) it's causing this, but at least worth noting.

Comment by Michael Vorburger [ 06/Jun/18 ]

jluhrsen's  NETVIRT-1089 is no longer able to reproduce this after CONTROLLER-1832.

Comment by Michael Vorburger [ 12/Jun/18 ]

FTR: The additional DEBUG logigng for this (c/71890) went into Oxygen SR2 (not only SR3; which CONTROLLER-1834 and CONTROLLER-1832 will).

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