From 4d1709660b7af992d4c382a2a38debb5c7d64fb9 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 17 May 2016 13:11:59 +0200 Subject: [PATCH] BUG-5280: switch transaction IDs from String to TransactionIdentifier This patch switches primary frontend messages to use TransactionIdentifier instead of plain Strings. Change-Id: Ib04a2e4882dfcc43eea5369bf162889fd7ef5472 Signed-off-by: Robert Varga --- .../AbstractShardDataTreeTransaction.java | 7 +- .../cluster/datastore/CohortEntry.java | 14 +- .../datastore/CompositeDataTreeCohort.java | 8 +- .../datastore/DataTreeCohortActor.java | 34 ++--- .../DataTreeCohortActorRegistry.java | 9 +- .../LocalThreePhaseCommitCohort.java | 5 +- .../ReadOnlyShardDataTreeTransaction.java | 3 +- .../ReadWriteShardDataTreeTransaction.java | 4 +- .../datastore/RemoteTransactionContext.java | 4 +- .../RemoteTransactionContextSupport.java | 15 +-- .../controller/cluster/datastore/Shard.java | 22 +-- .../datastore/ShardCommitCoordinator.java | 18 ++- .../cluster/datastore/ShardDataTree.java | 27 ++-- .../ShardDataTreeTransactionChain.java | 12 +- .../datastore/ShardReadTransaction.java | 3 +- .../datastore/ShardSnapshotCohort.java | 28 +++- .../cluster/datastore/ShardTransaction.java | 7 +- .../datastore/ShardTransactionFactory.java | 30 ++++- .../datastore/ShardWriteTransaction.java | 3 +- .../datastore/SimpleShardDataTreeCohort.java | 7 +- .../ThreePhaseCommitCohortProxy.java | 14 +- .../datastore/TransactionChainProxy.java | 8 +- .../cluster/datastore/TransactionProxy.java | 4 +- ...EntityOwnershipShardCommitCoordinator.java | 5 +- .../datastore/messages/AbortTransaction.java | 3 +- .../AbstractThreePhaseCommitMessage.java | 11 +- .../messages/BatchedModifications.java | 25 ++-- .../messages/CanCommitTransaction.java | 3 +- .../messages/CloseTransactionChain.java | 13 +- .../datastore/messages/CommitTransaction.java | 4 +- .../datastore/messages/CreateTransaction.java | 23 +--- .../messages/CreateTransactionReply.java | 16 ++- .../messages/ForwardedReadyTransaction.java | 7 +- .../messages/ReadyLocalTransaction.java | 8 +- .../ReadyLocalTransactionSerializer.java | 2 +- .../utils/TransactionIdentifierUtils.java | 35 ----- .../cluster/datastore/AbstractActorTest.java | 9 +- .../cluster/datastore/AbstractShardTest.java | 38 +++--- .../cluster/datastore/AbstractTest.java | 36 +++++ .../AbstractTransactionProxyTest.java | 6 +- ...butedDataStoreRemotingIntegrationTest.java | 21 +-- .../cluster/datastore/ShardDataTreeTest.java | 33 ++--- .../cluster/datastore/ShardTest.java | 127 +++++++++--------- .../ShardTransactionFailureTest.java | 6 +- .../datastore/ShardTransactionTest.java | 35 ++--- .../SimpleShardDataTreeCohortTest.java | 4 +- .../ThreePhaseCommitCohortProxyTest.java | 71 +++++----- .../datastore/TransactionProxyTest.java | 2 +- .../EntityOwnershipShardTest.java | 3 +- .../messages/AbortTransactionTest.java | 4 +- .../messages/BatchedModificationsTest.java | 17 +-- .../messages/CanCommitTransactionTest.java | 5 +- .../messages/CloseTransactionChainTest.java | 5 +- .../messages/CommitTransactionTest.java | 5 +- .../messages/CreateTransactionReplyTest.java | 5 +- .../messages/CreateTransactionTest.java | 9 +- .../ReadyLocalTransactionSerializerTest.java | 6 +- 57 files changed, 457 insertions(+), 431 deletions(-) delete mode 100644 opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/TransactionIdentifierUtils.java create mode 100644 opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/AbstractTest.java diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractShardDataTreeTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractShardDataTreeTransaction.java index e2e44b8d3d..377af4d5d7 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractShardDataTreeTransaction.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractShardDataTreeTransaction.java @@ -10,6 +10,7 @@ package org.opendaylight.controller.cluster.datastore; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import javax.annotation.concurrent.NotThreadSafe; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot; /** @@ -20,15 +21,15 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot; @NotThreadSafe abstract class AbstractShardDataTreeTransaction { private final T snapshot; - private final String id; + private final TransactionIdentifier id; private boolean closed; - protected AbstractShardDataTreeTransaction(final String id, final T snapshot) { + protected AbstractShardDataTreeTransaction(final TransactionIdentifier id, final T snapshot) { this.snapshot = Preconditions.checkNotNull(snapshot); this.id = Preconditions.checkNotNull(id); } - String getId() { + final TransactionIdentifier getId() { return id; } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/CohortEntry.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/CohortEntry.java index d13ecd2498..073f0814c0 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/CohortEntry.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/CohortEntry.java @@ -14,9 +14,9 @@ import com.google.common.base.Stopwatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.datastore.ShardCommitCoordinator.CohortDecorator; import org.opendaylight.controller.cluster.datastore.modification.Modification; -import org.opendaylight.yangtools.util.StringIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -35,7 +35,7 @@ final class CohortEntry { private final Stopwatch lastAccessTimer = Stopwatch.createStarted(); private final ReadWriteShardDataTreeTransaction transaction; - private final StringIdentifier transactionID; + private final TransactionIdentifier transactionID; private final CompositeDataTreeCohort userCohorts; private final short clientVersion; @@ -47,17 +47,17 @@ final class CohortEntry { private ActorRef replySender; private Shard shard; - CohortEntry(String transactionID, ReadWriteShardDataTreeTransaction transaction, + CohortEntry(TransactionIdentifier transactionID, ReadWriteShardDataTreeTransaction transaction, DataTreeCohortActorRegistry cohortRegistry, SchemaContext schema, short clientVersion) { this.transaction = Preconditions.checkNotNull(transaction); - this.transactionID = new StringIdentifier(transactionID); + this.transactionID = Preconditions.checkNotNull(transactionID); this.clientVersion = clientVersion; this.userCohorts = new CompositeDataTreeCohort(cohortRegistry, transactionID, schema, COMMIT_STEP_TIMEOUT); } - CohortEntry(String transactionID, ShardDataTreeCohort cohort, DataTreeCohortActorRegistry cohortRegistry, + CohortEntry(TransactionIdentifier transactionID, ShardDataTreeCohort cohort, DataTreeCohortActorRegistry cohortRegistry, SchemaContext schema, short clientVersion) { - this.transactionID = new StringIdentifier(transactionID); + this.transactionID = Preconditions.checkNotNull(transactionID); this.cohort = cohort; this.transaction = null; this.clientVersion = clientVersion; @@ -69,7 +69,7 @@ final class CohortEntry { lastAccessTimer.start(); } - StringIdentifier getTransactionID() { + TransactionIdentifier getTransactionID() { return transactionID; } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/CompositeDataTreeCohort.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/CompositeDataTreeCohort.java index 07ff936b2f..d833962277 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/CompositeDataTreeCohort.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/CompositeDataTreeCohort.java @@ -23,6 +23,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.datastore.DataTreeCohortActor.CanCommit; import org.opendaylight.controller.cluster.datastore.DataTreeCohortActor.Success; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateTip; @@ -91,15 +92,16 @@ class CompositeDataTreeCohort { private final DataTreeCohortActorRegistry registry; - private final String txId; + private final TransactionIdentifier txId; private final SchemaContext schema; private final Timeout timeout; private Iterable successfulFromPrevious; private State state = State.IDLE; - CompositeDataTreeCohort(DataTreeCohortActorRegistry registry, String txId, SchemaContext schema, Timeout timeout) { + CompositeDataTreeCohort(DataTreeCohortActorRegistry registry, TransactionIdentifier transactionID, + SchemaContext schema, Timeout timeout) { this.registry = Preconditions.checkNotNull(registry); - this.txId = Preconditions.checkNotNull(txId); + this.txId = Preconditions.checkNotNull(transactionID); this.schema = Preconditions.checkNotNull(schema); this.timeout = Preconditions.checkNotNull(timeout); } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeCohortActor.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeCohortActor.java index 485e8b5c24..10ffe1f7b7 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeCohortActor.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeCohortActor.java @@ -12,6 +12,7 @@ import akka.actor.ActorRef; import akka.actor.Props; import akka.actor.Status; import com.google.common.base.Preconditions; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.common.actor.AbstractUntypedActor; import org.opendaylight.mdsal.common.api.PostCanCommitStep; import org.opendaylight.mdsal.common.api.PostPreCommitStep; @@ -49,13 +50,13 @@ final class DataTreeCohortActor extends AbstractUntypedActor { */ static abstract class CommitProtocolCommand { - private final String txId; + private final TransactionIdentifier txId; - final String getTxId() { + final TransactionIdentifier getTxId() { return txId; } - protected CommitProtocolCommand(String txId) { + protected CommitProtocolCommand(TransactionIdentifier txId) { this.txId = Preconditions.checkNotNull(txId); } } @@ -66,7 +67,7 @@ final class DataTreeCohortActor extends AbstractUntypedActor { private final ActorRef cohort; private final SchemaContext schema; - CanCommit(String txId, DOMDataTreeCandidate candidate, SchemaContext schema, ActorRef cohort) { + CanCommit(TransactionIdentifier txId, DOMDataTreeCandidate candidate, SchemaContext schema, ActorRef cohort) { super(txId); this.cohort = Preconditions.checkNotNull(cohort); this.candidate = Preconditions.checkNotNull(candidate); @@ -90,9 +91,9 @@ final class DataTreeCohortActor extends AbstractUntypedActor { static abstract class CommitReply { private final ActorRef cohortRef; - private final String txId; + private final TransactionIdentifier txId; - protected CommitReply(ActorRef cohortRef, String txId) { + protected CommitReply(ActorRef cohortRef, TransactionIdentifier txId) { this.cohortRef = Preconditions.checkNotNull(cohortRef); this.txId = Preconditions.checkNotNull(txId); } @@ -101,15 +102,14 @@ final class DataTreeCohortActor extends AbstractUntypedActor { return cohortRef; } - final String getTxId() { + final TransactionIdentifier getTxId() { return txId; } - } static final class Success extends CommitReply { - public Success(ActorRef cohortRef, String txId) { + public Success(ActorRef cohortRef, TransactionIdentifier txId) { super(cohortRef, txId); } @@ -117,21 +117,21 @@ final class DataTreeCohortActor extends AbstractUntypedActor { static final class PreCommit extends CommitProtocolCommand { - public PreCommit(String txId) { + public PreCommit(TransactionIdentifier txId) { super(txId); } } static final class Abort extends CommitProtocolCommand { - public Abort(String txId) { + public Abort(TransactionIdentifier txId) { super(txId); } } static final class Commit extends CommitProtocolCommand { - public Commit(String txId) { + public Commit(TransactionIdentifier txId) { super(txId); } } @@ -187,9 +187,9 @@ final class DataTreeCohortActor extends AbstractUntypedActor { extends CohortBehaviour { private final S step; - private final String txId; + private final TransactionIdentifier txId; - CohortStateWithStep(String txId, S step) { + CohortStateWithStep(TransactionIdentifier txId, S step) { this.txId = Preconditions.checkNotNull(txId); this.step = Preconditions.checkNotNull(step); } @@ -198,7 +198,7 @@ final class DataTreeCohortActor extends AbstractUntypedActor { return step; } - final String getTxId() { + final TransactionIdentifier getTxId() { return txId; } @@ -219,7 +219,7 @@ final class DataTreeCohortActor extends AbstractUntypedActor { private class PostCanCommit extends CohortStateWithStep { - PostCanCommit(String txId, PostCanCommitStep nextStep) { + PostCanCommit(TransactionIdentifier txId, PostCanCommitStep nextStep) { super(txId, nextStep); } @@ -245,7 +245,7 @@ final class DataTreeCohortActor extends AbstractUntypedActor { private class PostPreCommit extends CohortStateWithStep { - PostPreCommit(String txId, PostPreCommitStep step) { + PostPreCommit(TransactionIdentifier txId, PostPreCommitStep step) { super(txId, step); } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeCohortActorRegistry.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeCohortActorRegistry.java index ec7e2ee61b..28b3c707a9 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeCohortActorRegistry.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeCohortActorRegistry.java @@ -18,6 +18,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.concurrent.NotThreadSafe; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.datastore.DataTreeCohortActor.CanCommit; import org.opendaylight.controller.md.sal.dom.spi.AbstractRegistrationTree; import org.opendaylight.controller.md.sal.dom.spi.RegistrationTreeNode; @@ -75,8 +76,8 @@ class DataTreeCohortActorRegistry extends AbstractRegistrationTree { cohort.tell(PoisonPill.getInstance(), cohort); } - Collection createCanCommitMessages(String txId, DataTreeCandidate candidate, - SchemaContext schema) { + Collection createCanCommitMessages(TransactionIdentifier txId, + DataTreeCandidate candidate, SchemaContext schema) { try (RegistrationTreeSnapshot cohorts = takeSnapshot()) { return new CanCommitMessageBuilder(txId, candidate, schema).perform(cohorts.getRootNode()); } @@ -129,13 +130,13 @@ class DataTreeCohortActorRegistry extends AbstractRegistrationTree { private static class CanCommitMessageBuilder { - private final String txId; + private final TransactionIdentifier txId; private final DataTreeCandidate candidate; private final SchemaContext schema; private final Collection messages = new ArrayList<>(); - CanCommitMessageBuilder(String txId, DataTreeCandidate candidate, SchemaContext schema) { + CanCommitMessageBuilder(TransactionIdentifier txId, DataTreeCandidate candidate, SchemaContext schema) { this.txId = Preconditions.checkNotNull(txId); this.candidate = Preconditions.checkNotNull(candidate); this.schema = schema; diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/LocalThreePhaseCommitCohort.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/LocalThreePhaseCommitCohort.java index d90b82be4b..1419a52035 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/LocalThreePhaseCommitCohort.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/LocalThreePhaseCommitCohort.java @@ -16,7 +16,6 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier import org.opendaylight.controller.cluster.datastore.messages.CommitTransactionReply; import org.opendaylight.controller.cluster.datastore.messages.ReadyLocalTransaction; import org.opendaylight.controller.cluster.datastore.utils.ActorContext; -import org.opendaylight.controller.cluster.datastore.utils.TransactionIdentifierUtils; import org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort; import org.opendaylight.controller.sal.core.spi.data.SnapshotBackedWriteTransaction; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification; @@ -63,8 +62,8 @@ class LocalThreePhaseCommitCohort implements DOMStoreThreePhaseCommitCohort { return Futures.failed(operationError); } - final ReadyLocalTransaction message = new ReadyLocalTransaction( - TransactionIdentifierUtils.actorNameFor(transaction.getIdentifier()), modification, immediate); + final ReadyLocalTransaction message = new ReadyLocalTransaction(transaction.getIdentifier(), + modification, immediate); return actorContext.executeOperationAsync(leader, message, actorContext.getTransactionCommitOperationTimeout()); } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ReadOnlyShardDataTreeTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ReadOnlyShardDataTreeTransaction.java index 59265682ad..040a652a0f 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ReadOnlyShardDataTreeTransaction.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ReadOnlyShardDataTreeTransaction.java @@ -7,10 +7,11 @@ */ package org.opendaylight.controller.cluster.datastore; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot; final class ReadOnlyShardDataTreeTransaction extends AbstractShardDataTreeTransaction { - ReadOnlyShardDataTreeTransaction(final String id, final DataTreeSnapshot snapshot) { + ReadOnlyShardDataTreeTransaction(final TransactionIdentifier id, final DataTreeSnapshot snapshot) { super(id, snapshot); } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ReadWriteShardDataTreeTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ReadWriteShardDataTreeTransaction.java index 897271a561..771de8cd12 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ReadWriteShardDataTreeTransaction.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ReadWriteShardDataTreeTransaction.java @@ -8,12 +8,14 @@ package org.opendaylight.controller.cluster.datastore; import com.google.common.base.Preconditions; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification; public final class ReadWriteShardDataTreeTransaction extends AbstractShardDataTreeTransaction { private final ShardDataTreeTransactionParent parent; - protected ReadWriteShardDataTreeTransaction(final ShardDataTreeTransactionParent parent, final String id, final DataTreeModification modification) { + protected ReadWriteShardDataTreeTransaction(final ShardDataTreeTransactionParent parent, + final TransactionIdentifier id, final DataTreeModification modification) { super(id, modification); this.parent = Preconditions.checkNotNull(parent); } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/RemoteTransactionContext.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/RemoteTransactionContext.java index 75c5de82c3..603fb20a6b 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/RemoteTransactionContext.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/RemoteTransactionContext.java @@ -21,7 +21,6 @@ import org.opendaylight.controller.cluster.datastore.messages.SerializableMessag import org.opendaylight.controller.cluster.datastore.modification.AbstractModification; import org.opendaylight.controller.cluster.datastore.modification.Modification; import org.opendaylight.controller.cluster.datastore.utils.ActorContext; -import org.opendaylight.controller.cluster.datastore.utils.TransactionIdentifierUtils; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -106,8 +105,7 @@ public class RemoteTransactionContext extends AbstractTransactionContext { } private BatchedModifications newBatchedModifications() { - return new BatchedModifications(TransactionIdentifierUtils.actorNameFor(getIdentifier()), - getTransactionVersion(), RemoteTransactionContextSupport.compatTransactionChainId(getIdentifier())); + return new BatchedModifications(getIdentifier(), getTransactionVersion()); } private void batchModification(Modification modification) { diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/RemoteTransactionContextSupport.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/RemoteTransactionContextSupport.java index 4f41d8902e..2924eaab57 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/RemoteTransactionContextSupport.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/RemoteTransactionContextSupport.java @@ -21,7 +21,6 @@ import org.opendaylight.controller.cluster.datastore.messages.CreateTransaction; import org.opendaylight.controller.cluster.datastore.messages.CreateTransactionReply; import org.opendaylight.controller.cluster.datastore.messages.PrimaryShardInfo; import org.opendaylight.controller.cluster.datastore.utils.ActorContext; -import org.opendaylight.controller.cluster.datastore.utils.TransactionIdentifierUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import scala.concurrent.Future; @@ -118,16 +117,7 @@ final class RemoteTransactionContextSupport { } /** - * @deprecated Temporary utility for extracting transaction chain ID from a {@link TransactionIdentifier} - */ - @Deprecated - static String compatTransactionChainId(final TransactionIdentifier txId) { - final long historyId = txId.getHistoryId().getHistoryId(); - return historyId == 0 ? "" : Long.toUnsignedString(historyId); - } - - /** - * Performs a CreateTransaction try async. + Performs a CreateTransaction try async. */ private void tryCreateTransaction() { if(LOG.isDebugEnabled()) { @@ -135,8 +125,7 @@ final class RemoteTransactionContextSupport { primaryShardInfo.getPrimaryShardActor()); } - Object serializedCreateMessage = new CreateTransaction(TransactionIdentifierUtils.actorNameFor(getIdentifier()), - getTransactionType().ordinal(), compatTransactionChainId(getIdentifier()), + Object serializedCreateMessage = new CreateTransaction(getIdentifier(), getTransactionType().ordinal(), primaryShardInfo.getPrimaryShardVersion()).toSerializable(); Future createTxFuture = getActorContext().executeOperationAsync( diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java index e9f543f0f2..02a14022c4 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import javax.annotation.Nonnull; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.common.actor.CommonConfig; import org.opendaylight.controller.cluster.common.actor.MessageTracker; import org.opendaylight.controller.cluster.common.actor.MessageTracker.Error; @@ -62,7 +63,6 @@ import org.opendaylight.controller.cluster.raft.base.messages.FollowerInitialSyn import org.opendaylight.controller.cluster.raft.messages.AppendEntriesReply; import org.opendaylight.controller.cluster.raft.messages.ServerRemoved; import org.opendaylight.yangtools.concepts.Identifier; -import org.opendaylight.yangtools.util.StringIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException; import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType; @@ -170,7 +170,8 @@ public class Shard extends RaftActor { new Dispatchers(context().system().dispatchers()).getDispatcherPath( Dispatchers.DispatcherType.Transaction), self(), getContext(), shardMBean); - snapshotCohort = new ShardSnapshotCohort(transactionActorFactory, store, LOG, this.name); + snapshotCohort = new ShardSnapshotCohort(builder.getId().getMemberName(), transactionActorFactory, store, + LOG, this.name); messageRetrySupport = new ShardTransactionMessageRetrySupport(this); } @@ -334,7 +335,7 @@ public class Shard extends RaftActor { private void handleCommitTransaction(final CommitTransaction commit) { if (isLeader()) { - if(!commitCoordinator.handleCommit(new StringIdentifier(commit.getTransactionID()), getSender(), this)) { + if(!commitCoordinator.handleCommit(commit.getTransactionID(), getSender(), this)) { shardMBean.incrementFailedTransactionsCount(); } } else { @@ -433,7 +434,7 @@ public class Shard extends RaftActor { LOG.debug("{}: Can committing transaction {}", persistenceId(), canCommit.getTransactionID()); if (isLeader()) { - commitCoordinator.handleCanCommit(new StringIdentifier(canCommit.getTransactionID()), getSender(), this); + commitCoordinator.handleCanCommit(canCommit.getTransactionID(), getSender(), this); } else { ActorSelection leader = getLeader(); if (leader == null) { @@ -563,8 +564,8 @@ public class Shard extends RaftActor { doAbortTransaction(abort.getTransactionID(), getSender()); } - void doAbortTransaction(final String transactionID, final ActorRef sender) { - commitCoordinator.handleAbort(new StringIdentifier(transactionID), sender, this); + void doAbortTransaction(final TransactionIdentifier transactionID, final ActorRef sender) { + commitCoordinator.handleAbort(transactionID, sender, this); } private void handleCreateTransaction(final Object message) { @@ -590,7 +591,7 @@ public class Shard extends RaftActor { } ActorRef transactionActor = createTransaction(createTransaction.getTransactionType(), - createTransaction.getTransactionId(), createTransaction.getTransactionChainId()); + createTransaction.getTransactionId()); getSender().tell(new CreateTransactionReply(Serialization.serializedActorPath(transactionActor), createTransaction.getTransactionId(), createTransaction.getVersion()).toSerializable(), getSelf()); @@ -599,15 +600,14 @@ public class Shard extends RaftActor { } } - private ActorRef createTransaction(int transactionType, String transactionId, String transactionChainId) { + private ActorRef createTransaction(int transactionType, TransactionIdentifier transactionId) { LOG.debug("{}: Creating transaction : {} ", persistenceId(), transactionId); return transactionActorFactory.newShardTransaction(TransactionType.fromInt(transactionType), - transactionId, transactionChainId); + transactionId); } private void commitWithNewTransaction(final BatchedModifications modification) { - ReadWriteShardDataTreeTransaction tx = store.newReadWriteTransaction(modification.getTransactionID(), - modification.getTransactionChainID()); + ReadWriteShardDataTreeTransaction tx = store.newReadWriteTransaction(modification.getTransactionID()); modification.apply(tx.getSnapshot()); try { snapshotCohort.syncCommitTransaction(tx); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardCommitCoordinator.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardCommitCoordinator.java index 3451934e25..822586e963 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardCommitCoordinator.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardCommitCoordinator.java @@ -35,7 +35,6 @@ import org.opendaylight.controller.cluster.datastore.messages.ReadyTransactionRe import org.opendaylight.controller.cluster.datastore.utils.AbstractBatchedModificationsCursor; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.yangtools.concepts.Identifier; -import org.opendaylight.yangtools.util.StringIdentifier; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.slf4j.Logger; @@ -174,10 +173,10 @@ final class ShardCommitCoordinator { * @param shard the transaction's shard actor */ void handleBatchedModifications(BatchedModifications batched, ActorRef sender, Shard shard, SchemaContext schema) { - CohortEntry cohortEntry = cohortCache.get(new StringIdentifier(batched.getTransactionID())); + CohortEntry cohortEntry = cohortCache.get(batched.getTransactionID()); if(cohortEntry == null) { cohortEntry = new CohortEntry(batched.getTransactionID(), - dataTree.newReadWriteTransaction(batched.getTransactionID(), batched.getTransactionChainID()), + dataTree.newReadWriteTransaction(batched.getTransactionID()), cohortRegistry, schema, batched.getVersion()); cohortCache.put(cohortEntry.getTransactionID(), cohortEntry); } @@ -260,7 +259,7 @@ final class ShardCommitCoordinator { Collection createForwardedBatchedModifications(final BatchedModifications from, final int maxModificationsPerBatch) { - CohortEntry cohortEntry = getAndRemoveCohortEntry(new StringIdentifier(from.getTransactionID())); + CohortEntry cohortEntry = getAndRemoveCohortEntry(from.getTransactionID()); if(cohortEntry == null || cohortEntry.getTransaction() == null) { return Collections.singletonList(from); } @@ -273,8 +272,7 @@ final class ShardCommitCoordinator { protected BatchedModifications getModifications() { if(newModifications.isEmpty() || newModifications.getLast().getModifications().size() >= maxModificationsPerBatch) { - newModifications.add(new BatchedModifications(from.getTransactionID(), - from.getVersion(), from.getTransactionChainID())); + newModifications.add(new BatchedModifications(from.getTransactionID(), from.getVersion())); } return newModifications.getLast(); @@ -539,8 +537,8 @@ final class ShardCommitCoordinator { protected BatchedModifications getModifications() { if(newModifications.isEmpty() || newModifications.getLast().getModifications().size() >= maxModificationsPerBatch) { - newModifications.add(new BatchedModifications(cohortEntry.getTransactionID().getString(), - cohortEntry.getClientVersion(), "")); + newModifications.add(new BatchedModifications(cohortEntry.getTransactionID(), + cohortEntry.getClientVersion())); } return newModifications.getLast(); @@ -555,12 +553,12 @@ final class ShardCommitCoordinator { messages.addAll(newModifications); if(!cohortEntry.isDoImmediateCommit() && cohortEntry.getState() == CohortEntry.State.CAN_COMMITTED) { - messages.add(new CanCommitTransaction(cohortEntry.getTransactionID().getString(), + messages.add(new CanCommitTransaction(cohortEntry.getTransactionID(), cohortEntry.getClientVersion())); } if(!cohortEntry.isDoImmediateCommit() && cohortEntry.getState() == CohortEntry.State.PRE_COMMITTED) { - messages.add(new CommitTransaction(cohortEntry.getTransactionID().getString(), + messages.add(new CommitTransaction(cohortEntry.getTransactionID(), cohortEntry.getClientVersion())); } } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardDataTree.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardDataTree.java index 17c3cd82c3..3e3d4cc20c 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardDataTree.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardDataTree.java @@ -9,12 +9,13 @@ package org.opendaylight.controller.cluster.datastore; import com.google.common.base.Optional; import com.google.common.base.Preconditions; -import com.google.common.base.Strings; import java.util.AbstractMap.SimpleEntry; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import javax.annotation.concurrent.NotThreadSafe; +import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener; import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener; @@ -47,7 +48,7 @@ import org.slf4j.LoggerFactory; public class ShardDataTree extends ShardDataTreeTransactionParent { private static final Logger LOG = LoggerFactory.getLogger(ShardDataTree.class); - private final Map transactionChains = new HashMap<>(); + private final Map transactionChains = new HashMap<>(); private final ShardDataTreeChangeListenerPublisher treeChangeListenerPublisher; private final ShardDataChangeListenerPublisher dataChangeListenerPublisher; private final TipProducingDataTree dataTree; @@ -83,31 +84,31 @@ public class ShardDataTree extends ShardDataTreeTransactionParent { dataTree.setSchemaContext(schemaContext); } - private ShardDataTreeTransactionChain ensureTransactionChain(final String chainId) { - ShardDataTreeTransactionChain chain = transactionChains.get(chainId); + private ShardDataTreeTransactionChain ensureTransactionChain(final LocalHistoryIdentifier localHistoryIdentifier) { + ShardDataTreeTransactionChain chain = transactionChains.get(localHistoryIdentifier); if (chain == null) { - chain = new ShardDataTreeTransactionChain(chainId, this); - transactionChains.put(chainId, chain); + chain = new ShardDataTreeTransactionChain(localHistoryIdentifier, this); + transactionChains.put(localHistoryIdentifier, chain); } return chain; } - ReadOnlyShardDataTreeTransaction newReadOnlyTransaction(final String txId, final String chainId) { - if (Strings.isNullOrEmpty(chainId)) { + ReadOnlyShardDataTreeTransaction newReadOnlyTransaction(final TransactionIdentifier txId) { + if (txId.getHistoryId().getHistoryId() == 0) { return new ReadOnlyShardDataTreeTransaction(txId, dataTree.takeSnapshot()); } - return ensureTransactionChain(chainId).newReadOnlyTransaction(txId); + return ensureTransactionChain(txId.getHistoryId()).newReadOnlyTransaction(txId); } - ReadWriteShardDataTreeTransaction newReadWriteTransaction(final String txId, final String chainId) { - if (Strings.isNullOrEmpty(chainId)) { + ReadWriteShardDataTreeTransaction newReadWriteTransaction(final TransactionIdentifier txId) { + if (txId.getHistoryId().getHistoryId() == 0) { return new ReadWriteShardDataTreeTransaction(ShardDataTree.this, txId, dataTree.takeSnapshot() .newModification()); } - return ensureTransactionChain(chainId).newReadWriteTransaction(txId); + return ensureTransactionChain(txId.getHistoryId()).newReadWriteTransaction(txId); } public void notifyListeners(final DataTreeCandidate candidate) { @@ -143,7 +144,7 @@ public class ShardDataTree extends ShardDataTreeTransactionParent { transactionChains.clear(); } - void closeTransactionChain(final String transactionChainId) { + void closeTransactionChain(final LocalHistoryIdentifier transactionChainId) { final ShardDataTreeTransactionChain chain = transactionChains.remove(transactionChainId); if (chain != null) { chain.close(); 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 5c377d5ff5..eefebb6af8 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 @@ -10,6 +10,8 @@ package org.opendaylight.controller.cluster.datastore; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import javax.annotation.concurrent.NotThreadSafe; +import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,15 +23,15 @@ import org.slf4j.LoggerFactory; final class ShardDataTreeTransactionChain extends ShardDataTreeTransactionParent { private static final Logger LOG = LoggerFactory.getLogger(ShardDataTreeTransactionChain.class); private final ShardDataTree dataTree; - private final String chainId; + private final LocalHistoryIdentifier chainId; private ReadWriteShardDataTreeTransaction previousTx; private ReadWriteShardDataTreeTransaction openTransaction; private boolean closed; - ShardDataTreeTransactionChain(final String chainId, final ShardDataTree dataTree) { + ShardDataTreeTransactionChain(final LocalHistoryIdentifier localHistoryIdentifier, final ShardDataTree dataTree) { this.dataTree = Preconditions.checkNotNull(dataTree); - this.chainId = Preconditions.checkNotNull(chainId); + this.chainId = Preconditions.checkNotNull(localHistoryIdentifier); } private DataTreeSnapshot getSnapshot() { @@ -43,14 +45,14 @@ final class ShardDataTreeTransactionChain extends ShardDataTreeTransactionParent } } - 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); } - ReadWriteShardDataTreeTransaction newReadWriteTransaction(final String txId) { + ReadWriteShardDataTreeTransaction newReadWriteTransaction(final TransactionIdentifier txId) { final DataTreeSnapshot snapshot = getSnapshot(); LOG.debug("Allocated read-write transaction {} snapshot {}", txId, snapshot); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardReadTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardReadTransaction.java index d28278afa9..ec526d4fc0 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardReadTransaction.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardReadTransaction.java @@ -11,6 +11,7 @@ package org.opendaylight.controller.cluster.datastore; import akka.actor.ActorRef; import akka.actor.PoisonPill; import com.google.common.base.Optional; +import com.google.common.base.Preconditions; import org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard.ShardStats; import org.opendaylight.controller.cluster.datastore.messages.CreateSnapshot; import org.opendaylight.controller.cluster.datastore.messages.DataExists; @@ -30,7 +31,7 @@ public class ShardReadTransaction extends ShardTransaction { public ShardReadTransaction(AbstractShardDataTreeTransaction transaction, ActorRef shardActor, ShardStats shardStats) { super(shardActor, shardStats, transaction.getId()); - this.transaction = transaction; + this.transaction = Preconditions.checkNotNull(transaction); } @Override diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardSnapshotCohort.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardSnapshotCohort.java index 7cdd7c6b98..d3d840923b 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardSnapshotCohort.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardSnapshotCohort.java @@ -10,6 +10,12 @@ package org.opendaylight.controller.cluster.datastore; import akka.actor.ActorRef; import com.google.common.base.Preconditions; import java.util.concurrent.ExecutionException; +import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier; +import org.opendaylight.controller.cluster.access.concepts.FrontendIdentifier; +import org.opendaylight.controller.cluster.access.concepts.FrontendType; +import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier; +import org.opendaylight.controller.cluster.access.concepts.MemberName; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.datastore.messages.CreateSnapshot; import org.opendaylight.controller.cluster.datastore.utils.SerializationUtils; import org.opendaylight.controller.cluster.raft.RaftActorSnapshotCohort; @@ -23,19 +29,30 @@ import org.slf4j.Logger; * @author Thomas Pantelis */ class ShardSnapshotCohort implements RaftActorSnapshotCohort { + private static final FrontendType SNAPSHOT_APPLY = FrontendType.forName("snapshot-apply"); + private static final FrontendType SNAPSHOT_READ = FrontendType.forName("snapshot-read"); + private final ShardTransactionActorFactory transactionActorFactory; + private final LocalHistoryIdentifier applyHistoryId; + private final LocalHistoryIdentifier readHistoryId; private final ShardDataTree store; private final String logId; private final Logger log; - private int createSnapshotTransactionCounter; + private long applyCounter; + private long readCounter; - ShardSnapshotCohort(ShardTransactionActorFactory transactionActorFactory, ShardDataTree store, + ShardSnapshotCohort(MemberName memberName, ShardTransactionActorFactory transactionActorFactory, ShardDataTree store, Logger log, String logId) { - this.transactionActorFactory = transactionActorFactory; + this.transactionActorFactory = Preconditions.checkNotNull(transactionActorFactory); this.store = Preconditions.checkNotNull(store); this.log = log; this.logId = logId; + + this.applyHistoryId = new LocalHistoryIdentifier(ClientIdentifier.create( + FrontendIdentifier.create(memberName, SNAPSHOT_APPLY), 0), 0); + this.readHistoryId = new LocalHistoryIdentifier(ClientIdentifier.create( + FrontendIdentifier.create(memberName, SNAPSHOT_READ), 0), 0); } @Override @@ -45,7 +62,7 @@ class ShardSnapshotCohort implements RaftActorSnapshotCohort { // after processing the CreateSnapshot message. ActorRef createSnapshotTransaction = transactionActorFactory.newShardTransaction( - TransactionType.READ_ONLY, "createSnapshot" + ++createSnapshotTransactionCounter, ""); + TransactionType.READ_ONLY, new TransactionIdentifier(readHistoryId, readCounter++)); createSnapshotTransaction.tell(CreateSnapshot.INSTANCE, actorRef); } @@ -59,7 +76,8 @@ class ShardSnapshotCohort implements RaftActorSnapshotCohort { log.info("{}: Applying snapshot", logId); try { - ReadWriteShardDataTreeTransaction transaction = store.newReadWriteTransaction("snapshot-" + logId, null); + ReadWriteShardDataTreeTransaction transaction = store.newReadWriteTransaction( + new TransactionIdentifier(applyHistoryId, applyCounter++)); NormalizedNode node = SerializationUtils.deserializeNormalizedNode(snapshotBytes); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransaction.java index ee38d1918e..2421cce26c 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransaction.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransaction.java @@ -15,6 +15,7 @@ import akka.actor.ReceiveTimeout; import akka.japi.Creator; import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.common.actor.AbstractUntypedActorWithMetering; import org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard.ShardStats; import org.opendaylight.controller.cluster.datastore.messages.CloseTransaction; @@ -42,9 +43,9 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; public abstract class ShardTransaction extends AbstractUntypedActorWithMetering { private final ActorRef shardActor; private final ShardStats shardStats; - private final String transactionID; + private final TransactionIdentifier transactionID; - protected ShardTransaction(ActorRef shardActor, ShardStats shardStats, String transactionID) { + protected ShardTransaction(ActorRef shardActor, ShardStats shardStats, TransactionIdentifier transactionID) { super("shard-tx"); //actor name override used for metering. This does not change the "real" actor name this.shardActor = shardActor; this.shardStats = shardStats; @@ -62,7 +63,7 @@ public abstract class ShardTransaction extends AbstractUntypedActorWithMetering return shardActor; } - protected String getTransactionID() { + protected final TransactionIdentifier getTransactionID() { return transactionID; } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransactionFactory.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransactionFactory.java index 3c03871159..ecfd2aa50d 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransactionFactory.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransactionFactory.java @@ -10,6 +10,10 @@ package org.opendaylight.controller.cluster.datastore; import akka.actor.ActorRef; import akka.actor.UntypedActorContext; import com.google.common.base.Preconditions; +import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier; +import org.opendaylight.controller.cluster.access.concepts.FrontendIdentifier; +import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard.ShardStats; /** @@ -36,19 +40,35 @@ class ShardTransactionActorFactory { this.shardActor = shardActor; } - ActorRef newShardTransaction(TransactionType type, String transactionID, String transactionChainID) { + private static String actorNameFor(final TransactionIdentifier txId) { + final LocalHistoryIdentifier historyId = txId.getHistoryId(); + final ClientIdentifier clientId = historyId.getClientId(); + final FrontendIdentifier frontendId = clientId.getFrontendId(); + + final StringBuilder sb = new StringBuilder("shard-"); + sb.append(frontendId.getMemberName().getName()).append(':'); + sb.append(frontendId.getClientType().getName()).append('@'); + sb.append(clientId.getGeneration()).append(':'); + if (historyId.getHistoryId() != 0) { + sb.append(historyId.getHistoryId()).append('-'); + } + + return sb.append(txId.getTransactionId()).toString(); + } + + ActorRef newShardTransaction(TransactionType type, TransactionIdentifier transactionID) { final AbstractShardDataTreeTransaction transaction; switch (type) { case READ_ONLY: - transaction = dataTree.newReadOnlyTransaction(transactionID, transactionChainID); + transaction = dataTree.newReadOnlyTransaction(transactionID); shardMBean.incrementReadOnlyTransactionCount(); break; case READ_WRITE: - transaction = dataTree.newReadWriteTransaction(transactionID, transactionChainID); + transaction = dataTree.newReadWriteTransaction(transactionID); shardMBean.incrementReadWriteTransactionCount(); break; case WRITE_ONLY: - transaction = dataTree.newReadWriteTransaction(transactionID, transactionChainID); + transaction = dataTree.newReadWriteTransaction(transactionID); shardMBean.incrementWriteOnlyTransactionCount(); break; default: @@ -56,6 +76,6 @@ class ShardTransactionActorFactory { } return actorContext.actorOf(ShardTransaction.props(type, transaction, shardActor, datastoreContext, shardMBean) - .withDispatcher(txnDispatcherPath), "shard-" + transactionID); + .withDispatcher(txnDispatcherPath), actorNameFor(transactionID)); } } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardWriteTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardWriteTransaction.java index 4ae54d3e5f..3b175a9c05 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardWriteTransaction.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardWriteTransaction.java @@ -11,6 +11,7 @@ package org.opendaylight.controller.cluster.datastore; import akka.actor.ActorRef; import akka.actor.PoisonPill; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard.ShardStats; import org.opendaylight.controller.cluster.datastore.messages.BatchedModifications; import org.opendaylight.controller.cluster.datastore.messages.BatchedModificationsReply; @@ -106,7 +107,7 @@ public class ShardWriteTransaction extends ShardTransaction { } private void readyTransaction(boolean returnSerialized, boolean doImmediateCommit, short clientTxVersion) { - String transactionID = getTransactionID(); + TransactionIdentifier transactionID = getTransactionID(); LOG.debug("readyTransaction : {}", transactionID); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/SimpleShardDataTreeCohort.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/SimpleShardDataTreeCohort.java index 5dda3612a1..2842881510 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/SimpleShardDataTreeCohort.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/SimpleShardDataTreeCohort.java @@ -10,6 +10,7 @@ package org.opendaylight.controller.cluster.datastore; import com.google.common.base.Preconditions; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.datastore.utils.PruningDataTreeModification; import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; @@ -26,14 +27,14 @@ final class SimpleShardDataTreeCohort extends ShardDataTreeCohort { private static final ListenableFuture VOID_FUTURE = Futures.immediateFuture(null); private final DataTreeModification transaction; private final ShardDataTree dataTree; - private final String transactionId; + private final TransactionIdentifier transactionId; private DataTreeCandidateTip candidate; SimpleShardDataTreeCohort(final ShardDataTree dataTree, final DataTreeModification transaction, - final String transactionId) { + final TransactionIdentifier transactionId) { this.dataTree = Preconditions.checkNotNull(dataTree); this.transaction = Preconditions.checkNotNull(transaction); - this.transactionId = transactionId; + this.transactionId = Preconditions.checkNotNull(transactionId); } @Override diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxy.java index 8d85bdcb66..357ab92c81 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxy.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxy.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.datastore.messages.AbortTransaction; import org.opendaylight.controller.cluster.datastore.messages.AbortTransactionReply; import org.opendaylight.controller.cluster.datastore.messages.CanCommitTransaction; @@ -41,7 +42,7 @@ public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort< private static final MessageSupplier COMMIT_MESSAGE_SUPPLIER = new MessageSupplier() { @Override - public Object newMessage(String transactionId, short version) { + public Object newMessage(TransactionIdentifier transactionId, short version) { return new CommitTransaction(transactionId, version).toSerializable(); } @@ -53,7 +54,7 @@ public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort< private static final MessageSupplier ABORT_MESSAGE_SUPPLIER = new MessageSupplier() { @Override - public Object newMessage(String transactionId, short version) { + public Object newMessage(TransactionIdentifier transactionId, short version) { return new AbortTransaction(transactionId, version).toSerializable(); } @@ -66,13 +67,14 @@ public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort< private final ActorContext actorContext; private final List cohorts; private final SettableFuture cohortsResolvedFuture = SettableFuture.create(); - private final String transactionId; + private final TransactionIdentifier transactionId; private volatile OperationCallback commitOperationCallback; - public ThreePhaseCommitCohortProxy(ActorContext actorContext, List cohorts, String transactionId) { + public ThreePhaseCommitCohortProxy(ActorContext actorContext, List cohorts, + TransactionIdentifier transactionId) { this.actorContext = actorContext; this.cohorts = cohorts; - this.transactionId = transactionId; + this.transactionId = Preconditions.checkNotNull(transactionId); if(cohorts.isEmpty()) { cohortsResolvedFuture.set(null); @@ -392,7 +394,7 @@ public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort< } private interface MessageSupplier { - Object newMessage(String transactionId, short version); + Object newMessage(TransactionIdentifier transactionId, short version); boolean isSerializedReplyType(Object reply); } } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionChainProxy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionChainProxy.java index b93f540f20..2b00d970a6 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionChainProxy.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionChainProxy.java @@ -151,10 +151,6 @@ final class TransactionChainProxy extends AbstractTransactionContextFactory() { @Override public Object apply(Short version) { - return new CloseTransactionChain(getHistoryId().toString(), version).toSerializable(); + return new CloseTransactionChain(getHistoryId(), version).toSerializable(); } }); } @@ -229,7 +225,7 @@ final class TransactionChainProxy extends AbstractTransactionContextFactory> preCommit) { - final ReadWriteShardDataTreeTransaction tx = dataStore.newReadWriteTransaction("setup-mock-" + cohortName, null); + final ReadWriteShardDataTreeTransaction tx = dataStore.newReadWriteTransaction(nextTransactionId()); tx.getSnapshot().write(path, data); final ShardDataTreeCohort cohort = createDelegatingMockCohort(cohortName, dataStore.finishTransaction(tx), preCommit); @@ -270,9 +271,8 @@ public abstract class AbstractShardTest extends AbstractActorTest{ } protected Object prepareReadyTransactionMessage(boolean remoteReadWriteTransaction, Shard shard, ShardDataTreeCohort cohort, - String transactionID, - MutableCompositeModification modification, - boolean doCommitOnReady) { + TransactionIdentifier transactionID, MutableCompositeModification modification, + boolean doCommitOnReady) { if(remoteReadWriteTransaction){ return prepareForwardedReadyTransaction(cohort, transactionID, CURRENT_VERSION, doCommitOnReady); @@ -299,15 +299,14 @@ public abstract class AbstractShardTest extends AbstractActorTest{ } protected ForwardedReadyTransaction prepareForwardedReadyTransaction(ShardDataTreeCohort cohort, - String transactionID, short version, boolean doCommitOnReady) { + TransactionIdentifier transactionID, short version, boolean doCommitOnReady) { return new ForwardedReadyTransaction(transactionID, version, new ReadWriteShardDataTreeTransaction(newShardDataTreeTransactionParent(cohort), transactionID, mock(DataTreeModification.class)), doCommitOnReady); } protected Object prepareReadyTransactionMessage(boolean remoteReadWriteTransaction, Shard shard, ShardDataTreeCohort cohort, - String transactionID, - MutableCompositeModification modification) { + TransactionIdentifier transactionID, MutableCompositeModification modification) { return prepareReadyTransactionMessage(remoteReadWriteTransaction, shard, cohort, transactionID, modification, false); } @@ -320,15 +319,15 @@ public abstract class AbstractShardTest extends AbstractActorTest{ }); } - protected BatchedModifications prepareBatchedModifications(String transactionID, + protected BatchedModifications prepareBatchedModifications(TransactionIdentifier transactionID, MutableCompositeModification modification) { return prepareBatchedModifications(transactionID, modification, false); } - private static BatchedModifications prepareBatchedModifications(String transactionID, + private static BatchedModifications prepareBatchedModifications(TransactionIdentifier transactionID, MutableCompositeModification modification, boolean doCommitOnReady) { - final BatchedModifications batchedModifications = new BatchedModifications(transactionID, CURRENT_VERSION, null); + final BatchedModifications batchedModifications = new BatchedModifications(transactionID, CURRENT_VERSION); batchedModifications.addModification(modification); batchedModifications.setReady(true); batchedModifications.setDoCommitOnReady(doCommitOnReady); @@ -346,9 +345,9 @@ public abstract class AbstractShardTest extends AbstractActorTest{ return store.takeSnapshot().readNode(id).orNull(); } - public static void writeToStore(final TestActorRef shard, final YangInstanceIdentifier id, + public void writeToStore(final TestActorRef shard, final YangInstanceIdentifier id, final NormalizedNode node) throws InterruptedException, ExecutionException { - Future future = Patterns.ask(shard, newBatchedModifications("tx", id, node, true, true, 1), + Future future = Patterns.ask(shard, newBatchedModifications(nextTransactionId(), id, node, true, true, 1), new Timeout(5, TimeUnit.SECONDS)); try { Await.ready(future, Duration.create(5, TimeUnit.SECONDS)); @@ -359,7 +358,7 @@ public abstract class AbstractShardTest extends AbstractActorTest{ public static void writeToStore(final ShardDataTree store, final YangInstanceIdentifier id, final NormalizedNode node) throws InterruptedException, ExecutionException { - final ReadWriteShardDataTreeTransaction transaction = store.newReadWriteTransaction("writeToStore", null); + final ReadWriteShardDataTreeTransaction transaction = store.newReadWriteTransaction(nextTransactionId()); transaction.getSnapshot().write(id, node); final ShardDataTreeCohort cohort = transaction.ready(); @@ -368,9 +367,9 @@ public abstract class AbstractShardTest extends AbstractActorTest{ cohort.commit(); } - public static void mergeToStore(final ShardDataTree store, final YangInstanceIdentifier id, + public void mergeToStore(final ShardDataTree store, final YangInstanceIdentifier id, final NormalizedNode node) throws InterruptedException, ExecutionException { - final ReadWriteShardDataTreeTransaction transaction = store.newReadWriteTransaction("writeToStore", null); + final ReadWriteShardDataTreeTransaction transaction = store.newReadWriteTransaction(nextTransactionId()); transaction.getSnapshot().merge(id, node); final ShardDataTreeCohort cohort = transaction.ready(); @@ -411,15 +410,10 @@ public abstract class AbstractShardTest extends AbstractActorTest{ return DataTreeCandidatePayload.create(candidate); } - static BatchedModifications newBatchedModifications(final String transactionID, final YangInstanceIdentifier path, - final NormalizedNode data, final boolean ready, final boolean doCommitOnReady, final int messagesSent) { - return newBatchedModifications(transactionID, null, path, data, ready, doCommitOnReady, messagesSent); - } - - static BatchedModifications newBatchedModifications(final String transactionID, final String transactionChainID, + static BatchedModifications newBatchedModifications(final TransactionIdentifier transactionID, final YangInstanceIdentifier path, final NormalizedNode data, final boolean ready, final boolean doCommitOnReady, final int messagesSent) { - final BatchedModifications batched = new BatchedModifications(transactionID, CURRENT_VERSION, transactionChainID); + final BatchedModifications batched = new BatchedModifications(transactionID, CURRENT_VERSION); batched.addModification(new WriteModification(path, data)); batched.setReady(ready); batched.setDoCommitOnReady(doCommitOnReady); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/AbstractTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/AbstractTest.java new file mode 100644 index 0000000000..66a41275fc --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/AbstractTest.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2016 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.cluster.datastore; + +import java.util.concurrent.atomic.AtomicLong; +import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier; +import org.opendaylight.controller.cluster.access.concepts.FrontendIdentifier; +import org.opendaylight.controller.cluster.access.concepts.FrontendType; +import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier; +import org.opendaylight.controller.cluster.access.concepts.MemberName; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; + +public abstract class AbstractTest { + protected static final MemberName MEMBER_NAME = MemberName.forName("member-1"); + private static final FrontendType FRONTEND_TYPE = FrontendType.forName(ShardTransactionTest.class.getSimpleName()); + + protected static final FrontendIdentifier FRONTEND_ID = FrontendIdentifier.create(MEMBER_NAME, FRONTEND_TYPE); + + private static final ClientIdentifier CLIENT_ID = ClientIdentifier.create(FRONTEND_ID, 0); + private static final LocalHistoryIdentifier HISTORY_ID = new LocalHistoryIdentifier(CLIENT_ID, 0); + private static final AtomicLong HISTORY_COUNTER = new AtomicLong(); + private static final AtomicLong TX_COUNTER = new AtomicLong(); + + protected static TransactionIdentifier nextTransactionId() { + return new TransactionIdentifier(HISTORY_ID, TX_COUNTER.getAndIncrement()); + } + + protected static LocalHistoryIdentifier nextHistoryId() { + return new LocalHistoryIdentifier(CLIENT_ID, HISTORY_COUNTER.incrementAndGet()); + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/AbstractTransactionProxyTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/AbstractTransactionProxyTest.java index 0fa716a7ff..73eb41064c 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/AbstractTransactionProxyTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/AbstractTransactionProxyTest.java @@ -88,7 +88,7 @@ import scala.concurrent.duration.Duration; * * @author Thomas Pantelis */ -public abstract class AbstractTransactionProxyTest { +public abstract class AbstractTransactionProxyTest extends AbstractTest { protected final Logger log = LoggerFactory.getLogger(getClass()); private static ActorSystem system; @@ -190,7 +190,7 @@ public abstract class AbstractTransactionProxyTest { public boolean matches(Object argument) { if(CreateTransaction.class.equals(argument.getClass())) { CreateTransaction obj = CreateTransaction.fromSerializable(argument); - return obj.getTransactionId().startsWith(memberName + ':') && + return obj.getTransactionId().getHistoryId().getClientId().getFrontendId().getMemberName().getName().equals(memberName) && obj.getTransactionType() == type.ordinal(); } @@ -291,7 +291,7 @@ public abstract class AbstractTransactionProxyTest { } protected CreateTransactionReply createTransactionReply(ActorRef actorRef, short transactionVersion){ - return new CreateTransactionReply(actorRef.path().toString(), "txn-1", transactionVersion); + return new CreateTransactionReply(actorRef.path().toString(), nextTransactionId(), transactionVersion); } protected ActorRef setupActorContextWithoutInitialCreateTransaction(ActorSystem actorSystem) { diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreRemotingIntegrationTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreRemotingIntegrationTest.java index d3932f50c6..0a82a1fffb 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreRemotingIntegrationTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DistributedDataStoreRemotingIntegrationTest.java @@ -43,6 +43,7 @@ import org.junit.Test; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.databroker.ConcurrentDOMDataBroker; import org.opendaylight.controller.cluster.datastore.DatastoreContext.Builder; import org.opendaylight.controller.cluster.datastore.IntegrationTestKit.ShardStatsVerifier; @@ -99,7 +100,7 @@ import scala.concurrent.duration.FiniteDuration; * * @author Thomas Pantelis */ -public class DistributedDataStoreRemotingIntegrationTest { +public class DistributedDataStoreRemotingIntegrationTest extends AbstractTest { private static final String[] CARS_AND_PEOPLE = {"cars", "people"}; private static final String[] CARS = {"cars"}; @@ -121,6 +122,8 @@ public class DistributedDataStoreRemotingIntegrationTest { private final DatastoreContext.Builder followerDatastoreContextBuilder = DatastoreContext.newBuilder().shardHeartbeatIntervalInMillis(100).shardElectionTimeoutFactor(5). customRaftPolicyImplementation(DisableElectionsRaftPolicy.class.getName()); + private final TransactionIdentifier tx1 = nextTransactionId(); + private final TransactionIdentifier tx2 = nextTransactionId(); private DistributedDataStore followerDistributedDataStore; private DistributedDataStore leaderDistributedDataStore; @@ -575,7 +578,7 @@ public class DistributedDataStoreRemotingIntegrationTest { new WriteModification(CarsModel.newCarPath("optima"), car1).apply(modification); modification.ready(); - ReadyLocalTransaction readyLocal = new ReadyLocalTransaction("tx-1" , modification, true); + ReadyLocalTransaction readyLocal = new ReadyLocalTransaction(tx1 , modification, true); carsFollowerShard.get().tell(readyLocal, followerTestKit.getRef()); Object resp = followerTestKit.expectMsgClass(Object.class); @@ -594,7 +597,7 @@ public class DistributedDataStoreRemotingIntegrationTest { new WriteModification(CarsModel.newCarPath("sportage"), car2).apply(modification); modification.ready(); - readyLocal = new ReadyLocalTransaction("tx-2" , modification, false); + readyLocal = new ReadyLocalTransaction(tx2 , modification, false); carsFollowerShard.get().tell(readyLocal, followerTestKit.getRef()); resp = followerTestKit.expectMsgClass(Object.class); @@ -611,7 +614,7 @@ public class DistributedDataStoreRemotingIntegrationTest { Mockito.doReturn(DataStoreVersions.CURRENT_VERSION).when(versionSupplier).get(); ThreePhaseCommitCohortProxy cohort = new ThreePhaseCommitCohortProxy( leaderDistributedDataStore.getActorContext(), Arrays.asList( - new ThreePhaseCommitCohortProxy.CohortInfo(Futures.successful(txActor), versionSupplier)), "tx-2"); + new ThreePhaseCommitCohortProxy.CohortInfo(Futures.successful(txActor), versionSupplier)), tx2); cohort.canCommit().get(5, TimeUnit.SECONDS); cohort.preCommit().get(5, TimeUnit.SECONDS); cohort.commit().get(5, TimeUnit.SECONDS); @@ -640,9 +643,9 @@ public class DistributedDataStoreRemotingIntegrationTest { MapEntryNode car1 = CarsModel.newCarEntry("optima", BigInteger.valueOf(20000)); new WriteModification(CarsModel.newCarPath("optima"), car1).apply(modification); - ForwardedReadyTransaction forwardedReady = new ForwardedReadyTransaction("tx-1", + ForwardedReadyTransaction forwardedReady = new ForwardedReadyTransaction(tx1, DataStoreVersions.CURRENT_VERSION, new ReadWriteShardDataTreeTransaction( - Mockito.mock(ShardDataTreeTransactionParent.class), "tx-1", modification), true); + Mockito.mock(ShardDataTreeTransactionParent.class), tx1, modification), true); carsFollowerShard.get().tell(forwardedReady, followerTestKit.getRef()); Object resp = followerTestKit.expectMsgClass(Object.class); @@ -660,9 +663,9 @@ public class DistributedDataStoreRemotingIntegrationTest { MapEntryNode car2 = CarsModel.newCarEntry("sportage", BigInteger.valueOf(30000)); new WriteModification(CarsModel.newCarPath("sportage"), car2).apply(modification); - forwardedReady = new ForwardedReadyTransaction("tx-2", + forwardedReady = new ForwardedReadyTransaction(tx2, DataStoreVersions.CURRENT_VERSION, new ReadWriteShardDataTreeTransaction( - Mockito.mock(ShardDataTreeTransactionParent.class), "tx-2", modification), false); + Mockito.mock(ShardDataTreeTransactionParent.class), tx2, modification), false); carsFollowerShard.get().tell(forwardedReady, followerTestKit.getRef()); resp = followerTestKit.expectMsgClass(Object.class); @@ -679,7 +682,7 @@ public class DistributedDataStoreRemotingIntegrationTest { Mockito.doReturn(DataStoreVersions.CURRENT_VERSION).when(versionSupplier).get(); ThreePhaseCommitCohortProxy cohort = new ThreePhaseCommitCohortProxy( leaderDistributedDataStore.getActorContext(), Arrays.asList( - new ThreePhaseCommitCohortProxy.CohortInfo(Futures.successful(txActor), versionSupplier)), "tx-2"); + new ThreePhaseCommitCohortProxy.CohortInfo(Futures.successful(txActor), versionSupplier)), tx2); cohort.canCommit().get(5, TimeUnit.SECONDS); cohort.preCommit().get(5, TimeUnit.SECONDS); cohort.commit().get(5, TimeUnit.SECONDS); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardDataTreeTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardDataTreeTest.java index c31db3205f..d35b2dbc34 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardDataTreeTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardDataTreeTest.java @@ -28,7 +28,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot; import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -public class ShardDataTreeTest { +public class ShardDataTreeTest extends AbstractTest { SchemaContext fullSchema; @@ -52,7 +52,7 @@ public class ShardDataTreeTest { assertEquals(fullSchema, shardDataTree.getSchemaContext()); - ReadWriteShardDataTreeTransaction transaction = shardDataTree.newReadWriteTransaction("txn-1", null); + ReadWriteShardDataTreeTransaction transaction = shardDataTree.newReadWriteTransaction(nextTransactionId()); DataTreeModification snapshot = transaction.getSnapshot(); @@ -72,7 +72,7 @@ public class ShardDataTreeTest { cohort.commit().get(); - ReadOnlyShardDataTreeTransaction readOnlyShardDataTreeTransaction = shardDataTree.newReadOnlyTransaction("txn-2", null); + ReadOnlyShardDataTreeTransaction readOnlyShardDataTreeTransaction = shardDataTree.newReadOnlyTransaction(nextTransactionId()); DataTreeSnapshot snapshot1 = readOnlyShardDataTreeTransaction.getSnapshot(); @@ -123,45 +123,36 @@ public class ShardDataTreeTest { } private static NormalizedNode getCars(ShardDataTree shardDataTree) { - ReadOnlyShardDataTreeTransaction readOnlyShardDataTreeTransaction = shardDataTree.newReadOnlyTransaction("txn-2", null); + ReadOnlyShardDataTreeTransaction readOnlyShardDataTreeTransaction = shardDataTree.newReadOnlyTransaction(nextTransactionId()); DataTreeSnapshot snapshot1 = readOnlyShardDataTreeTransaction.getSnapshot(); Optional> optional = snapshot1.readNode(CarsModel.BASE_PATH); assertEquals(true, optional.isPresent()); - System.out.println(optional.get()); - return optional.get(); } private static DataTreeCandidateTip addCar(ShardDataTree shardDataTree) throws ExecutionException, InterruptedException { - return doTransaction(shardDataTree, new DataTreeOperation() { - @Override - public void execute(DataTreeModification snapshot) { + return doTransaction(shardDataTree, snapshot -> { snapshot.merge(CarsModel.BASE_PATH, CarsModel.emptyContainer()); snapshot.merge(CarsModel.CAR_LIST_PATH, CarsModel.newCarMapNode()); snapshot.write(CarsModel.newCarPath("altima"), CarsModel.newCarEntry("altima", new BigInteger("100"))); - } - }); + }); } private static DataTreeCandidateTip removeCar(ShardDataTree shardDataTree) throws ExecutionException, InterruptedException { - return doTransaction(shardDataTree, new DataTreeOperation() { - @Override - public void execute(DataTreeModification snapshot) { - snapshot.delete(CarsModel.newCarPath("altima")); - } - }); + return doTransaction(shardDataTree, snapshot -> snapshot.delete(CarsModel.newCarPath("altima"))); } - private abstract static class DataTreeOperation { - public abstract void execute(DataTreeModification snapshot); + @FunctionalInterface + private static interface DataTreeOperation { + void execute(DataTreeModification snapshot); } private static DataTreeCandidateTip doTransaction(ShardDataTree shardDataTree, DataTreeOperation operation) throws ExecutionException, InterruptedException { - ReadWriteShardDataTreeTransaction transaction = shardDataTree.newReadWriteTransaction("txn-1", null); + ReadWriteShardDataTreeTransaction transaction = shardDataTree.newReadWriteTransaction(nextTransactionId()); DataTreeModification snapshot = transaction.getSnapshot(); operation.execute(snapshot); ShardDataTreeCohort cohort = shardDataTree.finishTransaction(transaction); @@ -176,7 +167,7 @@ public class ShardDataTreeTest { private static DataTreeCandidateTip applyCandidates(ShardDataTree shardDataTree, List candidates) throws ExecutionException, InterruptedException { - ReadWriteShardDataTreeTransaction transaction = shardDataTree.newReadWriteTransaction("txn-1", null); + ReadWriteShardDataTreeTransaction transaction = shardDataTree.newReadWriteTransaction(nextTransactionId()); DataTreeModification snapshot = transaction.getSnapshot(); for(DataTreeCandidateTip candidateTip : candidates){ DataTreeCandidates.applyToModification(snapshot, candidateTip); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java index 994c91ca89..2082dbcdd9 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java @@ -47,7 +47,9 @@ import org.junit.Test; import org.mockito.InOrder; import org.opendaylight.controller.cluster.DataPersistenceProvider; import org.opendaylight.controller.cluster.DelegatingPersistentDataProvider; +import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier; import org.opendaylight.controller.cluster.access.concepts.MemberName; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.datastore.exceptions.NoShardLeaderException; import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier; import org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard.ShardStats; @@ -356,7 +358,7 @@ public class ShardTest extends AbstractShardTest { shard.tell(new UpdateSchemaContext(TestModel.createTestContext()), getRef()); - shard.tell(new CreateTransaction("txn-1", TransactionType.READ_ONLY.ordinal(), null, + shard.tell(new CreateTransaction(nextTransactionId(), TransactionType.READ_ONLY.ordinal(), DataStoreVersions.CURRENT_VERSION).toSerializable(), getRef()); final CreateTransactionReply reply = expectMsgClass(duration("3 seconds"), @@ -364,7 +366,7 @@ public class ShardTest extends AbstractShardTest { final String path = reply.getTransactionPath().toString(); assertTrue("Unexpected transaction path " + path, - path.contains("akka://test/user/testCreateTransaction/shard-txn-1")); + path.startsWith("akka://test/user/testCreateTransaction/shard-member-1:ShardTransactionTest@0:")); }}; } @@ -375,7 +377,7 @@ public class ShardTest extends AbstractShardTest { waitUntilLeader(shard); - shard.tell(new CreateTransaction("txn-1",TransactionType.READ_ONLY.ordinal(), "foobar", + shard.tell(new CreateTransaction(nextTransactionId(),TransactionType.READ_ONLY.ordinal(), DataStoreVersions.CURRENT_VERSION).toSerializable(), getRef()); final CreateTransactionReply reply = expectMsgClass(duration("3 seconds"), @@ -383,7 +385,7 @@ public class ShardTest extends AbstractShardTest { final String path = reply.getTransactionPath().toString(); assertTrue("Unexpected transaction path " + path, - path.contains("akka://test/user/testCreateTransactionOnChain/shard-txn-1")); + path.startsWith("akka://test/user/testCreateTransactionOnChain/shard-member-1:ShardTransactionTest@0:")); }}; } @@ -514,19 +516,19 @@ public class ShardTest extends AbstractShardTest { final ShardDataTree dataStore = shard.underlyingActor().getDataStore(); - final String transactionID1 = "tx1"; + final TransactionIdentifier transactionID1 = nextTransactionId(); final MutableCompositeModification modification1 = new MutableCompositeModification(); final ShardDataTreeCohort cohort1 = setupMockWriteTransaction("cohort1", dataStore, TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME), modification1); - final String transactionID2 = "tx2"; + final TransactionIdentifier transactionID2 = nextTransactionId(); final MutableCompositeModification modification2 = new MutableCompositeModification(); final ShardDataTreeCohort cohort2 = setupMockWriteTransaction("cohort2", dataStore, TestModel.OUTER_LIST_PATH, ImmutableNodes.mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build(), modification2); - final String transactionID3 = "tx3"; + final TransactionIdentifier transactionID3 = nextTransactionId(); final MutableCompositeModification modification3 = new MutableCompositeModification(); final ShardDataTreeCohort cohort3 = setupMockWriteTransaction("cohort3", dataStore, YangInstanceIdentifier.builder(TestModel.OUTER_LIST_PATH) @@ -614,9 +616,9 @@ public class ShardTest extends AbstractShardTest { } class OnCanCommitFutureComplete extends OnFutureComplete { - private final String transactionID; + private final TransactionIdentifier transactionID; - OnCanCommitFutureComplete(final String transactionID) { + OnCanCommitFutureComplete(final TransactionIdentifier transactionID) { super(CanCommitTransactionReply.class); this.transactionID = transactionID; } @@ -675,7 +677,7 @@ public class ShardTest extends AbstractShardTest { waitUntilLeader(shard); - final String transactionID = "tx"; + final TransactionIdentifier transactionID = nextTransactionId(); final FiniteDuration duration = duration("5 seconds"); final AtomicReference mockCohort = new AtomicReference<>(); @@ -738,7 +740,7 @@ public class ShardTest extends AbstractShardTest { waitUntilLeader(shard); - final String transactionID = "tx"; + final TransactionIdentifier transactionID = nextTransactionId(); final FiniteDuration duration = duration("5 seconds"); final AtomicReference mockCohort = new AtomicReference<>(); @@ -790,8 +792,8 @@ public class ShardTest extends AbstractShardTest { waitUntilLeader(shard); - final String transactionID = "tx1"; - final BatchedModifications batched = new BatchedModifications(transactionID, DataStoreVersions.CURRENT_VERSION, null); + final TransactionIdentifier transactionID = nextTransactionId(); + final BatchedModifications batched = new BatchedModifications(transactionID, DataStoreVersions.CURRENT_VERSION); batched.setReady(true); batched.setTotalMessagesSent(2); @@ -817,20 +819,20 @@ public class ShardTest extends AbstractShardTest { // Test merge with invalid data. An exception should occur when the merge is applied. Note that // write will not validate the children for performance reasons. - String transactionID = "tx1"; + TransactionIdentifier transactionID = nextTransactionId(); ContainerNode invalidData = ImmutableContainerNodeBuilder.create().withNodeIdentifier( new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME)). withChild(ImmutableNodes.leafNode(TestModel.JUNK_QNAME, "junk")).build(); - BatchedModifications batched = new BatchedModifications(transactionID, CURRENT_VERSION, null); + BatchedModifications batched = new BatchedModifications(transactionID, CURRENT_VERSION); batched.addModification(new MergeModification(TestModel.TEST_PATH, invalidData)); shard.tell(batched, getRef()); Failure failure = expectMsgClass(duration("5 seconds"), akka.actor.Status.Failure.class); Throwable cause = failure.cause(); - batched = new BatchedModifications(transactionID, DataStoreVersions.CURRENT_VERSION, null); + batched = new BatchedModifications(transactionID, DataStoreVersions.CURRENT_VERSION); batched.setReady(true); batched.setTotalMessagesSent(2); @@ -850,9 +852,9 @@ public class ShardTest extends AbstractShardTest { waitUntilLeader(shard); - final String transactionChainID = "txChain"; - final String transactionID1 = "tx1"; - final String transactionID2 = "tx2"; + final LocalHistoryIdentifier historyId = nextHistoryId(); + final TransactionIdentifier transactionID1 = new TransactionIdentifier(historyId, 0); + final TransactionIdentifier transactionID2 = new TransactionIdentifier(historyId, 1); final FiniteDuration duration = duration("5 seconds"); @@ -860,14 +862,13 @@ public class ShardTest extends AbstractShardTest { final ContainerNode containerNode = ImmutableNodes.containerNode(TestModel.TEST_QNAME); final YangInstanceIdentifier path = TestModel.TEST_PATH; - shard.tell(newBatchedModifications(transactionID1, transactionChainID, path, - containerNode, true, false, 1), getRef()); + shard.tell(newBatchedModifications(transactionID1, path, containerNode, true, false, 1), getRef()); expectMsgClass(duration, ReadyTransactionReply.class); // Create a read Tx on the same chain. shard.tell(new CreateTransaction(transactionID2, TransactionType.READ_ONLY.ordinal(), - transactionChainID, DataStoreVersions.CURRENT_VERSION).toSerializable(), getRef()); + DataStoreVersions.CURRENT_VERSION).toSerializable(), getRef()); final CreateTransactionReply createReply = expectMsgClass(duration("3 seconds"), CreateTransactionReply.class); @@ -924,7 +925,7 @@ public class ShardTest extends AbstractShardTest { overrideLeaderCalls.set(true); - final BatchedModifications batched = new BatchedModifications("tx", DataStoreVersions.CURRENT_VERSION, ""); + final BatchedModifications batched = new BatchedModifications(nextTransactionId(), DataStoreVersions.CURRENT_VERSION); shard.tell(batched, ActorRef.noSender()); @@ -943,16 +944,17 @@ public class ShardTest extends AbstractShardTest { waitUntilNoLeader(shard); - shard.tell(new BatchedModifications("tx", DataStoreVersions.CURRENT_VERSION, ""), getRef()); + final TransactionIdentifier txId = nextTransactionId(); + shard.tell(new BatchedModifications(txId, DataStoreVersions.CURRENT_VERSION), getRef()); Failure failure = expectMsgClass(Failure.class); assertEquals("Failure cause type", NoShardLeaderException.class, failure.cause().getClass()); - shard.tell(prepareForwardedReadyTransaction(mock(ShardDataTreeCohort.class), "tx", + shard.tell(prepareForwardedReadyTransaction(mock(ShardDataTreeCohort.class), txId, DataStoreVersions.CURRENT_VERSION, true), getRef()); failure = expectMsgClass(Failure.class); assertEquals("Failure cause type", NoShardLeaderException.class, failure.cause().getClass()); - shard.tell(new ReadyLocalTransaction("tx", mock(DataTreeModification.class), true), getRef()); + shard.tell(new ReadyLocalTransaction(txId, mock(DataTreeModification.class), true), getRef()); failure = expectMsgClass(Failure.class); assertEquals("Failure cause type", NoShardLeaderException.class, failure.cause().getClass()); }}; @@ -978,7 +980,7 @@ public class ShardTest extends AbstractShardTest { final ShardDataTree dataStore = shard.underlyingActor().getDataStore(); - final String transactionID = "tx1"; + final TransactionIdentifier transactionID = nextTransactionId(); final MutableCompositeModification modification = new MutableCompositeModification(); final NormalizedNode containerNode = ImmutableNodes.containerNode(TestModel.TEST_QNAME); final ShardDataTreeCohort cohort = setupMockWriteTransaction("cohort", dataStore, @@ -1018,7 +1020,7 @@ public class ShardTest extends AbstractShardTest { final MapNode mergeData = ImmutableNodes.mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build(); new MergeModification(TestModel.OUTER_LIST_PATH, mergeData).apply(modification); - final String txId = "tx1"; + final TransactionIdentifier txId = nextTransactionId(); modification.ready(); final ReadyLocalTransaction readyMessage = new ReadyLocalTransaction(txId, modification, true); @@ -1049,8 +1051,8 @@ public class ShardTest extends AbstractShardTest { final MapNode mergeData = ImmutableNodes.mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build(); new MergeModification(TestModel.OUTER_LIST_PATH, mergeData).apply(modification); - final String txId = "tx1"; - modification.ready(); + final TransactionIdentifier txId = nextTransactionId(); + modification.ready(); final ReadyLocalTransaction readyMessage = new ReadyLocalTransaction(txId, modification, false); shard.tell(readyMessage, getRef()); @@ -1097,7 +1099,7 @@ public class ShardTest extends AbstractShardTest { // Setup a simulated transactions with a mock cohort. - final String transactionID = "tx"; + final TransactionIdentifier transactionID = nextTransactionId(); final MutableCompositeModification modification = new MutableCompositeModification(); final NormalizedNode containerNode = ImmutableNodes.containerNode(TestModel.TEST_QNAME); final ShardDataTreeCohort cohort = setupMockWriteTransaction("cohort", dataStore, @@ -1151,7 +1153,7 @@ public class ShardTest extends AbstractShardTest { waitUntilLeader(shard); - final String transactionID = "tx1"; + final TransactionIdentifier transactionID = nextTransactionId(); final MutableCompositeModification modification = new MutableCompositeModification(); final ShardDataTreeCohort cohort = mock(ShardDataTreeCohort.class, "cohort1"); doReturn(Futures.immediateFuture(Boolean.TRUE)).when(cohort).canCommit(); @@ -1211,7 +1213,7 @@ public class ShardTest extends AbstractShardTest { waitUntilLeader(shard); - final String transactionID = "tx1"; + final TransactionIdentifier transactionID = nextTransactionId(); final MutableCompositeModification modification = new MutableCompositeModification(); modification.addModification(new DeleteModification(YangInstanceIdentifier.EMPTY)); final ShardDataTreeCohort cohort = mock(ShardDataTreeCohort.class, "cohort1"); @@ -1270,7 +1272,7 @@ public class ShardTest extends AbstractShardTest { // Setup 2 simulated transactions with mock cohorts. The first one fails in the // commit phase. - final String transactionID1 = "tx1"; + final TransactionIdentifier transactionID1 = nextTransactionId(); final MutableCompositeModification modification1 = new MutableCompositeModification(); final ShardDataTreeCohort cohort1 = mock(ShardDataTreeCohort.class, "cohort1"); doReturn(Futures.immediateFuture(Boolean.TRUE)).when(cohort1).canCommit(); @@ -1278,7 +1280,7 @@ public class ShardTest extends AbstractShardTest { doReturn(Futures.immediateFailedFuture(new RuntimeException("mock"))).when(cohort1).commit(); doReturn(mockCandidate("cohort1-candidate")).when(cohort1).getCandidate(); - final String transactionID2 = "tx2"; + final TransactionIdentifier transactionID2 = nextTransactionId(); final MutableCompositeModification modification2 = new MutableCompositeModification(); final ShardDataTreeCohort cohort2 = mock(ShardDataTreeCohort.class, "cohort2"); doReturn(Futures.immediateFuture(Boolean.TRUE)).when(cohort2).canCommit(); @@ -1345,13 +1347,13 @@ public class ShardTest extends AbstractShardTest { waitUntilLeader(shard); - final String transactionID1 = "tx1"; + final TransactionIdentifier transactionID1 = nextTransactionId(); final MutableCompositeModification modification1 = new MutableCompositeModification(); final ShardDataTreeCohort cohort1 = mock(ShardDataTreeCohort.class, "cohort1"); doReturn(Futures.immediateFuture(Boolean.TRUE)).when(cohort1).canCommit(); doReturn(Futures.immediateFailedFuture(new IllegalStateException("mock"))).when(cohort1).preCommit(); - final String transactionID2 = "tx2"; + final TransactionIdentifier transactionID2 = nextTransactionId(); final MutableCompositeModification modification2 = new MutableCompositeModification(); final ShardDataTreeCohort cohort2 = mock(ShardDataTreeCohort.class, "cohort2"); doReturn(Futures.immediateFuture(Boolean.TRUE)).when(cohort2).canCommit(); @@ -1419,7 +1421,7 @@ public class ShardTest extends AbstractShardTest { final FiniteDuration duration = duration("5 seconds"); - final String transactionID1 = "tx1"; + final TransactionIdentifier transactionID1 = nextTransactionId(); final MutableCompositeModification modification = new MutableCompositeModification(); final ShardDataTreeCohort cohort = mock(ShardDataTreeCohort.class, "cohort1"); doReturn(Futures.immediateFailedFuture(new IllegalStateException("mock"))).when(cohort).canCommit(); @@ -1436,7 +1438,7 @@ public class ShardTest extends AbstractShardTest { reset(cohort); - final String transactionID2 = "tx2"; + final TransactionIdentifier transactionID2 = nextTransactionId(); doReturn(Futures.immediateFuture(Boolean.TRUE)).when(cohort).canCommit(); shard.tell(prepareReadyTransactionMessage(readWrite, shard.underlyingActor(), cohort, transactionID2, modification), getRef()); @@ -1465,7 +1467,7 @@ public class ShardTest extends AbstractShardTest { final FiniteDuration duration = duration("5 seconds"); - final String transactionID1 = "tx1"; + final TransactionIdentifier transactionID1 = nextTransactionId(); final MutableCompositeModification modification = new MutableCompositeModification(); final ShardDataTreeCohort cohort = mock(ShardDataTreeCohort.class, "cohort1"); doReturn(Futures.immediateFuture(Boolean.FALSE)).when(cohort).canCommit(); @@ -1484,7 +1486,7 @@ public class ShardTest extends AbstractShardTest { reset(cohort); - final String transactionID2 = "tx2"; + final TransactionIdentifier transactionID2 = nextTransactionId(); doReturn(Futures.immediateFuture(Boolean.TRUE)).when(cohort).canCommit(); shard.tell(prepareReadyTransactionMessage(readWrite, shard.underlyingActor(), cohort, transactionID2, modification), getRef()); @@ -1513,7 +1515,7 @@ public class ShardTest extends AbstractShardTest { final FiniteDuration duration = duration("5 seconds"); - final String transactionID1 = "tx1"; + final TransactionIdentifier transactionID1 = nextTransactionId(); final MutableCompositeModification modification = new MutableCompositeModification(); final ShardDataTreeCohort cohort = mock(ShardDataTreeCohort.class, "cohort1"); doReturn(Futures.immediateFailedFuture(new IllegalStateException("mock"))).when(cohort).canCommit(); @@ -1526,7 +1528,7 @@ public class ShardTest extends AbstractShardTest { reset(cohort); - final String transactionID2 = "tx2"; + final TransactionIdentifier transactionID2 = nextTransactionId(); doReturn(Futures.immediateFuture(Boolean.TRUE)).when(cohort).canCommit(); doReturn(Futures.immediateFuture(null)).when(cohort).preCommit(); doReturn(Futures.immediateFuture(null)).when(cohort).commit(); @@ -1559,12 +1561,12 @@ public class ShardTest extends AbstractShardTest { final FiniteDuration duration = duration("5 seconds"); - final String transactionID = "tx1"; + final TransactionIdentifier transactionID1 = nextTransactionId(); final MutableCompositeModification modification = new MutableCompositeModification(); final ShardDataTreeCohort cohort = mock(ShardDataTreeCohort.class, "cohort1"); doReturn(Futures.immediateFuture(Boolean.FALSE)).when(cohort).canCommit(); - shard.tell(prepareReadyTransactionMessage(readWrite, shard.underlyingActor(), cohort, transactionID, modification, true), getRef()); + shard.tell(prepareReadyTransactionMessage(readWrite, shard.underlyingActor(), cohort, transactionID1, modification, true), getRef()); expectMsgClass(duration, akka.actor.Status.Failure.class); @@ -1572,7 +1574,7 @@ public class ShardTest extends AbstractShardTest { reset(cohort); - final String transactionID2 = "tx2"; + final TransactionIdentifier transactionID2 = nextTransactionId(); doReturn(Futures.immediateFuture(Boolean.TRUE)).when(cohort).canCommit(); doReturn(Futures.immediateFuture(null)).when(cohort).preCommit(); doReturn(Futures.immediateFuture(null)).when(cohort).commit(); @@ -1606,7 +1608,7 @@ public class ShardTest extends AbstractShardTest { final FiniteDuration duration = duration("5 seconds"); final ShardDataTree dataStore = shard.underlyingActor().getDataStore(); - final String transactionID = "tx1"; + final TransactionIdentifier transactionID = nextTransactionId(); final Function> preCommit = cohort -> { final ListenableFuture preCommitFuture = cohort.preCommit(); @@ -1675,7 +1677,7 @@ public class ShardTest extends AbstractShardTest { // Create 1st Tx - will timeout - final String transactionID1 = "tx1"; + final TransactionIdentifier transactionID1 = nextTransactionId(); final MutableCompositeModification modification1 = new MutableCompositeModification(); final ShardDataTreeCohort cohort1 = setupMockWriteTransaction("cohort1", dataStore, YangInstanceIdentifier.builder(TestModel.OUTER_LIST_PATH) @@ -1685,7 +1687,7 @@ public class ShardTest extends AbstractShardTest { // Create 2nd Tx - final String transactionID2 = "tx3"; + final TransactionIdentifier transactionID2 = nextTransactionId(); final MutableCompositeModification modification2 = new MutableCompositeModification(); final YangInstanceIdentifier listNodePath = YangInstanceIdentifier.builder(TestModel.OUTER_LIST_PATH) .nodeWithKey(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, 2).build(); @@ -1742,19 +1744,19 @@ public class ShardTest extends AbstractShardTest { final ShardDataTree dataStore = shard.underlyingActor().getDataStore(); - final String transactionID1 = "tx1"; + final TransactionIdentifier transactionID1 = nextTransactionId(); final MutableCompositeModification modification1 = new MutableCompositeModification(); final ShardDataTreeCohort cohort1 = setupMockWriteTransaction("cohort1", dataStore, TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME), modification1); - final String transactionID2 = "tx2"; + final TransactionIdentifier transactionID2 = nextTransactionId(); final MutableCompositeModification modification2 = new MutableCompositeModification(); final ShardDataTreeCohort cohort2 = setupMockWriteTransaction("cohort2", dataStore, TestModel.OUTER_LIST_PATH, ImmutableNodes.mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build(), modification2); - final String transactionID3 = "tx3"; + final TransactionIdentifier transactionID3 = nextTransactionId(); final MutableCompositeModification modification3 = new MutableCompositeModification(); final ShardDataTreeCohort cohort3 = setupMockWriteTransaction("cohort3", dataStore, TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME), modification3); @@ -1803,7 +1805,7 @@ public class ShardTest extends AbstractShardTest { final ShardDataTree dataStore = shard.underlyingActor().getDataStore(); - final String transactionID1 = "tx1"; + final TransactionIdentifier transactionID1 = nextTransactionId(); final MutableCompositeModification modification1 = new MutableCompositeModification(); final ShardDataTreeCohort cohort1 = setupMockWriteTransaction("cohort1", dataStore, TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME), modification1); @@ -1811,7 +1813,7 @@ public class ShardTest extends AbstractShardTest { shard.tell(prepareReadyTransactionMessage(false, shard.underlyingActor(), cohort1, transactionID1, modification1), getRef()); expectMsgClass(duration, ReadyTransactionReply.class); - final String transactionID2 = "tx2"; + final TransactionIdentifier transactionID2 = nextTransactionId(); final MutableCompositeModification modification2 = new MutableCompositeModification(); final ShardDataTreeCohort cohort2 = setupMockWriteTransaction("cohort2", dataStore, TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME), modification2); @@ -1819,7 +1821,7 @@ public class ShardTest extends AbstractShardTest { shard.tell(prepareReadyTransactionMessage(false, shard.underlyingActor(), cohort2, transactionID2, modification2), getRef()); expectMsgClass(duration, ReadyTransactionReply.class); - final String transactionID3 = "tx3"; + final TransactionIdentifier transactionID3 = nextTransactionId(); final MutableCompositeModification modification3 = new MutableCompositeModification(); final ShardDataTreeCohort cohort3 = setupMockWriteTransaction("cohort3", dataStore, TestModel.TEST2_PATH, ImmutableNodes.containerNode(TestModel.TEST2_QNAME), modification3); @@ -1850,7 +1852,7 @@ public class ShardTest extends AbstractShardTest { final ShardDataTree dataStore = shard.underlyingActor().getDataStore(); - final String transactionID1 = "tx1"; + final TransactionIdentifier transactionID1 = nextTransactionId(); final MutableCompositeModification modification1 = new MutableCompositeModification(); final ShardDataTreeCohort cohort1 = setupMockWriteTransaction("cohort1", dataStore, TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME), modification1); @@ -1865,7 +1867,7 @@ public class ShardTest extends AbstractShardTest { // Ready the second Tx. - final String transactionID2 = "tx2"; + final TransactionIdentifier transactionID2 = nextTransactionId(); final MutableCompositeModification modification2 = new MutableCompositeModification(); final ShardDataTreeCohort cohort2 = setupMockWriteTransaction("cohort2", dataStore, TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME), modification2); @@ -1875,7 +1877,7 @@ public class ShardTest extends AbstractShardTest { // Ready the third Tx. - final String transactionID3 = "tx3"; + final TransactionIdentifier transactionID3 = nextTransactionId(); final DataTreeModification modification3 = dataStore.newModification(); new WriteModification(TestModel.TEST2_PATH, ImmutableNodes.containerNode(TestModel.TEST2_QNAME)) .apply(modification3); @@ -1906,7 +1908,7 @@ public class ShardTest extends AbstractShardTest { newShardProps().withDispatcher(Dispatchers.DefaultDispatcherId()), "testCanCommitBeforeReadyFailure"); - shard.tell(new CanCommitTransaction("tx", CURRENT_VERSION).toSerializable(), getRef()); + shard.tell(new CanCommitTransaction(nextTransactionId(), CURRENT_VERSION).toSerializable(), getRef()); expectMsgClass(duration("5 seconds"), akka.actor.Status.Failure.class); }}; } @@ -1927,13 +1929,13 @@ public class ShardTest extends AbstractShardTest { // Setup 2 simulated transactions with mock cohorts. The first one will be aborted. - final String transactionID1 = "tx1"; + final TransactionIdentifier transactionID1 = nextTransactionId(); final MutableCompositeModification modification1 = new MutableCompositeModification(); final ShardDataTreeCohort cohort1 = mock(ShardDataTreeCohort.class, "cohort1"); doReturn(Futures.immediateFuture(Boolean.TRUE)).when(cohort1).canCommit(); doReturn(Futures.immediateFuture(null)).when(cohort1).abort(); - final String transactionID2 = "tx2"; + final TransactionIdentifier transactionID2 = nextTransactionId(); final MutableCompositeModification modification2 = new MutableCompositeModification(); final ShardDataTreeCohort cohort2 = mock(ShardDataTreeCohort.class, "cohort2"); doReturn(Futures.immediateFuture(Boolean.TRUE)).when(cohort2).canCommit(); @@ -2005,8 +2007,7 @@ public class ShardTest extends AbstractShardTest { waitUntilLeader(shard); - final String transactionID = "tx1"; - + final TransactionIdentifier transactionID = nextTransactionId(); final MutableCompositeModification modification = new MutableCompositeModification(); final ShardDataTreeCohort cohort = mock(ShardDataTreeCohort.class, "cohort"); doReturn(Futures.immediateFuture(null)).when(cohort).abort(); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionFailureTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionFailureTest.java index cc15e1a0e2..de832c0b60 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionFailureTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionFailureTest.java @@ -59,7 +59,7 @@ public class ShardTransactionFailureTest extends AbstractActorTest { public void testNegativeReadWithReadOnlyTransactionClosed() throws Throwable { final ActorRef shard = createShard(); - final Props props = ShardTransaction.props(RO, store.newReadOnlyTransaction("test-txn", null), shard, + final Props props = ShardTransaction.props(RO, store.newReadOnlyTransaction(nextTransactionId()), shard, datastoreContext, shardStats); final TestActorRef subject = TestActorRef.create(getSystem(), props, @@ -81,7 +81,7 @@ public class ShardTransactionFailureTest extends AbstractActorTest { public void testNegativeReadWithReadWriteTransactionClosed() throws Throwable { final ActorRef shard = createShard(); - final Props props = ShardTransaction.props(RW, store.newReadWriteTransaction("test-txn", null), shard, + final Props props = ShardTransaction.props(RW, store.newReadWriteTransaction(nextTransactionId()), shard, datastoreContext, shardStats); final TestActorRef subject = TestActorRef.create(getSystem(), props, @@ -102,7 +102,7 @@ public class ShardTransactionFailureTest extends AbstractActorTest { public void testNegativeExistsWithReadWriteTransactionClosed() throws Throwable { final ActorRef shard = createShard(); - final Props props = ShardTransaction.props(RW, store.newReadWriteTransaction("test-txn", null), shard, + final Props props = ShardTransaction.props(RW, store.newReadWriteTransaction(nextTransactionId()), shard, datastoreContext, shardStats); final TestActorRef subject = TestActorRef.create(getSystem(), props, diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java index a02220d7b5..0cb9046a65 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java @@ -24,7 +24,7 @@ import org.junit.Ignore; import org.junit.Test; import org.mockito.InOrder; import org.mockito.Mockito; -import org.opendaylight.controller.cluster.access.concepts.MemberName; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.datastore.exceptions.UnknownMessageException; import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier; import org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard.ShardStats; @@ -62,7 +62,8 @@ public class ShardTransactionTest extends AbstractActorTest { private static final TransactionType WO = TransactionType.WRITE_ONLY; private static final ShardIdentifier SHARD_IDENTIFIER = - ShardIdentifier.create("inventory", MemberName.forName("member-1"), "config"); + ShardIdentifier.create("inventory", MEMBER_NAME, "config"); + private DatastoreContext datastoreContext = DatastoreContext.newBuilder().build(); @@ -70,8 +71,6 @@ public class ShardTransactionTest extends AbstractActorTest { private final ShardDataTree store = new ShardDataTree(testSchemaContext, TreeType.OPERATIONAL); - private int txCounter = 0; - private ActorRef createShard() { ActorRef shard = getSystem().actorOf(Shard.builder().id(SHARD_IDENTIFIER).datastoreContext(datastoreContext). schemaContext(TestModel.createTestContext()).props()); @@ -90,11 +89,11 @@ public class ShardTransactionTest extends AbstractActorTest { } private ReadOnlyShardDataTreeTransaction readOnlyTransaction() { - return store.newReadOnlyTransaction("test-ro-" + String.valueOf(txCounter++), null); + return store.newReadOnlyTransaction(nextTransactionId()); } private ReadWriteShardDataTreeTransaction readWriteTransaction() { - return store.newReadWriteTransaction("test-rw-" + String.valueOf(txCounter++), null); + return store.newReadWriteTransaction(nextTransactionId()); } @Test @@ -187,7 +186,8 @@ public class ShardTransactionTest extends AbstractActorTest { ShardDataTreeTransactionParent parent = Mockito.mock(ShardDataTreeTransactionParent.class); DataTreeModification mockModification = Mockito.mock(DataTreeModification.class); - ReadWriteShardDataTreeTransaction mockWriteTx = new ReadWriteShardDataTreeTransaction(parent, "id", mockModification); + ReadWriteShardDataTreeTransaction mockWriteTx = new ReadWriteShardDataTreeTransaction(parent, + nextTransactionId(), mockModification); final ActorRef transaction = newTransactionActor(RW, mockWriteTx, "testOnReceiveBatchedModifications"); YangInstanceIdentifier writePath = TestModel.TEST_PATH; @@ -201,7 +201,7 @@ public class ShardTransactionTest extends AbstractActorTest { YangInstanceIdentifier deletePath = TestModel.TEST_PATH; - BatchedModifications batched = new BatchedModifications("tx1", DataStoreVersions.CURRENT_VERSION, null); + BatchedModifications batched = new BatchedModifications(nextTransactionId(), DataStoreVersions.CURRENT_VERSION); batched.addModification(new WriteModification(writePath, writeData)); batched.addModification(new MergeModification(mergePath, mergeData)); batched.addModification(new DeleteModification(deletePath)); @@ -233,14 +233,15 @@ public class ShardTransactionTest extends AbstractActorTest { new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME)). withChild(ImmutableNodes.leafNode(TestModel.DESC_QNAME, "foo")).build(); - BatchedModifications batched = new BatchedModifications("tx1", DataStoreVersions.CURRENT_VERSION, null); + final TransactionIdentifier tx1 = nextTransactionId(); + BatchedModifications batched = new BatchedModifications(tx1, DataStoreVersions.CURRENT_VERSION); batched.addModification(new WriteModification(writePath, writeData)); transaction.tell(batched, getRef()); BatchedModificationsReply reply = expectMsgClass(duration("5 seconds"), BatchedModificationsReply.class); assertEquals("getNumBatched", 1, reply.getNumBatched()); - batched = new BatchedModifications("tx1", DataStoreVersions.CURRENT_VERSION, null); + batched = new BatchedModifications(tx1, DataStoreVersions.CURRENT_VERSION); batched.setReady(true); batched.setTotalMessagesSent(2); @@ -265,7 +266,7 @@ public class ShardTransactionTest extends AbstractActorTest { new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME)). withChild(ImmutableNodes.leafNode(TestModel.DESC_QNAME, "foo")).build(); - BatchedModifications batched = new BatchedModifications("tx1", DataStoreVersions.CURRENT_VERSION, null); + BatchedModifications batched = new BatchedModifications(nextTransactionId(), DataStoreVersions.CURRENT_VERSION); batched.addModification(new WriteModification(writePath, writeData)); batched.setReady(true); batched.setDoCommitOnReady(true); @@ -283,7 +284,8 @@ public class ShardTransactionTest extends AbstractActorTest { ShardDataTreeTransactionParent parent = Mockito.mock(ShardDataTreeTransactionParent.class); DataTreeModification mockModification = Mockito.mock(DataTreeModification.class); - ReadWriteShardDataTreeTransaction mockWriteTx = new ReadWriteShardDataTreeTransaction(parent, "id", mockModification); + ReadWriteShardDataTreeTransaction mockWriteTx = new ReadWriteShardDataTreeTransaction(parent, + nextTransactionId(), mockModification); final ActorRef transaction = newTransactionActor(RW, mockWriteTx, "testOnReceiveBatchedModificationsFailure"); @@ -295,13 +297,14 @@ public class ShardTransactionTest extends AbstractActorTest { doThrow(new TestException()).when(mockModification).write(path, node); - BatchedModifications batched = new BatchedModifications("tx1", DataStoreVersions.CURRENT_VERSION, null); + final TransactionIdentifier tx1 = nextTransactionId(); + BatchedModifications batched = new BatchedModifications(tx1, DataStoreVersions.CURRENT_VERSION); batched.addModification(new WriteModification(path, node)); transaction.tell(batched, getRef()); expectMsgClass(duration("5 seconds"), akka.actor.Status.Failure.class); - batched = new BatchedModifications("tx1", DataStoreVersions.CURRENT_VERSION, null); + batched = new BatchedModifications(tx1, DataStoreVersions.CURRENT_VERSION); batched.setReady(true); batched.setTotalMessagesSent(2); @@ -325,7 +328,7 @@ public class ShardTransactionTest extends AbstractActorTest { JavaTestKit watcher = new JavaTestKit(getSystem()); watcher.watch(transaction); - BatchedModifications batched = new BatchedModifications("tx1", DataStoreVersions.CURRENT_VERSION, null); + BatchedModifications batched = new BatchedModifications(nextTransactionId(), DataStoreVersions.CURRENT_VERSION); batched.setReady(true); batched.setTotalMessagesSent(2); @@ -422,7 +425,7 @@ public class ShardTransactionTest extends AbstractActorTest { datastoreContext, shardStats); final TestActorRef transaction = TestActorRef.apply(props,getSystem()); - transaction.receive(new BatchedModifications("tx1", DataStoreVersions.CURRENT_VERSION, null), + transaction.receive(new BatchedModifications(nextTransactionId(), DataStoreVersions.CURRENT_VERSION), ActorRef.noSender()); } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/SimpleShardDataTreeCohortTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/SimpleShardDataTreeCohortTest.java index 700f0c5eee..657d7b3e83 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/SimpleShardDataTreeCohortTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/SimpleShardDataTreeCohortTest.java @@ -36,7 +36,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.TipProducingDataTree * * @author Thomas Pantelis */ -public class SimpleShardDataTreeCohortTest { +public class SimpleShardDataTreeCohortTest extends AbstractTest { @Mock private TipProducingDataTree mockDataTree; @@ -54,7 +54,7 @@ public class SimpleShardDataTreeCohortTest { doReturn(mockDataTree).when(mockShardDataTree).getDataTree(); - cohort = new SimpleShardDataTreeCohort(mockShardDataTree, mockModification, "tx"); + cohort = new SimpleShardDataTreeCohort(mockShardDataTree, mockModification, nextTransactionId()); } @Test diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxyTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxyTest.java index 5a87be3d32..54a6f1ce23 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxyTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxyTest.java @@ -21,6 +21,7 @@ import akka.dispatch.Futures; import akka.testkit.TestActorRef; import com.codahale.metrics.Snapshot; import com.codahale.metrics.Timer; +import com.google.common.base.Preconditions; import com.google.common.base.Supplier; import com.google.common.util.concurrent.ListenableFuture; import java.util.ArrayList; @@ -34,6 +35,7 @@ import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.datastore.ThreePhaseCommitCohortProxy.CohortInfo; import org.opendaylight.controller.cluster.datastore.messages.AbortTransaction; import org.opendaylight.controller.cluster.datastore.messages.AbortTransactionReply; @@ -68,6 +70,8 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { private final TestActorFactory actorFactory = new TestActorFactory(getSystem()); private final List> cohortActors = new ArrayList<>(); + private final TransactionIdentifier tx = nextTransactionId(); + @Before public void setUp() { @@ -99,8 +103,8 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test public void testCanCommitYesWithOneCohort() throws Exception { ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, Arrays.asList( - newCohortInfo(new CohortActor.Builder("txn-1").expectCanCommit( - CanCommitTransactionReply.yes(CURRENT_VERSION)))), "txn-1"); + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit( + CanCommitTransactionReply.yes(CURRENT_VERSION)))), tx); verifyCanCommit(proxy.canCommit(), true); verifyCohortActors(); @@ -109,8 +113,8 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test public void testCanCommitNoWithOneCohort() throws Exception { ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, Arrays.asList( - newCohortInfo(new CohortActor.Builder("txn-1").expectCanCommit( - CanCommitTransactionReply.no(CURRENT_VERSION)))), "txn-1"); + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit( + CanCommitTransactionReply.no(CURRENT_VERSION)))), tx); verifyCanCommit(proxy.canCommit(), false); verifyCohortActors(); @@ -119,11 +123,11 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test public void testCanCommitYesWithTwoCohorts() throws Exception { List cohorts = Arrays.asList( - newCohortInfo(new CohortActor.Builder("txn-1").expectCanCommit( + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit( CanCommitTransactionReply.yes(CURRENT_VERSION))), - newCohortInfo(new CohortActor.Builder("txn-1").expectCanCommit( + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit( CanCommitTransactionReply.yes(CURRENT_VERSION)))); - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, "txn-1"); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, tx); verifyCanCommit(proxy.canCommit(), true); verifyCohortActors(); @@ -132,12 +136,12 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test public void testCanCommitNoWithThreeCohorts() throws Exception { List cohorts = Arrays.asList( - newCohortInfo(new CohortActor.Builder("txn-1").expectCanCommit( + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit( CanCommitTransactionReply.yes(CURRENT_VERSION))), - newCohortInfo(new CohortActor.Builder("txn-1").expectCanCommit( + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit( CanCommitTransactionReply.no(CURRENT_VERSION))), - newCohortInfo(new CohortActor.Builder("txn-1"))); - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, "txn-1"); + newCohortInfo(new CohortActor.Builder(tx))); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, tx); verifyCanCommit(proxy.canCommit(), false); verifyCohortActors(); @@ -146,7 +150,7 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test(expected = TestException.class) public void testCanCommitWithExceptionFailure() throws Throwable { ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, Arrays.asList( - newCohortInfo(new CohortActor.Builder("txn-1").expectCanCommit(new TestException()))), "txn-1"); + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit(new TestException()))), tx); propagateExecutionExceptionCause(proxy.canCommit()); } @@ -154,7 +158,7 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test(expected = IllegalArgumentException.class) public void testCanCommitWithInvalidResponseType() throws Throwable { ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, Arrays.asList( - newCohortInfo(new CohortActor.Builder("txn-1").expectCanCommit("invalid"))), "txn-1"); + newCohortInfo(new CohortActor.Builder(tx).expectCanCommit("invalid"))), tx); propagateExecutionExceptionCause(proxy.canCommit()); } @@ -162,10 +166,10 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test(expected = TestException.class) public void testCanCommitWithFailedCohortFuture() throws Throwable { List cohorts = Arrays.asList( - newCohortInfo(new CohortActor.Builder("txn-1")), + newCohortInfo(new CohortActor.Builder(tx)), newCohortInfoWithFailedFuture(new TestException()), - newCohortInfo(new CohortActor.Builder("txn-1"))); - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, "txn-1"); + newCohortInfo(new CohortActor.Builder(tx))); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, tx); propagateExecutionExceptionCause(proxy.canCommit()); } @@ -173,13 +177,13 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test public void testAllThreePhasesSuccessful() throws Exception { List cohorts = Arrays.asList( - newCohortInfo(new CohortActor.Builder("txn-1"). + newCohortInfo(new CohortActor.Builder(tx). expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)). expectCommit(CommitTransactionReply.instance(CURRENT_VERSION))), - newCohortInfo(new CohortActor.Builder("txn-1"). + newCohortInfo(new CohortActor.Builder(tx). expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)). expectCommit(CommitTransactionReply.instance(CURRENT_VERSION)))); - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, "txn-1"); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, tx); verifyCanCommit(proxy.canCommit(), true); verifySuccessfulFuture(proxy.preCommit()); @@ -190,13 +194,13 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test(expected = TestException.class) public void testCommitWithExceptionFailure() throws Throwable { List cohorts = Arrays.asList( - newCohortInfo(new CohortActor.Builder("txn-1"). + newCohortInfo(new CohortActor.Builder(tx). expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)). expectCommit(CommitTransactionReply.instance(CURRENT_VERSION))), - newCohortInfo(new CohortActor.Builder("txn-1"). + newCohortInfo(new CohortActor.Builder(tx). expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)). expectCommit(new TestException()))); - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, "txn-1"); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, tx); verifyCanCommit(proxy.canCommit(), true); verifySuccessfulFuture(proxy.preCommit()); @@ -206,9 +210,9 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test(expected = IllegalArgumentException.class) public void testCommitWithInvalidResponseType() throws Throwable { ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, Arrays.asList( - newCohortInfo(new CohortActor.Builder("txn-1"). + newCohortInfo(new CohortActor.Builder(tx). expectCanCommit(CanCommitTransactionReply.yes(CURRENT_VERSION)). - expectCommit("invalid"))), "txn-1"); + expectCommit("invalid"))), tx); verifyCanCommit(proxy.canCommit(), true); verifySuccessfulFuture(proxy.preCommit()); @@ -218,8 +222,8 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test public void testAbort() throws Exception { ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, Arrays.asList( - newCohortInfo(new CohortActor.Builder("txn-1").expectAbort( - AbortTransactionReply.instance(CURRENT_VERSION)))), "txn-1"); + newCohortInfo(new CohortActor.Builder(tx).expectAbort( + AbortTransactionReply.instance(CURRENT_VERSION)))), tx); verifySuccessfulFuture(proxy.abort()); verifyCohortActors(); @@ -228,7 +232,7 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test public void testAbortWithFailure() throws Exception { ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, Arrays.asList( - newCohortInfo(new CohortActor.Builder("txn-1").expectAbort(new RuntimeException("mock")))), "txn-1"); + newCohortInfo(new CohortActor.Builder(tx).expectAbort(new RuntimeException("mock")))), tx); // The exception should not get propagated. verifySuccessfulFuture(proxy.abort()); @@ -238,9 +242,8 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test public void testAbortWithFailedCohortFuture() throws Throwable { List cohorts = Arrays.asList( - newCohortInfoWithFailedFuture(new TestException()), - newCohortInfo(new CohortActor.Builder("txn-1"))); - ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, "txn-1"); + newCohortInfoWithFailedFuture(new TestException()), newCohortInfo(new CohortActor.Builder(tx))); + ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, cohorts, tx); verifySuccessfulFuture(proxy.abort()); verifyCohortActors(); @@ -249,7 +252,7 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { @Test public void testWithNoCohorts() throws Exception { ThreePhaseCommitCohortProxy proxy = new ThreePhaseCommitCohortProxy(actorContext, - Collections.emptyList(), "txn-1"); + Collections.emptyList(), tx); verifyCanCommit(proxy.canCommit(), true); verifySuccessfulFuture(proxy.preCommit()); @@ -385,10 +388,10 @@ public class ThreePhaseCommitCohortProxyTest extends AbstractActorTest { private Object canCommitReply; private Object commitReply; private Object abortReply; - private final String transactionId; + private final TransactionIdentifier transactionId; - Builder(String transactionId) { - this.transactionId = transactionId; + Builder(TransactionIdentifier transactionId) { + this.transactionId = Preconditions.checkNotNull(transactionId); } Builder expectCanCommit(Class expCanCommitType, Object canCommitReply) { diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/TransactionProxyTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/TransactionProxyTest.java index eb77ed2c23..2c36ca5cfa 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/TransactionProxyTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/TransactionProxyTest.java @@ -862,7 +862,7 @@ public class TransactionProxyTest extends AbstractTransactionProxyTest { ActorRef txActorRef = actorSystem.actorOf(Props.create(DoNothingActor.class)); String actorPath = txActorRef.path().toString(); - CreateTransactionReply createTransactionReply = new CreateTransactionReply(actorPath, "txn-1", + CreateTransactionReply createTransactionReply = new CreateTransactionReply(actorPath, nextTransactionId(), DataStoreVersions.CURRENT_VERSION); doReturn(actorSystem.actorSelection(actorPath)).when(mockActorContext).actorSelection(actorPath); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardTest.java index 26811444d8..3162981029 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardTest.java @@ -725,7 +725,7 @@ public class EntityOwnershipShardTest extends AbstractEntityOwnershipTest { } private static BatchedModifications newBatchedModifications() { - BatchedModifications modifications = new BatchedModifications("tnx", DataStoreVersions.CURRENT_VERSION, ""); + BatchedModifications modifications = new BatchedModifications(nextTransactionId(), DataStoreVersions.CURRENT_VERSION); modifications.setDoCommitOnReady(true); modifications.setReady(true); modifications.setTotalMessagesSent(1); @@ -848,6 +848,7 @@ public class EntityOwnershipShardTest extends AbstractEntityOwnershipTest { volatile boolean dropAppendEntries; private final String myId; + @SuppressWarnings("unused") public MockFollower(String myId) { this(myId, true); } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/AbortTransactionTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/AbortTransactionTest.java index 92fa6d04ae..2e298acc3f 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/AbortTransactionTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/AbortTransactionTest.java @@ -12,6 +12,7 @@ import java.io.Serializable; import org.apache.commons.lang.SerializationUtils; import org.junit.Test; import org.opendaylight.controller.cluster.datastore.DataStoreVersions; +import org.opendaylight.controller.cluster.datastore.MockIdentifiers; /** * Unit tests for AbortTransaction. @@ -22,7 +23,8 @@ public class AbortTransactionTest { @Test public void testSerialization() { - AbortTransaction expected = new AbortTransaction("txId", DataStoreVersions.CURRENT_VERSION); + AbortTransaction expected = new AbortTransaction( + MockIdentifiers.transactionIdentifier(AbortTransactionTest.class, "mock"), DataStoreVersions.CURRENT_VERSION); Object serialized = expected.toSerializable(); assertEquals("Serialized type", AbortTransaction.class, serialized.getClass()); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/BatchedModificationsTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/BatchedModificationsTest.java index 4a63666e7c..d4c6ea7280 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/BatchedModificationsTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/BatchedModificationsTest.java @@ -11,6 +11,8 @@ import static org.junit.Assert.assertEquals; import java.io.Serializable; import org.apache.commons.lang.SerializationUtils; import org.junit.Test; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; +import org.opendaylight.controller.cluster.datastore.AbstractTest; import org.opendaylight.controller.cluster.datastore.DataStoreVersions; import org.opendaylight.controller.cluster.datastore.modification.DeleteModification; import org.opendaylight.controller.cluster.datastore.modification.MergeModification; @@ -26,7 +28,7 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableCo * * @author Thomas Pantelis */ -public class BatchedModificationsTest { +public class BatchedModificationsTest extends AbstractTest { @Test public void testSerialization() { @@ -41,7 +43,8 @@ public class BatchedModificationsTest { YangInstanceIdentifier deletePath = TestModel.TEST_PATH; - BatchedModifications batched = new BatchedModifications("tx1", DataStoreVersions.CURRENT_VERSION, "txChain"); + final TransactionIdentifier tx1 = nextTransactionId(); + BatchedModifications batched = new BatchedModifications(tx1, DataStoreVersions.CURRENT_VERSION); batched.addModification(new WriteModification(writePath, writeData)); batched.addModification(new MergeModification(mergePath, mergeData)); batched.addModification(new DeleteModification(deletePath)); @@ -52,8 +55,7 @@ public class BatchedModificationsTest { (Serializable) batched.toSerializable()); assertEquals("getVersion", DataStoreVersions.CURRENT_VERSION, clone.getVersion()); - assertEquals("getTransactionID", "tx1", clone.getTransactionID()); - assertEquals("getTransactionChainID", "txChain", clone.getTransactionChainID()); + assertEquals("getTransactionID", tx1, clone.getTransactionID()); assertEquals("isReady", true, clone.isReady()); assertEquals("getTotalMessagesSent", 5, clone.getTotalMessagesSent()); @@ -74,14 +76,13 @@ public class BatchedModificationsTest { assertEquals("getPath", deletePath, delete.getPath()); // Test with different params. - - batched = new BatchedModifications("tx2", (short)10000, null); + final TransactionIdentifier tx2 = nextTransactionId(); + batched = new BatchedModifications(tx2, (short)10000); clone = (BatchedModifications) SerializationUtils.clone((Serializable) batched.toSerializable()); assertEquals("getVersion", DataStoreVersions.CURRENT_VERSION, clone.getVersion()); - assertEquals("getTransactionID", "tx2", clone.getTransactionID()); - assertEquals("getTransactionChainID", "", clone.getTransactionChainID()); + assertEquals("getTransactionID", tx2, clone.getTransactionID()); assertEquals("isReady", false, clone.isReady()); assertEquals("getModifications size", 0, clone.getModifications().size()); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CanCommitTransactionTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CanCommitTransactionTest.java index 1ee51b69d6..480ac5a9b6 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CanCommitTransactionTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CanCommitTransactionTest.java @@ -11,6 +11,7 @@ import static org.junit.Assert.assertEquals; import java.io.Serializable; import org.apache.commons.lang.SerializationUtils; import org.junit.Test; +import org.opendaylight.controller.cluster.datastore.AbstractTest; import org.opendaylight.controller.cluster.datastore.DataStoreVersions; /** @@ -18,11 +19,11 @@ import org.opendaylight.controller.cluster.datastore.DataStoreVersions; * * @author Thomas Pantelis */ -public class CanCommitTransactionTest { +public class CanCommitTransactionTest extends AbstractTest { @Test public void testSerialization() { - CanCommitTransaction expected = new CanCommitTransaction("txId", DataStoreVersions.CURRENT_VERSION); + CanCommitTransaction expected = new CanCommitTransaction(nextTransactionId(), DataStoreVersions.CURRENT_VERSION); Object serialized = expected.toSerializable(); assertEquals("Serialized type", CanCommitTransaction.class, serialized.getClass()); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransactionChainTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransactionChainTest.java index c4ff243de3..6ef0c887d8 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransactionChainTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CloseTransactionChainTest.java @@ -11,6 +11,7 @@ import static org.junit.Assert.assertEquals; import java.io.Serializable; import org.apache.commons.lang.SerializationUtils; import org.junit.Test; +import org.opendaylight.controller.cluster.datastore.AbstractTest; import org.opendaylight.controller.cluster.datastore.DataStoreVersions; /** @@ -18,11 +19,11 @@ import org.opendaylight.controller.cluster.datastore.DataStoreVersions; * * @author Thomas Pantelis */ -public class CloseTransactionChainTest { +public class CloseTransactionChainTest extends AbstractTest { @Test public void testSerialization() { - CloseTransactionChain expected = new CloseTransactionChain("txId", DataStoreVersions.CURRENT_VERSION); + CloseTransactionChain expected = new CloseTransactionChain(nextHistoryId(), DataStoreVersions.CURRENT_VERSION); Object serialized = expected.toSerializable(); assertEquals("Serialized type", CloseTransactionChain.class, serialized.getClass()); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CommitTransactionTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CommitTransactionTest.java index 43311a393e..23f22a3b27 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CommitTransactionTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CommitTransactionTest.java @@ -11,6 +11,7 @@ import static org.junit.Assert.assertEquals; import java.io.Serializable; import org.apache.commons.lang.SerializationUtils; import org.junit.Test; +import org.opendaylight.controller.cluster.datastore.AbstractTest; import org.opendaylight.controller.cluster.datastore.DataStoreVersions; /** @@ -18,11 +19,11 @@ import org.opendaylight.controller.cluster.datastore.DataStoreVersions; * * @author Thomas Pantelis */ -public class CommitTransactionTest { +public class CommitTransactionTest extends AbstractTest { @Test public void testSerialization() { - CommitTransaction expected = new CommitTransaction("txId", DataStoreVersions.CURRENT_VERSION); + CommitTransaction expected = new CommitTransaction(nextTransactionId(), DataStoreVersions.CURRENT_VERSION); Object serialized = expected.toSerializable(); assertEquals("Serialized type", CommitTransaction.class, serialized.getClass()); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionReplyTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionReplyTest.java index b8edbd94f4..301167f460 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionReplyTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionReplyTest.java @@ -11,6 +11,7 @@ import static org.junit.Assert.assertEquals; import java.io.Serializable; import org.apache.commons.lang.SerializationUtils; import org.junit.Test; +import org.opendaylight.controller.cluster.datastore.AbstractTest; import org.opendaylight.controller.cluster.datastore.DataStoreVersions; /** @@ -18,11 +19,11 @@ import org.opendaylight.controller.cluster.datastore.DataStoreVersions; * * @author Thomas Pantelis */ -public class CreateTransactionReplyTest { +public class CreateTransactionReplyTest extends AbstractTest { @Test public void testSerialization() { - CreateTransactionReply expected = new CreateTransactionReply("txPath", "txId", DataStoreVersions.CURRENT_VERSION); + CreateTransactionReply expected = new CreateTransactionReply("txPath", nextTransactionId(), DataStoreVersions.CURRENT_VERSION); Object serialized = expected.toSerializable(); assertEquals("Serialized type", CreateTransactionReply.class, serialized.getClass()); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionTest.java index a558b75ce4..f1b6db84a4 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/CreateTransactionTest.java @@ -11,6 +11,7 @@ import static org.junit.Assert.assertEquals; import java.io.Serializable; import org.apache.commons.lang.SerializationUtils; import org.junit.Test; +import org.opendaylight.controller.cluster.datastore.AbstractTest; import org.opendaylight.controller.cluster.datastore.DataStoreVersions; /** @@ -18,11 +19,11 @@ import org.opendaylight.controller.cluster.datastore.DataStoreVersions; * * @author Thomas Pantelis */ -public class CreateTransactionTest { +public class CreateTransactionTest extends AbstractTest { @Test public void testSerialization() { - CreateTransaction expected = new CreateTransaction("txId", 2, "chainId", DataStoreVersions.CURRENT_VERSION); + CreateTransaction expected = new CreateTransaction(nextTransactionId(), 2, DataStoreVersions.CURRENT_VERSION); Object serialized = expected.toSerializable(); assertEquals("Serialized type", CreateTransaction.class, serialized.getClass()); @@ -31,14 +32,13 @@ public class CreateTransactionTest { SerializationUtils.clone((Serializable) serialized)); assertEquals("getTransactionId", expected.getTransactionId(), actual.getTransactionId()); assertEquals("getTransactionType", expected.getTransactionType(), actual.getTransactionType()); - assertEquals("getTransactionChainId", expected.getTransactionChainId(), actual.getTransactionChainId()); assertEquals("getVersion", DataStoreVersions.CURRENT_VERSION, actual.getVersion()); } @Test public void testSerializationWithNewerVersion() { short newerVersion = DataStoreVersions.CURRENT_VERSION + (short)1; - CreateTransaction expected = new CreateTransaction("txId", 2, "chainId", newerVersion); + CreateTransaction expected = new CreateTransaction(nextTransactionId(), 2, newerVersion); Object serialized = expected.toSerializable(); assertEquals("Serialized type", CreateTransaction.class, serialized.getClass()); @@ -47,7 +47,6 @@ public class CreateTransactionTest { SerializationUtils.clone((Serializable) serialized)); assertEquals("getTransactionId", expected.getTransactionId(), actual.getTransactionId()); assertEquals("getTransactionType", expected.getTransactionType(), actual.getTransactionType()); - assertEquals("getTransactionChainId", expected.getTransactionChainId(), actual.getTransactionChainId()); assertEquals("getVersion", DataStoreVersions.CURRENT_VERSION, actual.getVersion()); } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/ReadyLocalTransactionSerializerTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/ReadyLocalTransactionSerializerTest.java index 90191f8771..53bc120eef 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/ReadyLocalTransactionSerializerTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/messages/ReadyLocalTransactionSerializerTest.java @@ -11,6 +11,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.util.List; import org.junit.Test; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; +import org.opendaylight.controller.cluster.datastore.AbstractTest; import org.opendaylight.controller.cluster.datastore.DataStoreVersions; import org.opendaylight.controller.cluster.datastore.modification.MergeModification; import org.opendaylight.controller.cluster.datastore.modification.Modification; @@ -29,7 +31,7 @@ import org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeFac * * @author Thomas Pantelis */ -public class ReadyLocalTransactionSerializerTest { +public class ReadyLocalTransactionSerializerTest extends AbstractTest { @Test public void testToAndFromBinary() { @@ -42,7 +44,7 @@ public class ReadyLocalTransactionSerializerTest { MapNode mergeData = ImmutableNodes.mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build(); new MergeModification(TestModel.OUTER_LIST_PATH, mergeData).apply(modification); - String txId = "tx-id"; + TransactionIdentifier txId = nextTransactionId(); ReadyLocalTransaction readyMessage = new ReadyLocalTransaction(txId, modification, true); ReadyLocalTransactionSerializer serializer = new ReadyLocalTransactionSerializer(); -- 2.36.6