X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Fcompat%2FPreLithiumTransactionContextImpl.java;h=ccfb32969287291b941861ecaefe1c1f25df5613;hp=e407c7cc4767fe93e159b65e4d7cec9ef5edce2b;hb=00cc355c0c58e999ffebd531bca3a507e150e441;hpb=3e77d4e181b0024936084e10d55ae0d7f285b5ad diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/compat/PreLithiumTransactionContextImpl.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/compat/PreLithiumTransactionContextImpl.java index e407c7cc47..ccfb329692 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/compat/PreLithiumTransactionContextImpl.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/compat/PreLithiumTransactionContextImpl.java @@ -8,16 +8,21 @@ package org.opendaylight.controller.cluster.datastore.compat; import akka.actor.ActorSelection; +import org.opendaylight.controller.cluster.datastore.DataStoreVersions; import org.opendaylight.controller.cluster.datastore.OperationCompleter; import org.opendaylight.controller.cluster.datastore.TransactionContextImpl; import org.opendaylight.controller.cluster.datastore.identifiers.TransactionIdentifier; import org.opendaylight.controller.cluster.datastore.messages.DeleteData; import org.opendaylight.controller.cluster.datastore.messages.MergeData; +import org.opendaylight.controller.cluster.datastore.messages.ReadyTransaction; import org.opendaylight.controller.cluster.datastore.messages.WriteData; import org.opendaylight.controller.cluster.datastore.utils.ActorContext; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import scala.concurrent.Future; /** * Implementation of TransactionContextImpl used when talking to a pre-Lithium controller that doesn't @@ -26,12 +31,16 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext; * @author Thomas Pantelis */ public class PreLithiumTransactionContextImpl extends TransactionContextImpl { + private static final Logger LOG = LoggerFactory.getLogger(PreLithiumTransactionContextImpl.class); + + private final String transactionPath; public PreLithiumTransactionContextImpl(String transactionPath, ActorSelection actor, TransactionIdentifier identifier, - ActorContext actorContext, SchemaContext schemaContext, boolean isTxActorLocal, + String transactionChainId, ActorContext actorContext, SchemaContext schemaContext, boolean isTxActorLocal, short remoteTransactionVersion, OperationCompleter operationCompleter) { - super(transactionPath, actor, identifier, actorContext, schemaContext, isTxActorLocal, - remoteTransactionVersion, operationCompleter); + super(actor, identifier, transactionChainId, actorContext, schemaContext, isTxActorLocal, + remoteTransactionVersion, operationCompleter); + this.transactionPath = transactionPath; } @Override @@ -51,4 +60,32 @@ public class PreLithiumTransactionContextImpl extends TransactionContextImpl { recordedOperationFutures.add(executeOperationAsync( new WriteData(path, data, getRemoteTransactionVersion()))); } + + @Override + public Future readyTransaction() { + LOG.debug("Tx {} readyTransaction called with {} previous recorded operations pending", + identifier, recordedOperationFutures.size()); + + // Send the ReadyTransaction message to the Tx actor. + + Future lastReplyFuture = executeOperationAsync(ReadyTransaction.INSTANCE); + + return combineRecordedOperationsFutures(lastReplyFuture); + } + + @Override + protected String deserializeCohortPath(String cohortPath) { + // In base Helium we used to return the local path of the actor which represented + // a remote ThreePhaseCommitCohort. The local path would then be converted to + // a remote path using this resolvePath method. To maintain compatibility with + // a Helium node we need to continue to do this conversion. + // At some point in the future when upgrades from Helium are not supported + // we could remove this code to resolvePath and just use the cohortPath as the + // resolved cohortPath + if(getRemoteTransactionVersion() < DataStoreVersions.HELIUM_1_VERSION) { + return getActorContext().resolvePath(transactionPath, cohortPath); + } + + return cohortPath; + } }