[CONTROLLER-277] IllegalStateException [Address Not Found] is thrown for flow/group rpc operations. Created: 07/Apr/14  Updated: 25/Jul/23  Resolved: 04/Jul/14

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

Type: Bug
Reporter: Deepthi V V Assignee: Lakshman K Mukkamalla
Resolution: Won't Do Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Operating System: Linux
Platform: PC


Issue Links:
Blocks
blocks CONTROLLER-294 Milestone: Fix and demostrate Remote ... Resolved
External issue ID: 669

 Description   

Setup: 2 controllers C1 and C2 in cluster mode. C1 manages switch S1.

While trying to configure a flow from C2 to S1 [command: addMDFlow openflow:1 f1 1], the following exception is hit in C2:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
2014-04-04 16:19:25.081 IST [md-sal-binding-commit-0] ERROR o.o.c.m.s.c.i.s.TwoPhaseCommit - Transaction: BA-113 Finish Commit failed
java.lang.IllegalStateException: Address not found for route [RouteIdentifierImpl{context=null, type=(urn:opendaylight:flow:service?revision=2013-08-19)add-flow, route=/(urn:opendaylight:inventory?revision=2013-08-19)nodes/(urn:opendaylight:inventory?revision=2013-08-19)node[

{(urn:opendaylight:inventory?revision=2013-08-19)id=openflow:1}

]}]
at com.google.common.base.Preconditions.checkState(Preconditions.java:176) ~[bundlefile:na]
at org.opendaylight.controller.sal.connector.remoterpc.ClientImpl.lookupRemoteAddressForRpc(ClientImpl.java:216) ~[na:na]
at org.opendaylight.controller.sal.connector.remoterpc.ClientImpl.invokeRpc(ClientImpl.java:124) ~[na:na]
at org.opendaylight.controller.sal.connector.remoterpc.RemoteRpcProvider.invokeRpc(RemoteRpcProvider.java:105) ~[na:na]
at org.opendaylight.controller.sal.dom.broker.impl.SchemaAwareRpcBroker.invokeRpc(SchemaAwareRpcBroker.java:240) ~[na:na]
at org.opendaylight.controller.sal.dom.broker.impl.SchemaAwareRpcBroker$RoutedRpcSelector.invokeRpc(SchemaAwareRpcBroker.java:337) ~[na:na]
at org.opendaylight.controller.sal.dom.broker.impl.SchemaAwareRpcBroker.invokeRpc(SchemaAwareRpcBroker.java:167) ~[na:na]
at org.opendaylight.controller.sal.dom.broker.osgi.RpcProvisionRegistryProxy.invokeRpc(RpcProvisionRegistryProxy.java:62) ~[na:na]
at org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentConnector$DefaultInvocationStrategy.forwardToDomBroker(BindingIndependentConnector.java:817) ~[na:na]
at org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentConnector$DomToBindingRpcForwarder.invoke(BindingIndependentConnector.java:666) ~[na:na]
at com.sun.proxy.$Proxy100.addFlow(Unknown Source) ~[na:na]
at org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService$$Broker$Router.addFlow(SalFlowService$$Broker$Router.java) ~[na:na]
at org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService$$Broker$DirectProxy.addFlow(SalFlowService$$Broker$DirectProxy.java) ~[na:na]
at org.opendaylight.controller.frm.flow.FlowTransaction.add(FlowTransaction.java:121) ~[na:na]
at org.opendaylight.controller.frm.AbstractTransaction.callRpcs(AbstractTransaction.java:63) ~[na:na]
at org.opendaylight.controller.frm.AbstractTransaction.finish(AbstractTransaction.java:35) ~[na:na]
at org.opendaylight.controller.md.sal.common.impl.service.TwoPhaseCommit.call(TwoPhaseCommit.java:110) [bundlefile:na]
at org.opendaylight.controller.md.sal.common.impl.service.TwoPhaseCommit.call(TwoPhaseCommit.java:38) [bundlefile:na]
at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_51]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_51]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_51]
at java.lang.Thread.run(Thread.java:744) [na:1.7.0_51]

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Observations:
The issue is seen in 3 different scenarios:

1. this.supportedRpcs = mappingService.getRpcQNamesFor(service); in BindingIndependentConnector.java::DomToBindingRpcForwarder(Class<? extends RpcService> service, Class<? extends BaseIdentity> context) is returns an empty Set for RpcService value "SalFlowService".
a. We see entries for meter, table and stats for the specific switch in the rpcCache when we hit the Address not found problem. The only entries missing are flow and group.
b. In this scenario, if C2 manages switch S2 and C1 routes rpc from C1 to S2, following exception will be hit in C1:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2014-04-04 19:18:18.253 IST [md-sal-binding-commit-0] ERROR o.o.c.m.s.c.i.s.TwoPhaseCommit - Transaction: BA-113 Finish Commit failed
java.lang.IllegalStateException: null
at com.google.common.base.Preconditions.checkState(Preconditions.java:133) ~[bundlefile:na]
at org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentConnector$DomToBindingRpcForwarder.invoke(BindingIndependentConnector.java:694) ~[na:na]
at com.sun.proxy.$Proxy98.addFlow(Unknown Source) ~[na:na]
at org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService$$Broker$Router.addFlow(SalFlowService$$Broker$Router.java) ~[na:na]
at org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService$$Broker$DirectProxy.addFlow(SalFlowService$$Broker$DirectProxy.java) ~[na:na]
at org.opendaylight.controller.frm.flow.FlowTransaction.add(FlowTransaction.java:121) ~[na:na]
at org.opendaylight.controller.frm.AbstractTransaction.callRpcs(AbstractTransaction.java:63) ~[na:na]
at org.opendaylight.controller.frm.AbstractTransaction.finish(AbstractTransaction.java:35) ~[na:na]
at org.opendaylight.controller.md.sal.common.impl.service.TwoPhaseCommit.call(TwoPhaseCommit.java:110) [bundlefile:na]
at org.opendaylight.controller.md.sal.common.impl.service.TwoPhaseCommit.call(TwoPhaseCommit.java:38) [bundlefile:na]
at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_51]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_51]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_51]
at java.lang.Thread.run(Thread.java:744) [na:1.7.0_51
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

2. We have also observed address not found issue, when the rpc cache contains all rpc registrations from test-provider bundle. RPC cache also contains all registrations from ModelDrivenSwitch except for flow and group. In this scenario: this.supportedRpcs = mappingService.getRpcQNamesFor(service); in BindingIndependentConnector.java::DomToBindingRpcForwarder(Class<? extends RpcService> service, Class<? extends BaseIdentity> context) does not return empty set and contains correct rpcs. We have also observed that, in this scenario, if you have multiple test-provider bundles, only the first registration is available in rpc-cache.

3. In third scenario, if the switch is up and running before the controller is started. By the time the controller is fully up, none of the rpc registrations from ModelDrivenSwitch go to rpc-cache.



 Comments   
Comment by Tony Tkacik [ 04/Jul/14 ]

ZeroMQ Rpc remoting is unsupported due its experimental status and was removed from code base.

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