X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Fcompat%2FPreLithiumTransactionContextImpl.java;h=2634adaf4cc97b225860cdd5a61c6b5124052bf8;hb=196fbf9b716ea26740195fd397c1b2550f656638;hp=e407c7cc4767fe93e159b65e4d7cec9ef5edce2b;hpb=12d62e4939a27a3deba065bce79274c9eaf69964;p=controller.git 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..2634adaf4c 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,25 @@ package org.opendaylight.controller.cluster.datastore.compat; import akka.actor.ActorSelection; -import org.opendaylight.controller.cluster.datastore.OperationCompleter; -import org.opendaylight.controller.cluster.datastore.TransactionContextImpl; +import org.opendaylight.controller.cluster.datastore.DataStoreVersions; +import org.opendaylight.controller.cluster.datastore.OperationLimiter; +import org.opendaylight.controller.cluster.datastore.RemoteTransactionContext; 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.VersionedExternalizableMessage; import org.opendaylight.controller.cluster.datastore.messages.WriteData; +import org.opendaylight.controller.cluster.datastore.modification.AbstractModification; +import org.opendaylight.controller.cluster.datastore.modification.DeleteModification; +import org.opendaylight.controller.cluster.datastore.modification.MergeModification; +import org.opendaylight.controller.cluster.datastore.modification.WriteModification; 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 @@ -25,30 +34,79 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext; * * @author Thomas Pantelis */ -public class PreLithiumTransactionContextImpl extends TransactionContextImpl { +@Deprecated +public class PreLithiumTransactionContextImpl extends RemoteTransactionContext { + private static final Logger LOG = LoggerFactory.getLogger(PreLithiumTransactionContextImpl.class); - public PreLithiumTransactionContextImpl(String transactionPath, ActorSelection actor, TransactionIdentifier identifier, - ActorContext actorContext, SchemaContext schemaContext, boolean isTxActorLocal, - short remoteTransactionVersion, OperationCompleter operationCompleter) { - super(transactionPath, actor, identifier, actorContext, schemaContext, isTxActorLocal, - remoteTransactionVersion, operationCompleter); + private final String transactionPath; + + public PreLithiumTransactionContextImpl(TransactionIdentifier identifier, String transactionPath, ActorSelection actor, + ActorContext actorContext, boolean isTxActorLocal, + short remoteTransactionVersion, OperationLimiter limiter) { + super(identifier, actor, actorContext, isTxActorLocal, remoteTransactionVersion, limiter); + this.transactionPath = transactionPath; + } + + @Override + public void executeModification(AbstractModification modification) { + final short remoteTransactionVersion = getRemoteTransactionVersion(); + final YangInstanceIdentifier path = modification.getPath(); + VersionedExternalizableMessage msg = null; + + if(modification instanceof DeleteModification) { + msg = new DeleteData(path, remoteTransactionVersion); + } else if(modification instanceof WriteModification) { + final NormalizedNode data = ((WriteModification) modification).getData(); + + // be sure to check for Merge before Write, since Merge is a subclass of Write + if(modification instanceof MergeModification) { + msg = new MergeData(path, data, remoteTransactionVersion); + } else { + msg = new WriteData(path, data, remoteTransactionVersion); + } + } else { + LOG.error("Invalid modification type " + modification.getClass().getName()); + } + + if(msg != null) { + executeOperationAsync(msg); + } + } + + @Override + public Future readyTransaction() { + LOG.debug("Tx {} readyTransaction called", getIdentifier()); + + // Send the ReadyTransaction message to the Tx actor. + + Future lastReplyFuture = executeOperationAsync(ReadyTransaction.INSTANCE); + + return transformReadyReply(lastReplyFuture); } @Override - public void deleteData(YangInstanceIdentifier path) { - recordedOperationFutures.add(executeOperationAsync( - new DeleteData(path, getRemoteTransactionVersion()))); + protected Future transformReadyReply(final Future readyReplyFuture) { + // 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 PreLithiumTransactionReadyReplyMapper.transform(readyReplyFuture, getActorContext(), getIdentifier(), transactionPath); + } else { + return super.transformReadyReply(readyReplyFuture); + } } @Override - public void mergeData(YangInstanceIdentifier path, NormalizedNode data) { - recordedOperationFutures.add(executeOperationAsync( - new MergeData(path, data, getRemoteTransactionVersion()))); + public boolean supportsDirectCommit() { + return false; } @Override - public void writeData(YangInstanceIdentifier path, NormalizedNode data) { - recordedOperationFutures.add(executeOperationAsync( - new WriteData(path, data, getRemoteTransactionVersion()))); + public Future directCommit() { + throw new UnsupportedOperationException("directCommit is not supported for " + getClass()); } }