import javax.annotation.Nonnull;
import java.math.BigInteger;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
itemLifeCycleSourceRegistry.registerLifeCycleSource(flowLifeCycleKeeper);
}
+ /**
+ * @deprecated will be deleted
+ * @param txChainManager
+ */
+ @Deprecated
void setTransactionChainManager(final TransactionChainManager txChainManager) {
this.transactionChainManager = Preconditions.checkNotNull(txChainManager);
}
primaryConnectionContext.closeConnection(false);
}
- private void tearDown() {
+ private synchronized void tearDown() {
deviceState.setValid(false);
for (final ConnectionContext connectionContext : auxiliaryConnectionContexts.values()) {
deviceFlowRegistry.close();
deviceMeterRegistry.close();
- itemLifeCycleSourceRegistry.clear();
-
-
- for (final DeviceContextClosedHandler deviceContextClosedHandler : closeHandlers) {
+ final LinkedList<DeviceContextClosedHandler> reversedCloseHandlers = new LinkedList<>(closeHandlers);
+ Collections.reverse(reversedCloseHandlers);
+ for (final DeviceContextClosedHandler deviceContextClosedHandler : reversedCloseHandlers) {
deviceContextClosedHandler.onDeviceContextClosed(this);
}
-
- LOG.info("Closing transaction chain manager without cleaning inventory operational");
- transactionChainManager.close();
+ closeHandlers.clear();
}
+ /**
+ * @deprecated will be deleted
+ */
@Override
public void onDeviceDisconnectedFromCluster() {
LOG.info("Removing device from operational and closing transaction Manager for device:{}", getDeviceState().getNodeId());
import javax.annotation.Nonnull;
import java.util.Collections;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.google.common.base.Preconditions;
+import com.google.common.base.Verify;
import io.netty.util.HashedWheelTimer;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.role.service.rev150727.OfpRole;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private NotificationService notificationService;
private NotificationPublishService notificationPublishService;
- private final ConcurrentHashMap<NodeId, DeviceContext> deviceContexts = new ConcurrentHashMap<>();
+ private final ConcurrentMap<NodeId, DeviceContext> deviceContexts = new ConcurrentHashMap<>();
private final MessageIntelligenceAgency messageIntelligenceAgency;
private final long barrierNanos = TimeUnit.MILLISECONDS.toNanos(500);
// final phase - we have to add new Device to MD-SAL DataStore
Preconditions.checkNotNull(deviceContext);
try {
-
- if (deviceContext.getDeviceState().getRole() != OfpRole.BECOMESLAVE) {
- ((DeviceContextImpl) deviceContext).initialSubmitTransaction();
- deviceContext.onPublished();
-
- } else {
- //if role = slave
- try {
- ((DeviceContextImpl) deviceContext).cancelTransaction();
- } catch (final Exception e) {
- //TODO: how can we avoid it. pingpong does not have cancel
- LOG.debug("Expected Exception: Cancel Txn exception thrown for slaves", e);
- }
-
- }
+ ((DeviceContextImpl) deviceContext).initialSubmitTransaction();
+ deviceContext.onPublished();
} catch (final Exception e) {
LOG.warn("Node {} can not be add to OPERATIONAL DataStore yet because {} ", deviceContext.getDeviceState().getNodeId(), e.getMessage());
LOG.trace("Problem with add node {} to OPERATIONAL DataStore", deviceContext.getDeviceState().getNodeId(), e);
try {
deviceContext.close();
- } catch (final Exception e1) {
- LOG.warn("Device context close FAIL - " + deviceContext.getDeviceState().getNodeId());
+ } catch (Exception e1) {
+ LOG.warn("Exception on device context close. ", e);
}
}
+
}
@Override
hashedWheelTimer, messageIntelligenceAgency, outboundQueueProvider, translatorLibrary);
deviceContext.addDeviceContextClosedHandler(this);
- deviceContexts.put(connectionContext.getNodeId(), deviceContext);
+ Verify.verify(deviceContexts.putIfAbsent(connectionContext.getNodeId(), deviceContext) == null);
+ // FIXME : txChainManager has to be propagate by Cluster MasterShip Election (remove this couple of lines)
// We would like to crete/register TxChainManager after
final DeviceTransactionChainManagerProvider.TransactionChainManagerRegistration txChainManagerReg = deviceTransactionChainManagerProvider
.provideTransactionChainManager(connectionContext);
deviceContext.close();
return;
}
+ // --- remove end ----
((ExtensionConverterProviderKeeper) deviceContext).setExtensionConverterProvider(extensionConverterProvider);
deviceContext.setNotificationService(notificationService);
deviceContext.setNotificationPublishService(notificationPublishService);
-
updatePacketInRateLimiters();
final OpenflowProtocolListenerFullImpl messageListener = new OpenflowProtocolListenerFullImpl(