Lower the size of deviceContext synchronized block
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / callback / BaseCallback.java
index c60fbe887a9bdcc82a0f5e5a7f4745119b449f11..63d5f296dd313b6776ef078397aae7c4832b5cc1 100644 (file)
@@ -8,22 +8,20 @@
 package org.opendaylight.openflowplugin.impl.callback;
 
 
-import org.opendaylight.openflowplugin.impl.services.RequestContextUtil;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.ListenableFuture;
-import org.opendaylight.openflowplugin.api.openflow.device.RequestContext;
 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
-import com.google.common.util.concurrent.FutureCallback;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContext;
 import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy;
+import org.opendaylight.openflowplugin.impl.services.RequestContextUtil;
 import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @author joe
- *
  */
 public class BaseCallback<I, O> implements FutureCallback<RpcResult<I>> {
 
@@ -31,7 +29,7 @@ public class BaseCallback<I, O> implements FutureCallback<RpcResult<I>> {
 
     protected DeviceContext deviceContext;
     protected RequestContext<O> requestContext;
-    private ListenableFuture<RpcResult<I>> futureResultFromOfLib;
+    private final ListenableFuture<RpcResult<I>> futureResultFromOfLib;
 
     public BaseCallback(final DeviceContext deviceContext, final RequestContext<O> requestContext, final ListenableFuture<RpcResult<I>> futureResultFromOfLib) {
         this.deviceContext = deviceContext;
@@ -42,10 +40,13 @@ public class BaseCallback<I, O> implements FutureCallback<RpcResult<I>> {
     @Override
     public void onSuccess(final RpcResult<I> fRpcResult) {
         if (!fRpcResult.isSuccessful()) {
-            deviceContext.getMessageSpy().spyMessage(requestContext.getClass(), MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_FAILURE);
+            synchronized (deviceContext) {
+                deviceContext.getMessageSpy().spyMessage(requestContext.getClass(), MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_FAILURE);
+
+                // remove current request from request cache in deviceContext
+                deviceContext.unhookRequestCtx(requestContext.getXid());
+            }
 
-            // remove current request from request cache in deviceContext
-            deviceContext.unhookRequestCtx(requestContext.getXid());
             // handle requestContext failure
             StringBuilder rpcErrors = new StringBuilder();
             if (null != fRpcResult.getErrors() && fRpcResult.getErrors().size() > 0) {
@@ -55,7 +56,7 @@ public class BaseCallback<I, O> implements FutureCallback<RpcResult<I>> {
             }
             LOG.trace("OF Java result for XID {} was not successful. Errors : {}", requestContext.getXid().getValue(), rpcErrors.toString());
             requestContext.getFuture().set(
-                    RpcResultBuilder.<O>failed().withRpcErrors(fRpcResult.getErrors()).build());
+                RpcResultBuilder.<O>failed().withRpcErrors(fRpcResult.getErrors()).build());
             RequestContextUtil.closeRequstContext(requestContext);
         } else {
             // else: message was successfully sent - waiting for callback on requestContext.future to get invoked