[NETCONF-127] Netconf device on clustered setup has "Write Once Read Many" configuration Created: 14/Jan/16  Updated: 15/Mar/19  Resolved: 06/Jun/16

Status: Resolved
Project: netconf
Component/s: netconf
Affects Version/s: None
Fix Version/s: None

Type: Bug
Reporter: Jozef Behran Assignee: Tomas Cere
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Operating System: All
Platform: All


External issue ID: 4968

 Description   

Tested and found on latest Beryllium.

After configuring a Netconf device on a clustered setup (see https://jenkins.opendaylight.org/sandbox/job/netconf-csit-3node-clustering-only-beryllium/ for a sandbox example) it is possible to write the configuration data exactly once. When an attempt to modify the data is subsequently made, weird things start to happen:

{"errors":{"error":[{"error-type":"application","error-tag":"operation-failed","error-message":"Transaction commit failed","error-info":"java.util.concurrent.ExecutionException: java.lang.NullPointerException\n\tat com.google.common.util.concurrent.AbstractFuture$Sync.getValue(AbstractFuture.java:299)\n\tat com.google.common.util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:286)\n\tat com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:116)\n\tat com.google.common.util.concurrent.ForwardingFuture.get(ForwardingFuture.java:63)\n\tat com.google.common.util.concurrent.AbstractCheckedFuture.checkedGet(AbstractCheckedFuture.java:78)\n\tat org.opendaylight.netconf.sal.restconf.impl.RestconfImpl.updateConfigurationData(RestconfImpl.java:723)\n\tat org.opendaylight.netconf.sal.restconf.impl.StatisticsRestconfServiceWrapper.updateConfigurationData(StatisticsRestconfServiceWrapper.java:133)\n\tat org.opendaylight.netconf.sal.rest.impl.RestconfCompositeWrapper.updateConfigurationData(RestconfCompositeWrapper.java:82)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.lang.reflect.Method.invoke(Method.java:606)\n\tat com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)\n\tat com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseO...

(this appeared on the console)

— snip —

2016-01-14 15:14:13,108 | ERROR | lt-dispatcher-15 | OneForOneStrategy | 149 - com.typesafe.akka.slf4j - 2.3.14 | RemoteDevice

{netconf-test-device}: Transaction org.opendaylight.netconf.sal.connect.netconf.sal.tx.WriteCandidateTx@526966bc already finished
java.lang.IllegalStateException: RemoteDevice{netconf-test-device}

: Transaction org.opendaylight.netconf.sal.connect.netconf.sal.tx.WriteCandidateTx@526966bc already finished
at com.google.common.base.Preconditions.checkState(Preconditions.java:197)[39:com.google.guava:18.0.0]
at org.opendaylight.netconf.sal.connect.netconf.sal.tx.AbstractWriteTx.checkNotFinished(AbstractWriteTx.java:58)[228:org.opendaylight.netconf.sal-netconf-connector:1.3.0.SNAPSHOT]
at org.opendaylight.netconf.sal.connect.netconf.sal.tx.AbstractWriteTx.checkEditable(AbstractWriteTx.java:172)[228:org.opendaylight.netconf.sal-netconf-connector:1.3.0.SNAPSHOT]
at org.opendaylight.netconf.sal.connect.netconf.sal.tx.AbstractWriteTx.put(AbstractWriteTx.java:103)[228:org.opendaylight.netconf.sal-netconf-connector:1.3.0.SNAPSHOT]
at org.opendaylight.netconf.topology.pipeline.NetconfDeviceMasterDataBroker.put(NetconfDeviceMasterDataBroker.java:149)[230:org.opendaylight.netconf.topology:1.0.0.SNAPSHOT]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.7.0_85]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)[:1.7.0_85]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.7.0_85]
at java.lang.reflect.Method.invoke(Method.java:606)[:1.7.0_85]
at akka.actor.TypedActor$MethodCall.apply(TypedActor.scala:147)[148:com.typesafe.akka.actor:2.3.14]
at akka.actor.TypedActor$TypedActor$$anonfun$receive$1$$anonfun$applyOrElse$2.apply(TypedActor.scala:307)[148:com.typesafe.akka.actor:2.3.14]
at akka.actor.TypedActor$TypedActor.withContext(TypedActor.scala:299)[148:com.typesafe.akka.actor:2.3.14]
at akka.actor.TypedActor$TypedActor$$anonfun$receive$1.applyOrElse(TypedActor.scala:306)[148:com.typesafe.akka.actor:2.3.14]
at akka.actor.Actor$class.aroundReceive(Actor.scala:467)[148:com.typesafe.akka.actor:2.3.14]
at akka.actor.TypedActor$TypedActor.aroundReceive(TypedActor.scala:246)[148:com.typesafe.akka.actor:2.3.14]
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)[148:com.typesafe.akka.actor:2.3.14]
at akka.actor.ActorCell.invoke(ActorCell.scala:487)[148:com.typesafe.akka.actor:2.3.14]
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238)[148:com.typesafe.akka.actor:2.3.14]
at akka.dispatch.Mailbox.run(Mailbox.scala:220)[148:com.typesafe.akka.actor:2.3.14]
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397)[148:com.typesafe.akka.actor:2.3.14]
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:262)[145:org.scala-lang.scala-library:2.10.1.v20130302-092018-VFINAL-33e32179fd]
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975)[145:org.scala-lang.scala-library:2.10.1.v20130302-092018-VFINAL-33e32179fd]
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1478)[145:org.scala-lang.scala-library:2.10.1.v20130302-092018-VFINAL-33e32179fd]
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)[145:org.scala-lang.scala-library:2.10.1.v20130302-092018-VFINAL-33e32179fd]
2016-01-14 15:14:13,117 | ERROR | lt-dispatcher-15 | OneForOneStrategy | 149 - com.typesafe.akka.slf4j - 2.3.14 |
java.lang.NullPointerException
at org.opendaylight.netconf.topology.pipeline.NetconfDeviceMasterDataBroker.submit(NetconfDeviceMasterDataBroker.java:175)[230:org.opendaylight.netconf.topology:1.0.0.SNAPSHOT]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.7.0_85]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)[:1.7.0_85]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.7.0_85]
at java.lang.reflect.Method.invoke(Method.java:606)[:1.7.0_85]
at akka.actor.TypedActor$MethodCall.apply(TypedActor.scala:145)[148:com.typesafe.akka.actor:2.3.14]
at akka.actor.TypedActor$TypedActor$$anonfun$receive$1$$anonfun$applyOrElse$2.apply(TypedActor.scala:311)[148:com.typesafe.akka.actor:2.3.14]
at akka.actor.TypedActor$TypedActor.withContext(TypedActor.scala:299)[148:com.typesafe.akka.actor:2.3.14]
at akka.actor.TypedActor$TypedActor$$anonfun$receive$1.applyOrElse(TypedActor.scala:306)[148:com.typesafe.akka.actor:2.3.14]
at akka.actor.Actor$class.aroundReceive(Actor.scala:467)[148:com.typesafe.akka.actor:2.3.14]
at akka.actor.TypedActor$TypedActor.aroundReceive(TypedActor.scala:246)[148:com.typesafe.akka.actor:2.3.14]
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)[148:com.typesafe.akka.actor:2.3.14]
at akka.actor.ActorCell.invoke(ActorCell.scala:487)[148:com.typesafe.akka.actor:2.3.14]
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238)[148:com.typesafe.akka.actor:2.3.14]
at akka.dispatch.Mailbox.run(Mailbox.scala:220)[148:com.typesafe.akka.actor:2.3.14]
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397)[148:com.typesafe.akka.actor:2.3.14]
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:262)[145:org.scala-lang.scala-library:2.10.1.v20130302-092018-VFINAL-33e32179fd]
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975)[145:org.scala-lang.scala-library:2.10.1.v20130302-092018-VFINAL-33e32179fd]
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1478)[145:org.scala-lang.scala-library:2.10.1.v20130302-092018-VFINAL-33e32179fd]
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)[145:org.scala-lang.scala-library:2.10.1.v20130302-092018-VFINAL-33e32179fd]

(this was found in the logs of the node that was used to configure the device (and which was NOT used to modify the data in the device))



 Comments   
Comment by Jozef Behran [ 14/Jan/16 ]

More test results:

  • It appears to be possible to delete the data once created, just not modify it.
  • Sometimes (very rarely) the data modification request succeeds.
Comment by Tomas Cere [ 18/Jan/16 ]

https://git.opendaylight.org/gerrit/#/c/32935/

Comment by Vratko Polak [ 06/Jun/16 ]

This was fixed on Beryllium, but the fix was still not cherry-picked to Boron:
https://jenkins.opendaylight.org/releng/view/netconf/job/netconf-csit-3node-clustering-only-boron/376/robot/report/log.html#s1-s4-t15-k3-k1-k3-k7-k1

Marking as Confirmed.

Comment by Tomas Cere [ 06/Jun/16 ]

cherry-picked: https://git.opendaylight.org/gerrit/#/c/39878/

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