From 751776589ce049c9c1c611d06335599b92087ee6 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 22 Mar 2018 13:29:11 +0100 Subject: [PATCH] Remove DOMDataTreeService and related classes DOMDataTreeService has been deprecated and it lives in MD-SAL, remove it from the controller, taking related classes along for the ride. Change-Id: I30a4e3ac493e16e37bd812be4ac470691a0b2b5a Signed-off-by: Robert Varga --- .../api/DOMDataTreeInaccessibleException.java | 36 --- .../md/sal/dom/api/DOMDataTreeListener.java | 46 ---- .../api/DOMDataTreeListeningException.java | 27 --- .../sal/dom/api/DOMDataTreeLoopException.java | 29 --- .../md/sal/dom/api/DOMDataTreeProducer.java | 105 -------- .../api/DOMDataTreeProducerBusyException.java | 27 --- .../dom/api/DOMDataTreeProducerException.java | 26 -- .../dom/api/DOMDataTreeProducerFactory.java | 29 --- .../md/sal/dom/api/DOMDataTreeService.java | 70 ------ .../md/sal/dom/api/DOMDataTreeShard.java | 38 --- .../DOMDataTreeShardingConflictException.java | 28 --- .../dom/api/DOMDataTreeShardingService.java | 43 ---- .../AbstractDOMDataTreeServiceTestSuite.java | 72 ------ .../dom/broker/impl/ShardRegistration.java | 39 --- .../dom/broker/impl/ShardedDOMDataTree.java | 192 --------------- .../impl/ShardedDOMDataTreeProducer.java | 224 ------------------ .../impl/ShardedDOMDataWriteTransaction.java | 134 ----------- .../dom/broker/impl/ShardingTableEntry.java | 99 -------- 18 files changed, 1264 deletions(-) delete mode 100644 opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeInaccessibleException.java delete mode 100644 opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeListener.java delete mode 100644 opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeListeningException.java delete mode 100644 opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeLoopException.java delete mode 100644 opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducer.java delete mode 100644 opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducerBusyException.java delete mode 100644 opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducerException.java delete mode 100644 opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducerFactory.java delete mode 100644 opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeService.java delete mode 100644 opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeShard.java delete mode 100644 opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeShardingConflictException.java delete mode 100644 opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeShardingService.java delete mode 100644 opendaylight/md-sal/sal-dom-api/src/test/java/org/opendaylight/controller/md/sal/dom/api/AbstractDOMDataTreeServiceTestSuite.java delete mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardRegistration.java delete mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardedDOMDataTree.java delete mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardedDOMDataTreeProducer.java delete mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardedDOMDataWriteTransaction.java delete mode 100644 opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardingTableEntry.java diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeInaccessibleException.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeInaccessibleException.java deleted file mode 100644 index 8a6b8dacc7..0000000000 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeInaccessibleException.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.api; - -import com.google.common.base.Preconditions; - -/** - * Failure reported when a data tree is no longer accessible. - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.api.DOMDataTreeInaccessibleException} instead. - */ -@Deprecated -public class DOMDataTreeInaccessibleException extends DOMDataTreeListeningException { - private static final long serialVersionUID = 1L; - private final DOMDataTreeIdentifier treeIdentifier; - - public DOMDataTreeInaccessibleException(final DOMDataTreeIdentifier treeIdentifier, final String message) { - super(message); - this.treeIdentifier = Preconditions.checkNotNull(treeIdentifier); - } - - public DOMDataTreeInaccessibleException(final DOMDataTreeIdentifier treeIdentifier, final String message, - final Throwable cause) { - super(message); - this.treeIdentifier = Preconditions.checkNotNull(treeIdentifier); - } - - public final DOMDataTreeIdentifier getTreeIdentifier() { - return treeIdentifier; - } -} diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeListener.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeListener.java deleted file mode 100644 index 5a3de720c5..0000000000 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeListener.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.api; - -import java.util.Collection; -import java.util.EventListener; -import java.util.Map; -import javax.annotation.Nonnull; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; - -/** - * Interface implemented by data consumers, e.g. processes wanting to act on data - * after it has been introduced to the conceptual data tree. - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.api.DOMDataTreeListener} instead. - */ -@Deprecated -public interface DOMDataTreeListener extends EventListener { - /** - * Invoked whenever one or more registered subtrees change. The logical changes are reported, - * as well as the roll up of new state for all subscribed subtrees. - * - * @param changes The set of changes being reported. Each subscribed subtree may be present - * at most once. - * @param subtrees Per-subtree state as visible after the reported changes have been applied. - * This includes all the subtrees this listener is subscribed to, even those - * which have not changed. - */ - void onDataTreeChanged(@Nonnull Collection changes, - @Nonnull Map> subtrees); - - /** - * Invoked when a subtree listening failure occurs. This can be triggered, for example, when - * a connection to external subtree source is broken. The listener will not receive any other - * callbacks, but its registration still needs to be closed to prevent resource leak. - * - * @param causes Collection of failure causes, may not be null or empty. - */ - void onDataTreeFailed(@Nonnull Collection causes); -} diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeListeningException.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeListeningException.java deleted file mode 100644 index 435257d3a2..0000000000 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeListeningException.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.api; - -/** - * Base exception for various causes why and {@link DOMDataTreeListener} - * may be terminated by the {@link DOMDataTreeService} implementation. - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.api.DOMDataTreeListeningException} instead. - */ -@Deprecated -public class DOMDataTreeListeningException extends Exception { - private static final long serialVersionUID = 1L; - - public DOMDataTreeListeningException(final String message) { - super(message); - } - - public DOMDataTreeListeningException(final String message, final Throwable cause) { - super(message, cause); - } -} diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeLoopException.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeLoopException.java deleted file mode 100644 index 9105b94494..0000000000 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeLoopException.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.api; - -import javax.annotation.Nonnull; - -/** - * Exception thrown when a loop is detected in the way {@link DOMDataTreeListener} - * and {@link DOMDataTreeProducer} instances would be connected. - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.api.DOMDataTreeLoopException} instead. - */ -@Deprecated -public class DOMDataTreeLoopException extends Exception { - private static final long serialVersionUID = 1L; - - public DOMDataTreeLoopException(final @Nonnull String message) { - super(message); - } - - public DOMDataTreeLoopException(final @Nonnull String message, final @Nonnull Throwable cause) { - super(message, cause); - } -} diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducer.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducer.java deleted file mode 100644 index 1a91a0af9f..0000000000 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducer.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.api; - -import java.util.Collection; -import javax.annotation.Nonnull; - -/** - * A data producer context. It allows transactions to be submitted to the subtrees - * specified at instantiation time. At any given time there may be a single transaction - * open. It needs to be either submitted or cancelled before another one can be open. - * Once a transaction is submitted, it will proceed to be committed asynchronously. - * - *

- * Each instance has an upper bound on the number of transactions which can be in-flight, - * once that capacity is exceeded, an attempt to create a new transaction will block - * until some transactions complete. - * - *

- * Each {@link DOMDataTreeProducer} can be in two logical states, bound and unbound, - * which define the lifecycle rules for when is it legal to create and submit transactions - * in relationship with {@link DOMDataTreeListener} callbacks. - * - *

- * When a producer is first created, it is unbound. In this state the producer can be - * accessed by any application thread to allocate or submit transactions, as long as - * the 'single open transaction' rule is maintained. The producer and any transaction - * object MUST NOT be accessed, directly or indirectly, from a {@link DOMDataTreeListener} - * callback. - * - *

- * When a producer is referenced in a call to {@link DOMDataTreeService#registerListener(DOMDataTreeListener, - * java.util.Collection, boolean, java.util.Collection)}, - * an attempt will be made to bind the producer to the specified {@link DOMDataTreeListener}. - * Such an attempt will fail the producer is already bound, or it has an open transaction. - * Once bound, the producer can only be accessed from within the {@link DOMDataTreeListener} - * callback on that particular instance. Any transaction which is not submitted by the - * time the callback returns will be implicitly cancelled. A producer becomes unbound - * when the listener it is bound to becomes unregistered. - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.api.DOMDataTreeProducer} instead. - */ -@Deprecated -public interface DOMDataTreeProducer extends DOMDataTreeProducerFactory, AutoCloseable { - /** - * Allocate a new open transaction on this producer. Any and all transactions - * previously allocated must have been either submitted or cancelled by the - * time this method is invoked. - * - * @param isolated Indicates whether this transaction should be a barrier. A barrier - * transaction is processed separately from any preceding transactions. - * Non-barrier transactions may be merged and processed in a batch, - * such that any observers see the modifications contained in them as - * if the modifications were made in a single transaction. - * @return A new {@link DOMDataWriteTransaction} - * @throws IllegalStateException if a previous transaction was not closed. - * @throws IllegalThreadStateException if the calling thread context does not - * match the lifecycle rules enforced by the producer state (e.g. bound or unbound). - * This exception is thrown on a best effort basis and programs should not rely - * on it for correct operation. - */ - @Nonnull DOMDataWriteTransaction createTransaction(boolean isolated); - - /** - * {@inheritDoc} - * - *

- * When invoked on a {@link DOMDataTreeProducer}, this method has additional restrictions. - * There may not be an open transaction from this producer. The method needs to be - * invoked in appropriate context, e.g. bound or unbound. - * - *

- * Specified subtrees must be accessible by this producer. Accessible means they are a subset - * of the subtrees specified when the producer is instantiated. The set is further reduced as - * child producers are instantiated -- if you create a producer for /a and then a child for - * /a/b, /a/b is not accessible from the first producer. - * - *

- * Once this method returns successfully, this (parent) producer loses the ability to - * access the specified paths until the resulting (child) producer is shut down. - * - * @throws IllegalStateException if there is an open transaction - * @throws IllegalArgumentException if subtrees contains a subtree which is not - * accessible by this producer - * @throws IllegalThreadStateException if the calling thread context does not - * match the lifecycle rules enforced by the producer state (e.g. bound or unbound). - * This exception is thrown on a best effort basis and programs should not rely - * on it for correct operation. - */ - @Override - @Nonnull DOMDataTreeProducer createProducer(@Nonnull Collection subtrees); - - /** - * {@inheritDoc} - * - * @throws DOMDataTreeProducerBusyException when there is an open transaction. - */ - @Override - void close() throws DOMDataTreeProducerException; -} diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducerBusyException.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducerBusyException.java deleted file mode 100644 index f80eb1294d..0000000000 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducerBusyException.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.api; - -/** - * Exception indicating that the {@link DOMDataTreeProducer} has an open user - * transaction and cannot be closed. - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.api.DOMDataTreeProducerBusyException} instead. - */ -@Deprecated -public class DOMDataTreeProducerBusyException extends DOMDataTreeProducerException { - private static final long serialVersionUID = 1L; - - public DOMDataTreeProducerBusyException(final String message) { - super(message); - } - - public DOMDataTreeProducerBusyException(final String message, final Throwable cause) { - super(message, cause); - } -} diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducerException.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducerException.java deleted file mode 100644 index e57022da2d..0000000000 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducerException.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.api; - -/** - * Base exception for all exceptions related to {@link DOMDataTreeProducer}s. - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.api.DOMDataTreeProducerException} instead. - */ -@Deprecated -public class DOMDataTreeProducerException extends Exception { - private static final long serialVersionUID = 1L; - - public DOMDataTreeProducerException(final String message) { - super(message); - } - - public DOMDataTreeProducerException(final String message, final Throwable cause) { - super(message, cause); - } -} diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducerFactory.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducerFactory.java deleted file mode 100644 index f94b6ce52d..0000000000 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeProducerFactory.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.api; - -import java.util.Collection; -import javax.annotation.Nonnull; - -/** - * Base source of {@link DOMDataTreeProducer}s. This interface is usually not used directly, - * but rather through one of its sub-interfaces. - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.api.DOMDataTreeProducerFactory} instead. - */ -@Deprecated -public interface DOMDataTreeProducerFactory { - /** - * Create a producer, which is able to access to a set of trees. - * - * @param subtrees The collection of subtrees the resulting producer should have access to. - * @return A {@link DOMDataTreeProducer} instance. - * @throws IllegalArgumentException if subtrees is empty. - */ - @Nonnull DOMDataTreeProducer createProducer(@Nonnull Collection subtrees); -} diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeService.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeService.java deleted file mode 100644 index e39d49f117..0000000000 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeService.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.api; - -import java.util.Collection; -import javax.annotation.Nonnull; -import org.opendaylight.yangtools.concepts.ListenerRegistration; - -/** - * A {@link DOMService} providing access to the conceptual data tree. Interactions - * with the data tree are split into data producers and consumers (listeners). Each - * of them operate on a set of subtrees, which need to be declared at instantiation time. - * - *

- * Returned instances are not thread-safe and expected to be used by a single thread - * at a time. Furthermore, producers may not be accessed from consumer callbacks - * unless they were specified when the listener is registered. - * - *

- * The service maintains a loop-free topology of producers and consumers. What this means - * is that a consumer is not allowed to access a producer, which affects any of the - * subtrees it is subscribed to. This restriction is in place to ensure the system does - * not go into a feedback loop, where it is impossible to block either a producer or - * a consumer without accumulating excess work in the backlog stemming from its previous - * activity. - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.api.DOMDataTreeService} instead. - */ -@Deprecated -public interface DOMDataTreeService extends DOMDataTreeProducerFactory, DOMService { - /** - * Register a {@link DOMDataTreeListener} instance. Once registered, the listener - * will start receiving changes on the selected subtrees. If the listener cannot - * keep up with the rate of changes, and allowRxMerges is set to true, this service - * is free to merge the changes, so that a smaller number of them will be reported, - * possibly hiding some data transitions (like flaps). - * - *

- * If the listener wants to write into any producer, that producer has to be mentioned - * in the call to this method. Those producers will be bound exclusively to the - * registration, so that accessing them outside of this listener's callback will trigger - * an error. Any producers mentioned must be idle, e.g. they may not have an open - * transaction at the time this method is invoked. - * - *

- * Each listener instance can be registered at most once. Implementations of this - * interface have to guarantee that the listener's methods will not be invoked - * concurrently from multiple threads. - * - * @param listener {@link DOMDataTreeListener} that is being registered - * @param subtrees Conceptual subtree identifier of subtrees which should be monitored - * for changes. May not be null or empty. - * @param allowRxMerges True if the backend may perform ingress state compression. - * @param producers {@link DOMDataTreeProducer} instances to bind to the listener. - * @return A listener registration. Once closed, the listener will no longer be - * invoked and the producers will be unbound. - * @throws IllegalArgumentException if subtrees is empty or the listener is already bound - * @throws DOMDataTreeLoopException if the registration of the listener to the specified - * subtrees with specified producers would form a - * feedback loop - */ - @Nonnull ListenerRegistration registerListener(@Nonnull T listener, - @Nonnull Collection subtrees, boolean allowRxMerges, - @Nonnull Collection producers) throws DOMDataTreeLoopException; -} diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeShard.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeShard.java deleted file mode 100644 index 1aae65aca5..0000000000 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeShard.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.api; - -import java.util.EventListener; -import javax.annotation.Nonnull; - -/** - * A single shard of the conceptual data tree. This interface defines the basic notifications - * a shard can receive. Each shard implementation is expected to also implement some of the - * datastore-level APIs. Which interfaces are required depends on the {@link DOMDataTreeShardingService} - * implementation. - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.api.DOMDataTreeShard} instead. - */ -@Deprecated -public interface DOMDataTreeShard extends EventListener { - /** - * Invoked whenever a child is getting attached as a more specific prefix under this shard. - * - * @param prefix Child's prefix - * @param child Child shard - */ - void onChildAttached(@Nonnull DOMDataTreeIdentifier prefix, @Nonnull DOMDataTreeShard child); - - /** - * Invoked whenever a child is getting detached as a more specific prefix under this shard. - * - * @param prefix Child's prefix - * @param child Child shard - */ - void onChildDetached(@Nonnull DOMDataTreeIdentifier prefix, @Nonnull DOMDataTreeShard child); -} diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeShardingConflictException.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeShardingConflictException.java deleted file mode 100644 index 779a474b9c..0000000000 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeShardingConflictException.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.api; - -import javax.annotation.Nonnull; - -/** - * Exception thrown when an attempt to attach a conflicting shard to the global table. - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.api.DOMDataTreeShardingConflictException} instead. - */ -@Deprecated -public class DOMDataTreeShardingConflictException extends Exception { - private static final long serialVersionUID = 1L; - - public DOMDataTreeShardingConflictException(final @Nonnull String message) { - super(message); - } - - public DOMDataTreeShardingConflictException(final @Nonnull String message, final @Nonnull Throwable cause) { - super(message, cause); - } -} diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeShardingService.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeShardingService.java deleted file mode 100644 index fea4cdd61a..0000000000 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeShardingService.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.api; - -import javax.annotation.Nonnull; -import org.opendaylight.yangtools.concepts.ListenerRegistration; - -/** - * A {@link DOMService} providing access to details on how the conceptual data tree - * is distributed among providers (also known as shards). Each shard is tied to a - * single {@link DOMDataTreeIdentifier}. Based on those data tree identifiers, the - * shards are organized in a tree, where there is a logical parent/child relationship. - * - *

- * It is not allowed to attach two shards to the same data tree identifier, which means - * the mapping of each piece of information has an unambiguous home. When accessing - * the information, the shard with the longest matching data tree identifier is used, - * which is why this interface treats it is a prefix. - * - *

- * Whenever a parent/child relationship is changed, the parent is notified, so it can - * understand that a logical child has been attached. - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.api.DOMDataTreeShardingService} instead. - */ -@Deprecated -public interface DOMDataTreeShardingService extends DOMService { - /** - * Register a shard as responsible for a particular subtree prefix. - * - * @param prefix Data tree identifier, may not be null. - * @param shard Responsible shard instance - * @return A registration. To remove the shard's binding, close the registration. - * @throws DOMDataTreeShardingConflictException if the prefix is already bound - */ - @Nonnull ListenerRegistration registerDataTreeShard( - @Nonnull DOMDataTreeIdentifier prefix, @Nonnull T shard) throws DOMDataTreeShardingConflictException; -} diff --git a/opendaylight/md-sal/sal-dom-api/src/test/java/org/opendaylight/controller/md/sal/dom/api/AbstractDOMDataTreeServiceTestSuite.java b/opendaylight/md-sal/sal-dom-api/src/test/java/org/opendaylight/controller/md/sal/dom/api/AbstractDOMDataTreeServiceTestSuite.java deleted file mode 100644 index c48b4b89ba..0000000000 --- a/opendaylight/md-sal/sal-dom-api/src/test/java/org/opendaylight/controller/md/sal/dom/api/AbstractDOMDataTreeServiceTestSuite.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.api; - -import static org.junit.Assert.assertNotNull; - -import com.google.common.util.concurrent.CheckedFuture; -import java.net.URI; -import java.util.Collections; -import javax.annotation.Nonnull; -import org.junit.Test; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.QNameModule; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder; - -/** - * Abstract test suite demonstrating various access patterns on how a {@link DOMDataTreeService} - * can be used. - */ -public abstract class AbstractDOMDataTreeServiceTestSuite { - protected static final QNameModule TEST_MODULE = QNameModule.create(URI.create( - "urn:opendaylight:params:xml:ns:yang:controller:md:sal:test:store")); - - protected static final YangInstanceIdentifier UNORDERED_CONTAINER_IID = YangInstanceIdentifier.create( - new NodeIdentifier(QName.create(TEST_MODULE, "lists")), - new NodeIdentifier(QName.create(TEST_MODULE, "unordered-container"))); - protected static final DOMDataTreeIdentifier UNORDERED_CONTAINER_TREE = - new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, UNORDERED_CONTAINER_IID); - - /** - * Return a reference to the service used in this test. The instance - * needs to be reused within the same test and must be isolated between - * tests. - * - * @return {@link DOMDataTreeService} instance. - */ - protected abstract @Nonnull DOMDataTreeService service(); - - /** - * A simple unbound producer. It write some basic things into the data store based on the - * test model. - */ - @Test - public final void testBasicProducer() throws DOMDataTreeProducerException, TransactionCommitFailedException { - // Create a producer. It is an AutoCloseable resource, hence the try-with pattern - try (DOMDataTreeProducer prod = service().createProducer(Collections.singleton(UNORDERED_CONTAINER_TREE))) { - assertNotNull(prod); - - final DOMDataWriteTransaction tx = prod.createTransaction(true); - assertNotNull(tx); - - tx.put(LogicalDatastoreType.OPERATIONAL, UNORDERED_CONTAINER_IID, - ImmutableContainerNodeBuilder.create().build()); - - final CheckedFuture f = tx.submit(); - assertNotNull(f); - - f.checkedGet(); - } - } - - // TODO: simple listener -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardRegistration.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardRegistration.java deleted file mode 100644 index 99ae3086f5..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardRegistration.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.broker.impl; - -import com.google.common.base.Preconditions; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeShard; -import org.opendaylight.yangtools.concepts.AbstractListenerRegistration; - -/** - * ShardRegistration. - * - * @deprecated To be removed with {@link ShardedDOMDataTree}. - */ -@Deprecated -final class ShardRegistration extends AbstractListenerRegistration { - private final DOMDataTreeIdentifier prefix; - private final ShardedDOMDataTree tree; - - protected ShardRegistration(final ShardedDOMDataTree tree, final DOMDataTreeIdentifier prefix, final T shard) { - super(shard); - this.tree = Preconditions.checkNotNull(tree); - this.prefix = Preconditions.checkNotNull(prefix); - } - - DOMDataTreeIdentifier getPrefix() { - return prefix; - } - - @Override - protected void removeRegistration() { - tree.removeShard(this); - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardedDOMDataTree.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardedDOMDataTree.java deleted file mode 100644 index 9e7596f556..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardedDOMDataTree.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.broker.impl; - -import com.google.common.base.Preconditions; -import java.util.Collection; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.TreeMap; -import javax.annotation.concurrent.GuardedBy; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeListener; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeProducer; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeService; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeShard; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeShardingConflictException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeShardingService; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Shared DOM data tree. - * - * @deprecated Use {@link org.opendaylight.mdsal.dom.broker.ShardedDOMDataTree} instead. - */ -@Deprecated -public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTreeShardingService { - private static final Logger LOG = LoggerFactory.getLogger(ShardedDOMDataTree.class); - private final Map shardingTables = new EnumMap<>( - LogicalDatastoreType.class); - @GuardedBy("this") - private final Map idToProducer = new TreeMap<>(); - - @GuardedBy("this") - private ShardingTableEntry lookupShard(final DOMDataTreeIdentifier prefix) { - final ShardingTableEntry t = shardingTables.get(prefix.getDatastoreType()); - if (t == null) { - return null; - } - - return t.lookup(prefix.getRootIdentifier()); - } - - @GuardedBy("this") - private void storeShard(final DOMDataTreeIdentifier prefix, final ShardRegistration reg) { - ShardingTableEntry shardingTableEntry = shardingTables - .computeIfAbsent(prefix.getDatastoreType(), k -> new ShardingTableEntry()); - - shardingTableEntry.store(prefix.getRootIdentifier(), reg); - } - - void removeShard(final ShardRegistration reg) { - final DOMDataTreeIdentifier prefix = reg.getPrefix(); - final ShardRegistration parentReg; - - synchronized (this) { - final ShardingTableEntry t = shardingTables.get(prefix.getDatastoreType()); - if (t == null) { - LOG.warn("Shard registration {} points to non-existent table", reg); - return; - } - - t.remove(prefix.getRootIdentifier()); - parentReg = lookupShard(prefix).getRegistration(); - - /* - * FIXME: adjust all producers. This is tricky, as we need different locking strategy, - * simply because we risk AB/BA deadlock with a producer being split off from - * a producer. - * - */ - } - - if (parentReg != null) { - parentReg.getInstance().onChildDetached(prefix, reg.getInstance()); - } - } - - @Override - public ListenerRegistration registerDataTreeShard( - final DOMDataTreeIdentifier prefix, final T shard) throws DOMDataTreeShardingConflictException { - final ShardRegistration reg; - final ShardRegistration parentReg; - - synchronized (this) { - /* - * Lookup the parent shard (e.g. the one which currently matches the prefix), - * and if it exists, check if its registration prefix does not collide with - * this registration. - */ - final ShardingTableEntry parent = lookupShard(prefix); - parentReg = parent.getRegistration(); - if (parentReg != null && prefix.equals(parentReg.getPrefix())) { - throw new DOMDataTreeShardingConflictException( - String.format("Prefix %s is already occupied by shard %s", prefix, parentReg.getInstance())); - } - - // FIXME: wrap the shard in a proper adaptor based on implemented interface - - reg = new ShardRegistration<>(this, prefix, shard); - - storeShard(prefix, reg); - - // FIXME: update any producers/registrations - } - - // Notify the parent shard - if (parentReg != null) { - parentReg.getInstance().onChildAttached(prefix, shard); - } - - return reg; - } - - @GuardedBy("this") - private DOMDataTreeProducer findProducer(final DOMDataTreeIdentifier subtree) { - for (final Entry e : idToProducer.entrySet()) { - if (e.getKey().contains(subtree)) { - return e.getValue(); - } - } - - return null; - } - - synchronized void destroyProducer(final ShardedDOMDataTreeProducer producer) { - for (final DOMDataTreeIdentifier s : producer.getSubtrees()) { - final DOMDataTreeProducer r = idToProducer.remove(s); - if (!producer.equals(r)) { - LOG.error("Removed producer {} on subtree {} while removing {}", r, s, producer); - } - } - } - - @GuardedBy("this") - private DOMDataTreeProducer createProducer(final Map shardMap) { - // Record the producer's attachment points - final DOMDataTreeProducer ret = ShardedDOMDataTreeProducer.create(this, shardMap); - for (DOMDataTreeIdentifier s : shardMap.keySet()) { - idToProducer.put(s, ret); - } - - return ret; - } - - @Override - public synchronized DOMDataTreeProducer createProducer(final Collection subtrees) { - Preconditions.checkArgument(!subtrees.isEmpty(), "Subtrees may not be empty"); - - final Map shardMap = new HashMap<>(); - for (final DOMDataTreeIdentifier s : subtrees) { - // Attempting to create a disconnected producer -- all subtrees have to be unclaimed - final DOMDataTreeProducer producer = findProducer(s); - Preconditions.checkArgument(producer == null, "Subtree %s is attached to producer %s", s, producer); - - shardMap.put(s, lookupShard(s).getRegistration().getInstance()); - } - - return createProducer(shardMap); - } - - synchronized DOMDataTreeProducer createProducer(final ShardedDOMDataTreeProducer parent, - final Collection subtrees) { - Preconditions.checkNotNull(parent); - - final Map shardMap = new HashMap<>(); - for (final DOMDataTreeIdentifier s : subtrees) { - shardMap.put(s, lookupShard(s).getRegistration().getInstance()); - } - - return createProducer(shardMap); - } - - @Override - public synchronized ListenerRegistration - registerListener(final T listener, - final Collection subtrees, - final boolean allowRxMerges, - final Collection producers) { - // FIXME Implement this. - throw new UnsupportedOperationException("Not implemented yet."); - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardedDOMDataTreeProducer.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardedDOMDataTreeProducer.java deleted file mode 100644 index 89c9969d5e..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardedDOMDataTreeProducer.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.broker.impl; - -import com.google.common.base.Preconditions; -import com.google.common.collect.BiMap; -import com.google.common.collect.ImmutableBiMap; -import com.google.common.collect.ImmutableBiMap.Builder; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Queue; -import java.util.Set; -import javax.annotation.concurrent.GuardedBy; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeProducer; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeProducerBusyException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeProducerException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeShard; -import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; -import org.opendaylight.controller.sal.core.spi.data.DOMStore; -import org.opendaylight.controller.sal.core.spi.data.DOMStoreTransactionChain; -import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Sharded DOM Data Tree Producer. - * - * @deprecated To be removed with {@link ShardedDOMDataTree}. - */ -@Deprecated -@SuppressWarnings("checkstyle:IllegalCatch") -final class ShardedDOMDataTreeProducer implements DOMDataTreeProducer { - private static final Logger LOG = LoggerFactory.getLogger(ShardedDOMDataTreeProducer.class); - private final BiMap shardToChain; - private final Map idToShard; - private final ShardedDOMDataTree dataTree; - - @GuardedBy("this") - private Map children = Collections.emptyMap(); - @GuardedBy("this") - private DOMDataWriteTransaction openTx; - @GuardedBy("this") - private boolean closed; - - ShardedDOMDataTreeProducer(final ShardedDOMDataTree dataTree, - final Map shardMap, - final Set shards) { - this.dataTree = Preconditions.checkNotNull(dataTree); - - // Create shard -> chain map - final Builder cb = ImmutableBiMap.builder(); - final Queue es = new LinkedList<>(); - - for (final DOMDataTreeShard s : shards) { - if (s instanceof DOMStore) { - try { - final DOMStoreTransactionChain c = ((DOMStore) s).createTransactionChain(); - LOG.trace("Using DOMStore chain {} to access shard {}", c, s); - cb.put(s, c); - } catch (final Exception e) { - LOG.error("Failed to instantiate chain for shard {}", s, e); - es.add(e); - } - } else { - LOG.error("Unhandled shard instance type {}", s.getClass()); - } - } - this.shardToChain = cb.build(); - - // An error was encountered, close chains and report the error - if (shardToChain.size() != shards.size()) { - for (final DOMStoreTransactionChain c : shardToChain.values()) { - try { - c.close(); - } catch (final Exception e) { - LOG.warn("Exception raised while closing chain {}", c, e); - } - } - - final IllegalStateException e = new IllegalStateException("Failed to completely allocate contexts", - es.poll()); - while (!es.isEmpty()) { - e.addSuppressed(es.poll()); - } - - throw e; - } - - idToShard = ImmutableMap.copyOf(shardMap); - } - - @Override - public synchronized DOMDataWriteTransaction createTransaction(final boolean isolated) { - Preconditions.checkState(!closed, "Producer is already closed"); - Preconditions.checkState(openTx == null, "Transaction %s is still open", openTx); - - // Allocate backing transactions - final Map shardToTx = new HashMap<>(); - for (final Entry e : shardToChain.entrySet()) { - shardToTx.put(e.getKey(), e.getValue().newWriteOnlyTransaction()); - } - - // Create the ID->transaction map - final ImmutableMap.Builder b = ImmutableMap.builder(); - for (final Entry e : idToShard.entrySet()) { - b.put(e.getKey(), shardToTx.get(e.getValue())); - } - - final ShardedDOMDataWriteTransaction ret = new ShardedDOMDataWriteTransaction(this, b.build()); - openTx = ret; - return ret; - } - - @GuardedBy("this") - private boolean haveSubtree(final DOMDataTreeIdentifier subtree) { - for (final DOMDataTreeIdentifier i : idToShard.keySet()) { - if (i.contains(subtree)) { - return true; - } - } - - return false; - } - - @GuardedBy("this") - private DOMDataTreeProducer lookupChild(final DOMDataTreeIdentifier identifier) { - for (final Entry e : children.entrySet()) { - if (e.getKey().contains(identifier)) { - return e.getValue(); - } - } - - return null; - } - - @Override - public synchronized DOMDataTreeProducer createProducer(final Collection subtrees) { - Preconditions.checkState(!closed, "Producer is already closed"); - Preconditions.checkState(openTx == null, "Transaction %s is still open", openTx); - - for (final DOMDataTreeIdentifier s : subtrees) { - // Check if the subtree was visible at any time - if (!haveSubtree(s)) { - throw new IllegalArgumentException( - String.format("Subtree %s was never available in producer %s", s, this)); - } - - // Check if the subtree has not been delegated to a child - final DOMDataTreeProducer child = lookupChild(s); - Preconditions.checkArgument(child == null, "Subtree %s is delegated to child producer %s", s, child); - - // Check if part of the requested subtree is not delegated to a child. - for (final DOMDataTreeIdentifier c : children.keySet()) { - if (s.contains(c)) { - throw new IllegalArgumentException( - String.format("Subtree %s cannot be delegated as it is superset of already-delegated %s", s, - c)); - } - } - } - - final DOMDataTreeProducer ret = dataTree.createProducer(this, subtrees); - final ImmutableMap.Builder cb = ImmutableMap.builder(); - cb.putAll(children); - for (final DOMDataTreeIdentifier s : subtrees) { - cb.put(s, ret); - } - - children = cb.build(); - return ret; - } - - @Override - public synchronized void close() throws DOMDataTreeProducerException { - if (!closed) { - if (openTx != null) { - throw new DOMDataTreeProducerBusyException(String.format("Transaction %s is still open", openTx)); - } - - closed = true; - dataTree.destroyProducer(this); - } - } - - static DOMDataTreeProducer create(final ShardedDOMDataTree dataTree, - final Map shardMap) { - /* - * FIXME: we do not allow multiple multiple shards in a producer because we do not implement the - * synchronization primitives yet - */ - final Set shards = ImmutableSet.copyOf(shardMap.values()); - if (shards.size() > 1) { - throw new UnsupportedOperationException("Cross-shard producers are not supported yet"); - } - - return new ShardedDOMDataTreeProducer(dataTree, shardMap, shards); - } - - Set getSubtrees() { - return idToShard.keySet(); - } - - synchronized void cancelTransaction(final ShardedDOMDataWriteTransaction transaction) { - if (!openTx.equals(transaction)) { - LOG.warn("Transaction {} is not open in producer {}", transaction, this); - return; - } - - LOG.debug("Transaction {} cancelled", transaction); - openTx = null; - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardedDOMDataWriteTransaction.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardedDOMDataWriteTransaction.java deleted file mode 100644 index bc4ca811f3..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardedDOMDataWriteTransaction.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.broker.impl; - -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableSet; -import com.google.common.util.concurrent.CheckedFuture; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.atomic.AtomicLong; -import javax.annotation.concurrent.GuardedBy; -import javax.annotation.concurrent.NotThreadSafe; -import org.opendaylight.controller.md.sal.common.api.TransactionStatus; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.controller.md.sal.common.impl.service.AbstractDataTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier; -import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; -import org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort; -import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction; -import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * ShardedDOMDataWriteTransaction. - * - * @deprecated To be removed with {@link ShardedDOMDataTree}. - */ -@Deprecated -@NotThreadSafe -final class ShardedDOMDataWriteTransaction implements DOMDataWriteTransaction { - private static final Logger LOG = LoggerFactory.getLogger(ShardedDOMDataWriteTransaction.class); - private static final AtomicLong COUNTER = new AtomicLong(); - private final Map idToTransaction; - private final ShardedDOMDataTreeProducer producer; - private final String identifier; - @GuardedBy("this") - private boolean closed = false; - - ShardedDOMDataWriteTransaction(final ShardedDOMDataTreeProducer producer, - final Map idToTransaction) { - this.producer = Preconditions.checkNotNull(producer); - this.idToTransaction = Preconditions.checkNotNull(idToTransaction); - this.identifier = "SHARDED-DOM-" + COUNTER.getAndIncrement(); - } - - // FIXME: use atomic operations - @GuardedBy("this") - private DOMStoreWriteTransaction lookup(final LogicalDatastoreType store, final YangInstanceIdentifier path) { - final DOMDataTreeIdentifier id = new DOMDataTreeIdentifier(store, path); - - for (Entry e : idToTransaction.entrySet()) { - if (e.getKey().contains(id)) { - return e.getValue(); - } - } - - throw new IllegalArgumentException(String.format("Path %s is not acessible from transaction %s", id, this)); - } - - @Override - public String getIdentifier() { - return identifier; - } - - @Override - public synchronized boolean cancel() { - if (closed) { - return false; - } - - LOG.debug("Cancelling transaction {}", identifier); - for (DOMStoreWriteTransaction tx : ImmutableSet.copyOf(idToTransaction.values())) { - tx.close(); - } - - closed = true; - producer.cancelTransaction(this); - return true; - } - - @Override - public synchronized CheckedFuture submit() { - Preconditions.checkState(!closed, "Transaction %s is already closed", identifier); - - final Set txns = ImmutableSet.copyOf(idToTransaction.values()); - final List cohorts = new ArrayList<>(txns.size()); - for (DOMStoreWriteTransaction tx : txns) { - cohorts.add(tx.ready()); - } - - try { - return Futures.immediateCheckedFuture(new CommitCoordinationTask(this, cohorts, null).call()); - } catch (TransactionCommitFailedException e) { - return Futures.immediateFailedCheckedFuture(e); - } - } - - @Override - @Deprecated - public ListenableFuture> commit() { - return AbstractDataTransaction.convertToLegacyCommitFuture(submit()); - } - - @Override - public synchronized void delete(final LogicalDatastoreType store, final YangInstanceIdentifier path) { - lookup(store, path).delete(path); - } - - @Override - public synchronized void put(final LogicalDatastoreType store, final YangInstanceIdentifier path, - final NormalizedNode data) { - lookup(store, path).write(path, data); - } - - @Override - public synchronized void merge(final LogicalDatastoreType store, final YangInstanceIdentifier path, - final NormalizedNode data) { - lookup(store, path).merge(path, data); - } -} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardingTableEntry.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardingTableEntry.java deleted file mode 100644 index 70d5708966..0000000000 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/ShardingTableEntry.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.md.sal.dom.broker.impl; - -import com.google.common.base.Preconditions; -import java.util.Collections; -import java.util.Iterator; -import java.util.Map; -import org.opendaylight.yangtools.concepts.Identifiable; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Sharding Table Entry. - * - * @deprecated To be removed with {@link ShardedDOMDataTree}. - */ -@Deprecated -final class ShardingTableEntry implements Identifiable { - private static final Logger LOG = LoggerFactory.getLogger(ShardingTableEntry.class); - private final Map children = Collections.emptyMap(); - private final PathArgument identifier; - private ShardRegistration registration; - - ShardingTableEntry() { - identifier = null; - } - - ShardingTableEntry(final PathArgument identifier) { - this.identifier = Preconditions.checkNotNull(identifier); - } - - @Override - public PathArgument getIdentifier() { - return identifier; - } - - public ShardRegistration getRegistration() { - return registration; - } - - ShardingTableEntry lookup(final YangInstanceIdentifier id) { - final Iterator it = id.getPathArguments().iterator(); - ShardingTableEntry entry = this; - - while (it.hasNext()) { - final PathArgument a = it.next(); - final ShardingTableEntry child = entry.children.get(a); - if (child == null) { - LOG.debug("Lookup of {} stopped at {}", id, a); - break; - } - - entry = child; - } - - return entry; - } - - void store(final YangInstanceIdentifier id, final ShardRegistration reg) { - final Iterator it = id.getPathArguments().iterator(); - ShardingTableEntry entry = this; - - while (it.hasNext()) { - final PathArgument a = it.next(); - ShardingTableEntry child = entry.children.computeIfAbsent(a, ShardingTableEntry::new); - } - - Preconditions.checkState(entry.registration == null); - entry.registration = reg; - } - - private boolean remove(final Iterator it) { - if (it.hasNext()) { - final PathArgument arg = it.next(); - final ShardingTableEntry child = children.get(arg); - if (child != null) { - if (child.remove(it)) { - children.remove(arg); - } - } else { - LOG.warn("Cannot remove non-existent child {}", arg); - } - } - - return registration == null && children.isEmpty(); - } - - void remove(final YangInstanceIdentifier id) { - this.remove(id.getPathArguments().iterator()); - } -} -- 2.36.6