[CONTROLLER-1313] Clustering : Commit to clustered data store fails with "Unmodified candidate should never be in the payload" Created: 13/May/15  Updated: 19/Oct/17  Resolved: 14/May/15

Status: Resolved
Project: controller
Component/s: clustering
Affects Version/s: 0.4.0
Fix Version/s: None

Type: Bug
Reporter: Reinaldo Penno Assignee: Moiz Raja
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: 3200

 Description   

Services Function Chaining tried to commit the modified node below to the datastore but there is a failure. Modified node is clearly different from original node but datastore complains with the message below.

This functionality is extremely important for SFC OVS integration.

ERROR MESSAGE:
==============

2015-05-13 01:32:23,511 | ERROR | ult-dispatcher-3 | Shard | 208 - org.opendaylight.controller.sal-akka-raft - 1.2.0.SNAPSHOT | member-1-shard-default-config An exception occurred while preCommitting transaction member-1-txn-24
java.lang.IllegalArgumentException: Unmodified candidate should never be in the payload
at org.opendaylight.controller.cluster.datastore.DataTreeCandidatePayload.writeNode(DataTreeCandidatePayload.java:81)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataTreeCandidatePayload.writeChildren(DataTreeCandidatePayload.java:60)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataTreeCandidatePayload.writeNode(DataTreeCandidatePayload.java:74)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataTreeCandidatePayload.writeChildren(DataTreeCandidatePayload.java:60)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataTreeCandidatePayload.writeNode(DataTreeCandidatePayload.java:74)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataTreeCandidatePayload.writeChildren(DataTreeCandidatePayload.java:60)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataTreeCandidatePayload.writeNode(DataTreeCandidatePayload.java:74)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataTreeCandidatePayload.writeChildren(DataTreeCandidatePayload.java:60)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataTreeCandidatePayload.writeNode(DataTreeCandidatePayload.java:74)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataTreeCandidatePayload.writeChildren(DataTreeCandidatePayload.java:60)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataTreeCandidatePayload.writeNode(DataTreeCandidatePayload.java:74)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataTreeCandidatePayload.writeChildren(DataTreeCandidatePayload.java:60)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.DataTreeCandidatePayload.create(DataTreeCandidatePayload.java:99)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.Shard.continueCommit(Shard.java:322)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.ShardCommitCoordinator.doCommit(ShardCommitCoordinator.java:339)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.ShardCommitCoordinator.doCanCommit(ShardCommitCoordinator.java:296)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.ShardCommitCoordinator.handleCanCommit(ShardCommitCoordinator.java:254)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.ShardCommitCoordinator.handleBatchedModifications(ShardCommitCoordinator.java:187)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.Shard.handleBatchedModifications(Shard.java:423)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at org.opendaylight.controller.cluster.datastore.Shard.onReceiveCommand(Shard.java:228)[215:org.opendaylight.controller.sal-distributed-datastore:1.2.0.SNAPSHOT]
at akka.persistence.UntypedPersistentActor.onReceive(Eventsourced.scala:430)[205:com.typesafe.akka.persistence.experimental:2.3.10]
at org.opendaylight.controller.cluster.common.actor.MeteringBehavior.apply(MeteringBehavior.java:97)[207:org.opendaylight.controller.sal-clustering-commons:1.2.0.SNAPSHOT]
at akka.actor.ActorCell$$anonfun$become$1.applyOrElse(ActorCell.scala:534)[200:com.typesafe.akka.actor:2.3.10]
at akka.persistence.Recovery$State$class.process(Recovery.scala:30)[205:com.typesafe.akka.persistence.experimental:2.3.10]
at akka.persistence.ProcessorImpl$$anon$2.process(Processor.scala:103)[205:com.typesafe.akka.persistence.experimental:2.3.10]
at akka.persistence.ProcessorImpl$$anon$2.aroundReceive(Processor.scala:114)[205:com.typesafe.akka.persistence.experimental:2.3.10]
at akka.persistence.Recovery$class.aroundReceive(Recovery.scala:265)[205:com.typesafe.akka.persistence.experimental:2.3.10]
at akka.persistence.UntypedPersistentActor.akka$persistence$Eventsourced$$super$aroundReceive(Eventsourced.scala:428)[205:com.typesafe.akka.persistence.experimental:2.3.10]
at akka.persistence.Eventsourced$$anon$2.doAroundReceive(Eventsourced.scala:82)[205:com.typesafe.akka.persistence.experimental:2.3.10]
at akka.persistence.Eventsourced$$anon$2.aroundReceive(Eventsourced.scala:78)[205:com.typesafe.akka.persistence.experimental:2.3.10]
at akka.persistence.Eventsourced$class.aroundReceive(Eventsourced.scala:369)[205:com.typesafe.akka.persistence.experimental:2.3.10]
at akka.persistence.UntypedPersistentActor.aroundReceive(Eventsourced.scala:428)[205:com.typesafe.akka.persistence.experimental:2.3.10]
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)[200:com.typesafe.akka.actor:2.3.10]
at akka.actor.ActorCell.invoke(ActorCell.scala:487)[200:com.typesafe.akka.actor:2.3.10]
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:254)[200:com.typesafe.akka.actor:2.3.10]
at akka.dispatch.Mailbox.run(Mailbox.scala:221)[200:com.typesafe.akka.actor:2.3.10]
at akka.dispatch.Mailbox.exec(Mailbox.scala:231)[200:com.typesafe.akka.actor:2.3.10]
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)[197:org.scala-lang.scala-library:2.10.4.v20140209-180020-VFINAL-b66a39653b]
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.pollAndExecAll(ForkJoinPool.java:1253)[197:org.scala-lang.scala-library:2.10.4.v20140209-180020-VFINAL-b66a39653b]
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1346)[197:org.scala-lang.scala-library:2.10.4.v20140209-180020-VFINAL-b66a39653b]
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)[197:org.scala-lang.scala-library:2.10.4.v20140209-180020-VFINAL-b66a39653b]

ORIGINAL NODE:

2015-05-13 01:32:23,496 | ERROR | lt-dispatcher-31 | SfcOvsNodeDataListener | 342 - org.opendaylight.sfc.ovs - 0.1.0.SNAPSHOT |
Original Node: Node{getNodeId=Uri [_value=ovsdb://192.168.1.27:37275/bridge/br-tun], getTerminationPoint=[TerminationPoint{getTpId=Uri [_value=br-tun], augmentations={interface org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation=OvsdbTerminationPointAugmentation

{getInterfaceType=class org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeInternal, getInterfaceUuid=Uuid [_value=2d6002ea-cb17-4f32-a4cf-ccee06adb6a7], getName=br-tun, getOfport=65534, getPortUuid=Uuid [_value=4e787c70-c862-4366-b922-e652294134f1]}}}], augmentations={interface org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation=OvsdbBridgeAugmentation{getBridgeName=OvsdbBridgeName [_value=br-tun], getBridgeUuid=Uuid [_value=45e8cdf8-b4d7-449a-b7e9-9fca8409bd7f], getDatapathId=DatapathId [_value=00:00:fa:cd:e8:45:9a:44], getDatapathType=class org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathTypeSystem, getManagedBy=OvsdbNodeRef [_value=KeyedInstanceIdentifier{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology, org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology[key=TopologyKey [_topologyId=Uri [_value=ovsdb:1]]], org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node[key=NodeKey [_nodeId=Uri [_value=ovsdb://192.168.1.27:37275]]]]}]}}}
2015-05-13 01:32:23,499 | ERROR | lt-dispatcher-31 | SfcOvsNodeDataListener | 342 - org.opendaylight.sfc.ovs - 0.1.0.SNAPSHOT |


MODIFIED NODE:
=============


Modified OVS Node : Node{getNodeId=Uri [_value=ovsdb://192.168.1.27:37275/bridge/br-tun], getTerminationPoint=[TerminationPoint{getTpId=Uri [_value=vx1], augmentations={interface org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation=OvsdbTerminationPointAugmentation{getInterfaceType=class org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeVxlan, getInterfaceUuid=Uuid [_value=9d3d208b-5e60-4fc9-9fc6-5a30f6e4d02f], getName=vx1, getOptions=[Options{getOption=remote_ip, getValue=10.0.0.1, augmentations={}}], getPortUuid=Uuid [_value=a1a0a2b2-7043-4b49-a5ad-c3bd44793fcc]}}}, TerminationPoint{getTpId=Uri [_value=br-tun], augmentations={interface org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation=OvsdbTerminationPointAugmentation{getInterfaceType=class org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeInternal, getInterfaceUuid=Uuid [_value=2d6002ea-cb17-4f32-a4cf-ccee06adb6a7], getName=br-tun, getOfport=65534, getPortUuid=Uuid [_value=4e787c70-c862-4366-b922-e652294134f1]}

}}], augmentations={interface org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation=OvsdbBridgeAugmentation{getBridgeName=OvsdbBridgeName [_value=br-tun], getBridgeUuid=Uuid [_value=45e8cdf8-b4d7-449a-b7e9-9fca8409bd7f], getDatapathId=DatapathId [_value=00:00:fa:cd:e8:45:9a:44], getDatapathType=class org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathTypeSystem, getManagedBy=OvsdbNodeRef [_value=KeyedInstanceIdentifier

{targetType=interface org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node, path=[org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology, org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology[key=TopologyKey [_topologyId=Uri [_value=ovsdb:1]]], org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node[key=NodeKey [_nodeId=Uri [_value=ovsdb://192.168.1.27:37275]]]]}

]}}}



 Comments   
Comment by Reinaldo Penno [ 13/May/15 ]

I should point out that we try to write the modified node with a write merge.

Comment by Reinaldo Penno [ 13/May/15 ]

I should point out that we try to commit the modified node with a write merge, not a overwrite.

Comment by Reinaldo Penno [ 13/May/15 ]

Hi Moiz,

can you take a look at this? It is really important and pressing.

thanks,

Comment by Moiz Raja [ 13/May/15 ]

Reinaldo,

Couple of questions,

1. Is this happening in code that has been merged into the SFC project?
2. If it has been, what are the steps to reproduce this problem?

I need to create a unit test to reproduce this problem.

Comment by Reinaldo Penno [ 13/May/15 ]

Steps to reproduce.

1 - Check out SFC distribution or get integration build.

2 - Start an OVS switch with the following configuration:

Manager "tcp:192.168.1.14:6640"
Bridge br-tun
Port br-tun
Interface br-tun
type:internal

The IP address is your ODL's IP address

3 - (Run SFC karaf) or (integration and load all SFC features)

4 - After OVS connects state will be created in SFC. Then use the following command
to update state on OVS:

sudo ovs-vsctl add-port br-tun vx1 – set interface type=vxlan options:local_ip=10.0.0.1

This will create a notification in the OVS->OVSDB->SFC direction. When SFC tries to commit the modified
OVS node configuration to the datastore you will see all those errors and the system will stop operating. Not only this
transaction but any further transactions will not happen

Comment by Moiz Raja [ 13/May/15 ]

This appears to be a serialization issue. When Reinaldo disabled persistence things worked fine.

This issue affects persistence and replication so still high priority.

Comment by Tom Pantelis [ 13/May/15 ]

Yes - DataTreeCandidatePayload is only created for persistence to the journal. I don't know why DataTreeCandidatePayload fails fast is there's a nested unmodified node (would have to ask Robert) but have you tried removing IllegalArgumentException and writing the UNMODIFIED byte? Maybe it's benign or is valid. The read code seems to handle UNMODIFIED.

(In reply to Moiz Raja from comment #6)
> This appears to be a serialization issue. When Reinaldo disabled persistence
> things worked fine.
>
> This issue affects persistence and replication so still high priority.

Comment by Reinaldo Penno [ 13/May/15 ]

As I told Moiz, if I use a write-put (overwrite) instead of write-merge things work better. This is just a data point that I hope helps but I can not use write overwrite.

Comment by Robert Varga [ 13/May/15 ]

So the top-level node is defensive in order to deal with empty transactions. An UNMODIFIED node nested below root is an anomaly, as such nodes should normally be pruned during DataTreeModification.ready().

Reinaldo, can you explain what 'work better' means?

Comment by Ed Warnicke [ 13/May/15 ]

Slight correction... I believe that in the reproduction instructions:

sudo ovs-vsctl add-port br-tun vx1 – set interface type=vxlan options:local_ip=10.0.0.1

should be replaced with:

sudo ovs-vsctl add-port br-tun vx1 – set interface br-tun options:type=vxlan,local_ip=10.0.0.1

Comment by Reinaldo Penno [ 13/May/15 ]

Works better as in I do not see barf messages with simple OVS transactions but I have not done serious testing because I can not use it.

Comment by Moiz Raja [ 13/May/15 ]

Robert, this is not a top level node where this exception happens so as Tom recommends maybe it's ok to just write a UNMODIFIED byte here.

Comment by Moiz Raja [ 14/May/15 ]

Reinaldo please try this fix https://git.opendaylight.org/gerrit/20310. Make sure you turn persistence on again.

Comment by Moiz Raja [ 14/May/15 ]

I think that this is happening for a specific case. This is the node which appeared as UNMODIFIED

mod

NodeModification [identifier=AugmentationIdentifier

{childNames=[(urn:cisco:params:xml:ns:yang:sfc-sff-ovs?revision=2014-07-01)ovs-options]}

, modificationType=MERGE, childModification={(urn:cisco:params:xml:ns:yang:sfc-sff-ovs?revision=2014-07-01)ovs-options=NodeModification [identifier=(urn:cisco:params:xml:ns:yang:sfc-sff-ovs?revision=2014-07-01)ovs-options, modificationType=MERGE, childModification={}]}]

newMeta.data
------------

ImmutableAugmentationNode{nodeIdentifier=AugmentationIdentifier

{childNames=[(urn:cisco:params:xml:ns:yang:sfc-sff-ovs?revision=2014-07-01)ovs-options]}

, value=[ImmutableContainerNode{nodeIdentifier=(urn:cisco:params:xml:ns:yang:sfc-sff-ovs?revision=2014-07-01)ovs-options, value=[], attributes={}}]}

oldMeta.data
------------

ImmutableAugmentationNode{nodeIdentifier=AugmentationIdentifier

{childNames=[(urn:cisco:params:xml:ns:yang:sfc-sff-ovs?revision=2014-07-01)ovs-options]}

, value=[ImmutableContainerNode{nodeIdentifier=(urn:cisco:params:xml:ns:yang:sfc-sff-ovs?revision=2014-07-01)ovs-options, value=[], attributes={}}]}

Comment by Reinaldo Penno [ 14/May/15 ]

I tried and the fix worked. I do not see clustering errors and all OVS information appears in SFC.

Comment by Tom Pantelis [ 14/May/15 ]

I tried to repro in a unit test by writing or merging the same node twice. But it succeeded.

It appears to be a specific case.

As Robert pointed out, InMemoryDataTreeModification.ready() is supposed to prune the tree of UNMODIFIED children. However, in the code path from the ex trace, I don't see where InMemoryDataTreeModification.ready() is called. There are other code paths in CDS (e.g. on recovery) where it is called. It seems like that might be the problem. However I'm unclear at this point exactly where ready() should/would be called.

Regardless, I think your patch is good - we really don't need the code to be that paranoid about UNMODIFIED children. There may be cases where something may not be pruned.

(In reply to Moiz Raja from comment #14)
> I think that this is happening for a specific case. This is the node which
> appeared as UNMODIFIED
>
> mod
> —
>
> NodeModification
> [identifier=AugmentationIdentifier

{childNames=[(urn:cisco:params:xml:ns:yang: > sfc-sff-ovs?revision=2014-07-01)ovs-options]}

, modificationType=MERGE,
> childModification={(urn:cisco:params:xml:ns:yang:sfc-sff-ovs?revision=2014-
> 07-01)ovs-options=NodeModification
> [identifier=(urn:cisco:params:xml:ns:yang:sfc-sff-ovs?revision=2014-07-
> 01)ovs-options, modificationType=MERGE, childModification={}]}]
>
> newMeta.data
> ------------
>
> ImmutableAugmentationNode{nodeIdentifier=AugmentationIdentifier

{childNames=[( > urn:cisco:params:xml:ns:yang:sfc-sff-ovs?revision=2014-07-01)ovs-options]}

,
> value=[ImmutableContainerNode{nodeIdentifier=(urn:cisco:params:xml:ns:yang:
> sfc-sff-ovs?revision=2014-07-01)ovs-options, value=[], attributes={}}]}
>
> oldMeta.data
> ------------
>
> ImmutableAugmentationNode{nodeIdentifier=AugmentationIdentifier

{childNames=[( > urn:cisco:params:xml:ns:yang:sfc-sff-ovs?revision=2014-07-01)ovs-options]}

,
> value=[ImmutableContainerNode{nodeIdentifier=(urn:cisco:params:xml:ns:yang:
> sfc-sff-ovs?revision=2014-07-01)ovs-options, value=[], attributes={}}]}

Comment by Tom Pantelis [ 14/May/15 ]

Did you try restarting the controller? Would also be good to verify the data recovers correctly from persistence.

(In reply to Reinaldo Penno from comment #15)
> I tried and the fix worked. I do not see clustering errors and all OVS
> information appears in SFC.

Comment by Reinaldo Penno [ 14/May/15 ]

Hi Tom,

just tested that as you requested. I restarted the controller and all SFC-OVS info is there.

{
"service-function-forwarders": {
"service-function-forwarder": [
{
"name": "ovsdb://192.168.1.27:39707/bridge/br-tun",
"sff-data-plane-locator": [
{
"name": "vx1",
"service-function-forwarder-ovs:ovs-options":

{ "remote-ip": "10.0.0.1", "local-ip": "10.0.0.2" }

,
"data-plane-locator":

{ "ip": "10.0.0.1", "transport": "service-locator:vxlan-gpe" }

,
"service-function-forwarder-ovs:ovs-bridge":

{ "bridge-name": "br-tun", "openflow-node-id": "openflow:275762272115268", "uuid": "45e8cdf8-b4d7-449a-b7e9-9fca8409bd7f" }

},
{
"name": "br-tun",
"service-function-forwarder-ovs:ovs-options": {},
"service-function-forwarder-ovs:ovs-bridge":

{ "bridge-name": "br-tun", "openflow-node-id": "openflow:275762272115268", "uuid": "45e8cdf8-b4d7-449a-b7e9-9fca8409bd7f" }

,
"data-plane-locator":

{ "other-name": "Other", "transport": "service-locator:other" }

}
],
"service-function-forwarder-ovs:ovs-bridge":

{ "bridge-name": "br-tun", "openflow-node-id": "openflow:275762272115268", "uuid": "45e8cdf8-b4d7-449a-b7e9-9fca8409bd7f" }

,
"service-function-forwarder-ovs:ovs-node":

{ "node-id": "/network-topology:network-topology/network-topology:topology[network-topology:topology-id='ovsdb:1']/network-topology:node[network-topology:node-id='ovsdb://192.168.1.27:39707']" }

},
{
"name": "ovsdb://192.168.1.27:39717/bridge/br-tun",
"sff-data-plane-locator": [
{
"name": "br-tun",
"service-function-forwarder-ovs:ovs-bridge":

{ "bridge-name": "br-tun", "openflow-node-id": "openflow:275762272115268", "uuid": "45e8cdf8-b4d7-449a-b7e9-9fca8409bd7f" }

,
"data-plane-locator":

{ "transport": "service-locator:other", "other-name": "Other" }

,
"service-function-forwarder-ovs:ovs-options": {}
},
{
"name": "vx1",
"service-function-forwarder-ovs:ovs-bridge":

{ "bridge-name": "br-tun", "openflow-node-id": "openflow:275762272115268", "uuid": "45e8cdf8-b4d7-449a-b7e9-9fca8409bd7f" }

,
"data-plane-locator":

{ "transport": "service-locator:vxlan-gpe", "ip": "10.0.0.2" }

,
"service-function-forwarder-ovs:ovs-options":

{ "remote-ip": "10.0.0.1", "local-ip": "10.0.0.2" }

}
],
"service-function-forwarder-ovs:ovs-bridge":

{ "bridge-name": "br-tun", "openflow-node-id": "openflow:275762272115268", "uuid": "45e8cdf8-b4d7-449a-b7e9-9fca8409bd7f" }

,
"service-function-forwarder-ovs:ovs-node":

{ "node-id": "/network-topology:network-topology/network-topology:topology[network-topology:topology-id='ovsdb:1']/network-topology:node[network-topology:node-id='ovsdb://192.168.1.27:39717']" }

}
]
}
}

Comment by Moiz Raja [ 14/May/15 ]

What do you do with ovs-options? That is the child which appears unmodified.

Comment by Tom Pantelis [ 14/May/15 ]

Cool. I'm good with merging the patch. We can continue looking into why there were UNMODIFIED children but this will unblock you.

(In reply to Reinaldo Penno from comment #18)
> Hi Tom,
>
> just tested that as you requested. I restarted the controller and all
> SFC-OVS info is there.
>
> {
> "service-function-forwarders": {
> "service-function-forwarder": [
> {
> "name": "ovsdb://192.168.1.27:39707/bridge/br-tun",
> "sff-data-plane-locator": [
> {
> "name": "vx1",
> "service-function-forwarder-ovs:ovs-options":

{ > "remote-ip": "10.0.0.1", > "local-ip": "10.0.0.2" > }

,
> "data-plane-locator":

{ > "ip": "10.0.0.1", > "transport": "service-locator:vxlan-gpe" > }

,
> "service-function-forwarder-ovs:ovs-bridge":

{ > "bridge-name": "br-tun", > "openflow-node-id": "openflow:275762272115268", > "uuid": "45e8cdf8-b4d7-449a-b7e9-9fca8409bd7f" > }

> },
> {
> "name": "br-tun",
> "service-function-forwarder-ovs:ovs-options": {},
> "service-function-forwarder-ovs:ovs-bridge":

{ > "bridge-name": "br-tun", > "openflow-node-id": "openflow:275762272115268", > "uuid": "45e8cdf8-b4d7-449a-b7e9-9fca8409bd7f" > }

,
> "data-plane-locator":

{ > "other-name": "Other", > "transport": "service-locator:other" > }

> }
> ],
> "service-function-forwarder-ovs:ovs-bridge":

{ > "bridge-name": "br-tun", > "openflow-node-id": "openflow:275762272115268", > "uuid": "45e8cdf8-b4d7-449a-b7e9-9fca8409bd7f" > }

,
> "service-function-forwarder-ovs:ovs-node":

{ > "node-id": > "/network-topology:network-topology/network-topology:topology[network- > topology:topology-id='ovsdb:1']/network-topology:node[network-topology:node- > id='ovsdb://192.168.1.27:39707']" > }

> },
> {
> "name": "ovsdb://192.168.1.27:39717/bridge/br-tun",
> "sff-data-plane-locator": [
> {
> "name": "br-tun",
> "service-function-forwarder-ovs:ovs-bridge":

{ > "bridge-name": "br-tun", > "openflow-node-id": "openflow:275762272115268", > "uuid": "45e8cdf8-b4d7-449a-b7e9-9fca8409bd7f" > }

,
> "data-plane-locator":

{ > "transport": "service-locator:other", > "other-name": "Other" > }

,
> "service-function-forwarder-ovs:ovs-options": {}
> },
> {
> "name": "vx1",
> "service-function-forwarder-ovs:ovs-bridge":

{ > "bridge-name": "br-tun", > "openflow-node-id": "openflow:275762272115268", > "uuid": "45e8cdf8-b4d7-449a-b7e9-9fca8409bd7f" > }

,
> "data-plane-locator":

{ > "transport": "service-locator:vxlan-gpe", > "ip": "10.0.0.2" > }

,
> "service-function-forwarder-ovs:ovs-options":

{ > "remote-ip": "10.0.0.1", > "local-ip": "10.0.0.2" > }

> }
> ],
> "service-function-forwarder-ovs:ovs-bridge":

{ > "bridge-name": "br-tun", > "openflow-node-id": "openflow:275762272115268", > "uuid": "45e8cdf8-b4d7-449a-b7e9-9fca8409bd7f" > }

,
> "service-function-forwarder-ovs:ovs-node":

{ > "node-id": > "/network-topology:network-topology/network-topology:topology[network- > topology:topology-id='ovsdb:1']/network-topology:node[network-topology:node- > id='ovsdb://192.168.1.27:39717']" > }

> }
> ]
> }
> }

Comment by Robert Varga [ 14/May/15 ]

DataTreeModification.ready() is called via ShardDataTree.finishTransaction(), which is invoked from CohortEntry.ready().

Comment by Tom Pantelis [ 14/May/15 ]

Yup - missed that.

(In reply to Robert Varga from comment #21)
> DataTreeModification.ready() is called via
> ShardDataTree.finishTransaction(), which is invoked from CohortEntry.ready().

Generated at Wed Feb 07 19:55:13 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.