-/**
+/*
* Copyright (c) 2015, 2017 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
*/
package org.opendaylight.openflowplugin.impl.device;
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
import io.netty.util.HashedWheelTimer;
-import io.netty.util.internal.ConcurrentSet;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nonnull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueueHandlerRegistration;
import org.opendaylight.openflowplugin.api.openflow.OFPContext;
import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceManager;
import org.opendaylight.openflowplugin.api.openflow.device.TranslatorLibrary;
+import org.opendaylight.openflowplugin.api.openflow.lifecycle.ContextChainHolder;
import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageSpy;
import org.opendaylight.openflowplugin.extension.api.ExtensionConverterProviderKeeper;
import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterProvider;
import org.opendaylight.openflowplugin.impl.connection.OutboundQueueProviderImpl;
import org.opendaylight.openflowplugin.impl.device.initialization.DeviceInitializerProvider;
import org.opendaylight.openflowplugin.impl.device.listener.OpenflowProtocolListenerFullImpl;
-import org.opendaylight.openflowplugin.impl.services.sal.SalRoleServiceImpl;
import org.opendaylight.openflowplugin.impl.util.DeviceInitializationUtil;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-/**
- *
- */
public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProviderKeeper {
private static final Logger LOG = LoggerFactory.getLogger(DeviceManagerImpl.class);
private final DeviceInitializerProvider deviceInitializerProvider;
private final ConvertorExecutor convertorExecutor;
private final ConcurrentMap<DeviceInfo, DeviceContext> deviceContexts = new ConcurrentHashMap<>();
- private final Set<KeyedInstanceIdentifier<Node, NodeKey>> notificationCreateNodeSend = new ConcurrentSet<>();
+ private final Set<KeyedInstanceIdentifier<Node, NodeKey>> notificationCreateNodeSend =
+ ConcurrentHashMap.newKeySet();
private final NotificationPublishService notificationPublishService;
private final MessageSpy messageSpy;
private final HashedWheelTimer hashedWheelTimer;
+ private final Object updatePacketInRateLimitersLock = new Object();
private TranslatorLibrary translatorLibrary;
private ExtensionConverterProvider extensionConverterProvider;
private ScheduledThreadPoolExecutor spyPool;
+ private ContextChainHolder contextChainHolder;
public DeviceManagerImpl(@Nonnull final OpenflowProviderConfig config,
@Nonnull final DataBroker dataBroker,
}
@Override
- public ListenableFuture<Void> removeDeviceFromOperationalDS(
- @Nonnull final KeyedInstanceIdentifier<Node, NodeKey> ii) {
+ public ListenableFuture<?> removeDeviceFromOperationalDS(@Nonnull final KeyedInstanceIdentifier<Node, NodeKey> ii) {
final WriteTransaction delWtx = dataBroker.newWriteOnlyTransaction();
delWtx.delete(LogicalDatastoreType.OPERATIONAL, ii);
- return delWtx.submit();
+ return delWtx.commit();
}
+ @Override
public DeviceContext createContext(@Nonnull final ConnectionContext connectionContext) {
LOG.info("ConnectionEvent: Device connected to controller, Device:{}, NodeId:{}",
config.isUseSingleLayerSerialization(),
deviceInitializerProvider,
config.isEnableFlowRemovedNotification(),
- config.isSwitchFeaturesMandatory());
+ config.isSwitchFeaturesMandatory(),
+ contextChainHolder);
- deviceContext.setSalRoleService(new SalRoleServiceImpl(deviceContext, deviceContext));
((ExtensionConverterProviderKeeper) deviceContext).setExtensionConverterProvider(extensionConverterProvider);
deviceContext.setNotificationPublishService(notificationPublishService);
}
private void updatePacketInRateLimiters() {
- synchronized (deviceContexts) {
+ synchronized (updatePacketInRateLimitersLock) {
final int deviceContextsSize = deviceContexts.size();
if (deviceContextsSize > 0) {
long freshNotificationLimit = config.getGlobalNotificationQuota() / deviceContextsSize;
public void onDeviceRemoved(final DeviceInfo deviceInfo) {
deviceContexts.remove(deviceInfo);
if (LOG.isDebugEnabled()) {
- LOG.debug("Device context removed for node {}", deviceInfo.getLOGValue());
- }
- if (deviceContexts.size() > 0) {
- this.updatePacketInRateLimiters();
+ LOG.debug("Device context removed for node {}", deviceInfo);
}
+
+ this.updatePacketInRateLimiters();
}
@Override
}
}
+ @Override
+ public void setContextChainHolder(@Nonnull ContextChainHolder contextChainHolder) {
+ this.contextChainHolder = contextChainHolder;
+ }
+
@Override
public void sendNodeAddedNotification(@Nonnull final KeyedInstanceIdentifier<Node, NodeKey> instanceIdentifier) {
if (!notificationCreateNodeSend.contains(instanceIdentifier)) {