future from request context should be always returned 99/20799/2
authorMartin Bobak <mbobak@cisco.com>
Wed, 20 May 2015 12:12:02 +0000 (14:12 +0200)
committerMartin Bobak <mbobak@cisco.com>
Wed, 20 May 2015 12:34:32 +0000 (14:34 +0200)
Change-Id: Ic6fd71a1372c431cbffa13242e7fba64f527fdb0
Signed-off-by: Martin Bobak <mbobak@cisco.com>
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalFlowServiceImpl.java

index 3912e027980f73e6f9fdedcb1341cb3e7b4cd1dc..72ac61922017913f61f767d9fe197f5167b96381 100644 (file)
@@ -103,15 +103,15 @@ public class SalFlowServiceImpl extends CommonService implements SalFlowService
     @Override
     public Future<RpcResult<RemoveFlowOutput>> removeFlow(final RemoveFlowInput input) {
         LOG.trace("Calling remove flow for flow with ID ={}.", input.getFlowRef());
-        return this.<RemoveFlowOutput, Void>handleServiceCall(new Function<RequestContext<RemoveFlowOutput>, ListenableFuture<RpcResult<Void>>>() {
+        return this.handleServiceCall(new Function<RequestContext<RemoveFlowOutput>, ListenableFuture<RpcResult<RemoveFlowOutput>>>() {
             @Override
-            public ListenableFuture<RpcResult<Void>> apply(final RequestContext<RemoveFlowOutput> requestContext) {
+            public ListenableFuture<RpcResult<RemoveFlowOutput>> apply(final RequestContext<RemoveFlowOutput> requestContext) {
                 final FlowModInputBuilder ofFlowModInput = FlowConvertor.toFlowModInput(input, getVersion(),
                         getDatapathId());
-                final ListenableFuture<RpcResult<Void>> future = createResultForFlowMod(requestContext, ofFlowModInput);
-                Futures.addCallback(future, new FutureCallback<RpcResult<Void>>() {
+                final ListenableFuture<RpcResult<RemoveFlowOutput>> future = createResultForFlowMod(requestContext, ofFlowModInput);
+                Futures.addCallback(future, new FutureCallback<RpcResult<RemoveFlowOutput>>() {
                     @Override
-                    public void onSuccess(final RpcResult<Void> o) {
+                    public void onSuccess(final RpcResult<RemoveFlowOutput> o) {
                         final DeviceContext deviceContext = getDeviceContext();
                         getMessageSpy().spyMessage(input.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS);
                         FlowHash flowHash = FlowHashFactory.create(input, deviceContext.getPrimaryConnectionContext().getFeatures().getVersion());
@@ -124,7 +124,7 @@ public class SalFlowServiceImpl extends CommonService implements SalFlowService
                         LOG.trace("Flow modification failed..", throwable);
                         StringBuilder errors = new StringBuilder();
                         try {
-                            RpcResult<Void> result = future.get();
+                            RpcResult<RemoveFlowOutput> result = future.get();
                             Collection<RpcError> rpcErrors = result.getErrors();
                             if (null != rpcErrors && rpcErrors.size() > 0) {
                                 for (RpcError rpcError : rpcErrors) {
@@ -199,9 +199,9 @@ public class SalFlowServiceImpl extends CommonService implements SalFlowService
 
         for (final FlowModInputBuilder flowModInputBuilder : ofFlowModInputs) {
             ListenableFuture<RpcResult<T>> partialFuture = handleServiceCall(
-                    new Function<RequestContext<T>, ListenableFuture<RpcResult<Void>>>() {
+                    new Function<RequestContext<T>, ListenableFuture<RpcResult<T>>>() {
                         @Override
-                        public ListenableFuture<RpcResult<Void>> apply(final RequestContext<T> requestContext) {
+                        public ListenableFuture<RpcResult<T>> apply(final RequestContext<T> requestContext) {
                             return createResultForFlowMod(requestContext, flowModInputBuilder);
                         }
                     });
@@ -227,30 +227,32 @@ public class SalFlowServiceImpl extends CommonService implements SalFlowService
         return finalFuture;
     }
 
-    protected <T> ListenableFuture<RpcResult<Void>> createResultForFlowMod(final RequestContext<T> requestContext, final FlowModInputBuilder flowModInputBuilder) {
+    protected <T> ListenableFuture<RpcResult<T>> createResultForFlowMod(final RequestContext<T> requestContext, final FlowModInputBuilder flowModInputBuilder) {
         final OutboundQueue outboundQueue = getDeviceContext().getPrimaryConnectionContext().getOutboundQueueProvider();
         final long xid = requestContext.getXid().getValue();
         flowModInputBuilder.setXid(xid);
         final FlowModInput flowModInput = flowModInputBuilder.build();
 
-        final SettableFuture<RpcResult<Void>> settableFuture = SettableFuture.create();
         outboundQueue.commitEntry(xid, flowModInput, new FutureCallback<OfHeader>() {
             @Override
             public void onSuccess(final OfHeader ofHeader) {
-                RequestContextUtil.closeRequstContext(requestContext);
                 getMessageSpy().spyMessage(FlowModInput.class, MessageSpy.STATISTIC_GROUP.TO_SWITCH_SUBMIT_SUCCESS);
 
-                settableFuture.set(SUCCESSFUL_RPCRESULT);
+                RpcResultBuilder<T> rpcResultBuilder = RpcResultBuilder.<T>success();
+                requestContext.setResult(rpcResultBuilder.build());
+
+                RequestContextUtil.closeRequstContext(requestContext);
             }
 
             @Override
             public void onFailure(final Throwable throwable) {
-                RpcResultBuilder<Void> rpcResultBuilder = RpcResultBuilder.<Void>failed().withError(ErrorType.APPLICATION, throwable.getMessage(), throwable);
+                RpcResultBuilder<T> rpcResultBuilder = RpcResultBuilder.<T>failed().withError(ErrorType.APPLICATION, throwable.getMessage(), throwable);
+                requestContext.setResult(rpcResultBuilder.build());
+
                 RequestContextUtil.closeRequstContext(requestContext);
-                settableFuture.set(rpcResultBuilder.build());
             }
         });
-        return settableFuture;
+        return requestContext.getFuture();
     }
 
 }