X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FShardDataTreeTransactionChain.java;h=7917ae0177f6a9f737cd59b04d314e67b841c95e;hp=183c2192e405e2a48a52c664ef90033f5da38597;hb=987e2e706d0b343304142626bc870f3e8c909b51;hpb=2b2517144e4eb9c17d9b41e9d9ec20d0264f5e12 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardDataTreeTransactionChain.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardDataTreeTransactionChain.java index 183c2192e4..7917ae0177 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardDataTreeTransactionChain.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardDataTreeTransactionChain.java @@ -7,50 +7,60 @@ */ package org.opendaylight.controller.cluster.datastore; +import static com.google.common.base.Preconditions.checkState; +import static java.util.Objects.requireNonNull; + import com.google.common.base.MoreObjects; -import com.google.common.base.Preconditions; -import javax.annotation.concurrent.NotThreadSafe; +import java.util.Optional; +import java.util.SortedSet; +import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; +import org.opendaylight.yangtools.concepts.Identifiable; +import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * A transaction chain attached to a Shard. + * A transaction chain attached to a Shard. This class is NOT thread-safe. */ -@NotThreadSafe -final class ShardDataTreeTransactionChain extends ShardDataTreeTransactionParent { +final class ShardDataTreeTransactionChain extends ShardDataTreeTransactionParent + implements Identifiable { + private static final Logger LOG = LoggerFactory.getLogger(ShardDataTreeTransactionChain.class); + private final LocalHistoryIdentifier chainId; private final ShardDataTree dataTree; - private final String chainId; private ReadWriteShardDataTreeTransaction previousTx; private ReadWriteShardDataTreeTransaction openTransaction; private boolean closed; - ShardDataTreeTransactionChain(final String chainId, final ShardDataTree dataTree) { - this.dataTree = Preconditions.checkNotNull(dataTree); - this.chainId = Preconditions.checkNotNull(chainId); + ShardDataTreeTransactionChain(final LocalHistoryIdentifier localHistoryIdentifier, final ShardDataTree dataTree) { + this.chainId = requireNonNull(localHistoryIdentifier); + this.dataTree = requireNonNull(dataTree); } private DataTreeSnapshot getSnapshot() { - Preconditions.checkState(!closed, "TransactionChain %s has been closed", this); - Preconditions.checkState(openTransaction == null, "Transaction %s is open", openTransaction); + checkState(!closed, "TransactionChain %s has been closed", this); + checkState(openTransaction == null, "Transaction %s is open", openTransaction); if (previousTx == null) { - return dataTree.getDataTree().takeSnapshot(); - } else { - return previousTx.getSnapshot(); + LOG.debug("Opening an unchained snapshot in {}", chainId); + return dataTree.takeSnapshot(); } + + LOG.debug("Reusing a chained snapshot in {}", chainId); + return previousTx.getSnapshot(); } - ReadOnlyShardDataTreeTransaction newReadOnlyTransaction(final String txId) { + ReadOnlyShardDataTreeTransaction newReadOnlyTransaction(final TransactionIdentifier txId) { final DataTreeSnapshot snapshot = getSnapshot(); LOG.debug("Allocated read-only transaction {} snapshot {}", txId, snapshot); - return new ReadOnlyShardDataTreeTransaction(txId, snapshot); + return new ReadOnlyShardDataTreeTransaction(this, txId, snapshot); } - ReadWriteShardDataTreeTransaction newReadWriteTransaction(final String txId) { + ReadWriteShardDataTreeTransaction newReadWriteTransaction(final TransactionIdentifier txId) { final DataTreeSnapshot snapshot = getSnapshot(); LOG.debug("Allocated read-write transaction {} snapshot {}", txId, snapshot); @@ -60,24 +70,34 @@ final class ShardDataTreeTransactionChain extends ShardDataTreeTransactionParent void close() { closed = true; + LOG.debug("Closing chain {}", chainId); } @Override - protected void abortTransaction(final AbstractShardDataTreeTransaction transaction) { + void abortFromTransactionActor(final AbstractShardDataTreeTransaction transaction) { if (transaction instanceof ReadWriteShardDataTreeTransaction) { - Preconditions.checkState(openTransaction != null, "Attempted to abort transaction %s while none is outstanding", transaction); - LOG.debug("Aborted transaction {}", transaction); + checkState(openTransaction != null, "Attempted to abort transaction %s while none is outstanding", + transaction); + LOG.debug("Aborted open transaction {}", transaction); openTransaction = null; } } @Override - protected ShardDataTreeCohort finishTransaction(final ReadWriteShardDataTreeTransaction transaction) { - Preconditions.checkState(openTransaction != null, "Attempted to finish transaction %s while none is outstanding", transaction); + void abortTransaction(final AbstractShardDataTreeTransaction transaction, final Runnable callback) { + abortFromTransactionActor(transaction); + dataTree.abortTransaction(transaction, callback); + } + + @Override + ShardDataTreeCohort finishTransaction(final ReadWriteShardDataTreeTransaction transaction, + final Optional> participatingShardNames) { + checkState(openTransaction != null, "Attempted to finish transaction %s while none is outstanding", + transaction); // dataTree is finalizing ready the transaction, we just record it for the next // transaction in chain - final ShardDataTreeCohort delegate = dataTree.finishTransaction(transaction); + final ShardDataTreeCohort delegate = dataTree.finishTransaction(transaction, participatingShardNames); openTransaction = null; previousTx = transaction; LOG.debug("Committing transaction {}", transaction); @@ -90,9 +110,26 @@ final class ShardDataTreeTransactionChain extends ShardDataTreeTransactionParent return MoreObjects.toStringHelper(this).add("id", chainId).toString(); } - void clearTransaction(ReadWriteShardDataTreeTransaction transaction) { + void clearTransaction(final ReadWriteShardDataTreeTransaction transaction) { if (transaction.equals(previousTx)) { previousTx = null; } } + + @Override + public LocalHistoryIdentifier getIdentifier() { + return chainId; + } + + @Override + ShardDataTreeCohort createFailedCohort(final TransactionIdentifier txId, final DataTreeModification mod, + final Exception failure) { + return dataTree.createFailedCohort(txId, mod, failure); + } + + @Override + ShardDataTreeCohort createReadyCohort(final TransactionIdentifier txId, final DataTreeModification mod, + final Optional> participatingShardNames) { + return dataTree.createReadyCohort(txId, mod, participatingShardNames); + } }