X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Frpc%2FRpcContextImpl.java;h=502ac137241296d82d4b68fa8ad3db3464b0aece;hb=c65275bb09353d58610a644d1dfb70299143742c;hp=dbbffd4bd51193e38881fa1b08a758260f9595de;hpb=5e3177054cb26d24d2d3d609a01e4ce22260c8a3;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/rpc/RpcContextImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/rpc/RpcContextImpl.java index dbbffd4bd5..502ac13724 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/rpc/RpcContextImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/rpc/RpcContextImpl.java @@ -7,65 +7,55 @@ */ package org.opendaylight.openflowplugin.impl.rpc; -import org.slf4j.Logger; - -import com.google.common.util.concurrent.SettableFuture; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; +import com.google.common.base.Preconditions; +import java.util.Collection; +import java.util.HashSet; +import java.util.concurrent.Semaphore; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; +import org.opendaylight.openflowplugin.api.openflow.rpc.ItemLifeCycleSource; import org.opendaylight.openflowplugin.api.openflow.rpc.RpcContext; +import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeContext; import org.opendaylight.yangtools.yang.binding.RpcService; -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; public class RpcContextImpl implements RpcContext { - - private static final Logger LOG = org.slf4j.LoggerFactory.getLogger(RpcContextImpl.class); - final ProviderContext providerContext; - - // TODO: add private Sal salBroker + private static final Logger LOG = LoggerFactory.getLogger(RpcContextImpl.class); + private final RpcProviderRegistry rpcProviderRegistry; private final DeviceContext deviceContext; - private final List rpcRegistrations = new ArrayList<>(); - private final List> synchronizedRequestsList = Collections - .>synchronizedList(new ArrayList>()); + private final MessageSpy messageSpy; + private final Semaphore tracker; - private int maxRequestsPerDevice; + // TODO: add private Sal salBroker + private final Collection> rpcRegistrations = new HashSet<>(); - public RpcContextImpl(final ProviderContext providerContext, final DeviceContext deviceContext) { - this.providerContext = providerContext; - this.deviceContext = deviceContext; + public RpcContextImpl(final MessageSpy messageSpy, final RpcProviderRegistry rpcProviderRegistry, final DeviceContext deviceContext, final int maxRequests) { + this.messageSpy = messageSpy; + this.rpcProviderRegistry = rpcProviderRegistry; + this.deviceContext = Preconditions.checkNotNull(deviceContext); + tracker = new Semaphore(maxRequests, true); } /** * @see org.opendaylight.openflowplugin.api.openflow.rpc.RpcContext#registerRpcServiceImplementation(java.lang.Class, - * org.opendaylight.yangtools.yang.binding.RpcService) + * org.opendaylight.yangtools.yang.binding.RpcService) */ @Override public void registerRpcServiceImplementation(final Class serviceClass, - final S serviceInstance) { - final RoutedRpcRegistration routedRpcReg = providerContext.addRoutedRpcImplementation(serviceClass, serviceInstance); + final S serviceInstance) { + final RoutedRpcRegistration routedRpcReg = rpcProviderRegistry.addRoutedRpcImplementation(serviceClass, serviceInstance); routedRpcReg.registerPath(NodeContext.class, deviceContext.getDeviceState().getNodeInstanceIdentifier()); rpcRegistrations.add(routedRpcReg); - } - - @Override - public SettableFuture> storeOrFail(final RequestContext requestContext) { - final SettableFuture> rpcResultFuture = requestContext.getFuture(); + LOG.debug("Registration of service {} for device {}.", serviceClass, deviceContext.getDeviceState().getNodeInstanceIdentifier()); - if (synchronizedRequestsList.size() < maxRequestsPerDevice) { - synchronizedRequestsList.add(requestContext); - } else { - final RpcResult rpcResult = RpcResultBuilder.failed() - .withError(RpcError.ErrorType.APPLICATION, "", "Device's request queue is full.").build(); - rpcResultFuture.set(rpcResult); + if (serviceInstance instanceof ItemLifeCycleSource) { + // TODO: collect registration for selective unregistering in case of tearing down only one rpc + deviceContext.getItemLifeCycleSourceRegistry().registerLifeCycleSource((ItemLifeCycleSource) serviceInstance); } - return rpcResultFuture; } /** @@ -74,40 +64,32 @@ public class RpcContextImpl implements RpcContext { * @see java.lang.AutoCloseable#close() */ @Override - public void close() throws Exception { + public void close() { for (final RoutedRpcRegistration rpcRegistration : rpcRegistrations) { rpcRegistration.unregisterPath(NodeContext.class, deviceContext.getDeviceState().getNodeInstanceIdentifier()); rpcRegistration.close(); } } - /** - * @see org.opendaylight.openflowplugin.api.openflow.rpc.RpcContext#setRequestContextQuota(int) - */ @Override - public void setRequestContextQuota(final int maxRequestsPerDevice) { - this.maxRequestsPerDevice = maxRequestsPerDevice; - } + public RequestContext createRequestContext() { + if (!tracker.tryAcquire()) { + LOG.trace("Device queue {} at capacity", this); + return null; + } - @Override - public void forgetRequestContext(final RequestContext requestContext) { - synchronizedRequestsList.remove(requestContext); - LOG.trace("Removed request context with xid {}. Context request in list {}.", - requestContext.getXid(), synchronizedRequestsList.size()); + return new AbstractRequestContext(deviceContext.getReservedXid()) { + @Override + public void close() { + tracker.release(); + LOG.trace("Removed request context with xid {}", getXid().getValue()); + messageSpy.spyMessage(RpcContextImpl.class, MessageSpy.STATISTIC_GROUP.REQUEST_STACK_FREED); + } + }; } @Override - public DeviceContext getDeviceContext() { - return deviceContext; + public void onDeviceContextClosed(DeviceContext deviceContext) { + close(); } - - @Override - public RequestContext createRequestContext() { - return new RequestContextImpl(this); - } - - public boolean isRequestContextCapacityEmpty() { - return synchronizedRequestsList.size() <= maxRequestsPerDevice; - } - }