X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fservices%2FNodeConfigServiceImpl.java;h=c7adfc5fa00d756a3d919203e8e74027238b769e;hb=e4faef067c5ed399ccdd686d26c09a0b7a6cf4b7;hp=393f127f297d8b4af3a51e0d5b3d378cfc53e598;hpb=0e1a3f876bb08ada40442543ef8ea71e726e0992;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/NodeConfigServiceImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/NodeConfigServiceImpl.java index 393f127f29..c7adfc5fa0 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/NodeConfigServiceImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/NodeConfigServiceImpl.java @@ -9,8 +9,10 @@ package org.opendaylight.openflowplugin.impl.services; import com.google.common.util.concurrent.JdkFutureAdapters; import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.SettableFuture; +import java.util.concurrent.Future; +import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; +import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; import org.opendaylight.openflowplugin.api.openflow.device.Xid; import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.NodeConfigService; import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.SetConfigInput; @@ -18,32 +20,42 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.module.config.rev141015.Set import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.SwitchConfigFlag; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInputBuilder; import org.opendaylight.yangtools.yang.common.RpcResult; -import java.util.concurrent.Future; -/** - * @author joe - */ public class NodeConfigServiceImpl extends CommonService implements NodeConfigService { + // FIXME: should be only in CommonService + private final DeviceContext deviceContext; + + public NodeConfigServiceImpl(final RequestContextStack requestContextStack, final DeviceContext deviceContext) { + super(requestContextStack, deviceContext); + this.deviceContext = deviceContext; + } @Override public Future> setConfig(final SetConfigInput input) { - final RequestContext requestContext = rpcContext.createRequestContext(); - final SettableFuture> result = rpcContext.storeOrFail(requestContext); - if (!result.isDone()) { - SetConfigInputBuilder builder = new SetConfigInputBuilder(); - SwitchConfigFlag flag = SwitchConfigFlag.valueOf(input.getFlag()); - final Xid xid = deviceContext.getNextXid(); - builder.setXid(xid.getValue()); - builder.setFlags(flag); - builder.setMissSendLen(input.getMissSearchLength()); - builder.setVersion(version); - ListenableFuture> futureResultFromOfLib = JdkFutureAdapters.listenInPoolThread(deviceContext.getPrimaryConnectionContext().getConnectionAdapter().setConfig(builder.build())); - RpcResultConvertor rpcResultConvertor = new RpcResultConvertor<>(requestContext); - rpcResultConvertor.processResultFromOfJava(futureResultFromOfLib, provideWaitTime()); - } else { - RequestContextUtil.closeRequstContext(requestContext); + final RequestContext requestContext = createRequestContext(); + if (requestContext == null) { + return failedFuture(); + } + + SetConfigInputBuilder builder = new SetConfigInputBuilder(); + SwitchConfigFlag flag = SwitchConfigFlag.valueOf(input.getFlag()); + final Long reserverXid = deviceContext.getReservedXid(); + if (null == reserverXid) { + return RequestContextUtil.closeRequestContextWithRpcError(requestContext, "Outbound queue wasn't able to reserve XID."); + } + + final Xid xid = new Xid(reserverXid); + builder.setXid(xid.getValue()); + builder.setFlags(flag); + builder.setMissSendLen(input.getMissSearchLength()); + builder.setVersion(getVersion()); + ListenableFuture> futureResultFromOfLib; + synchronized (deviceContext) { + futureResultFromOfLib = JdkFutureAdapters.listenInPoolThread(deviceContext.getPrimaryConnectionContext().getConnectionAdapter().setConfig(builder.build())); } - return result; + OFJResult2RequestCtxFuture OFJResult2RequestCtxFuture = new OFJResult2RequestCtxFuture<>(requestContext, deviceContext); + OFJResult2RequestCtxFuture.processResultFromOfJava(futureResultFromOfLib); + return requestContext.getFuture(); } }