X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fcallback%2FBaseCallback.java;h=63d5f296dd313b6776ef078397aae7c4832b5cc1;hb=ae16842d541bf0b4ae97b5d8b3b10e70a3a232f4;hp=c60fbe887a9bdcc82a0f5e5a7f4745119b449f11;hpb=80087e9e52fe5e1869e5f0b813891fe6a9240162;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/callback/BaseCallback.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/callback/BaseCallback.java index c60fbe887a..63d5f296dd 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/callback/BaseCallback.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/callback/BaseCallback.java @@ -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 implements FutureCallback> { @@ -31,7 +29,7 @@ public class BaseCallback implements FutureCallback> { protected DeviceContext deviceContext; protected RequestContext requestContext; - private ListenableFuture> futureResultFromOfLib; + private final ListenableFuture> futureResultFromOfLib; public BaseCallback(final DeviceContext deviceContext, final RequestContext requestContext, final ListenableFuture> futureResultFromOfLib) { this.deviceContext = deviceContext; @@ -42,10 +40,13 @@ public class BaseCallback implements FutureCallback> { @Override public void onSuccess(final RpcResult 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 implements FutureCallback> { } LOG.trace("OF Java result for XID {} was not successful. Errors : {}", requestContext.getXid().getValue(), rpcErrors.toString()); requestContext.getFuture().set( - RpcResultBuilder.failed().withRpcErrors(fRpcResult.getErrors()).build()); + RpcResultBuilder.failed().withRpcErrors(fRpcResult.getErrors()).build()); RequestContextUtil.closeRequstContext(requestContext); } else { // else: message was successfully sent - waiting for callback on requestContext.future to get invoked