*/
package org.opendaylight.controller.cluster.datastore;
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
import akka.actor.ActorSelection;
-import com.google.common.base.Preconditions;
-import org.opendaylight.controller.cluster.datastore.identifiers.TransactionIdentifier;
-import org.opendaylight.controller.sal.core.spi.data.AbstractSnapshotBackedTransactionChain;
-import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadTransaction;
-import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadWriteTransaction;
-import org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort;
-import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction;
-import org.opendaylight.controller.sal.core.spi.data.SnapshotBackedWriteTransaction;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
+import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
+import org.opendaylight.mdsal.dom.spi.store.AbstractSnapshotBackedTransactionChain;
+import org.opendaylight.mdsal.dom.spi.store.DOMStoreReadTransaction;
+import org.opendaylight.mdsal.dom.spi.store.DOMStoreReadWriteTransaction;
+import org.opendaylight.mdsal.dom.spi.store.DOMStoreThreePhaseCommitCohort;
+import org.opendaylight.mdsal.dom.spi.store.DOMStoreWriteTransaction;
+import org.opendaylight.mdsal.dom.spi.store.SnapshotBackedWriteTransaction;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.ReadOnlyDataTree;
/**
* Transaction chain instantiated on top of a locally-available DataTree. It does not instantiate
private static final Throwable ABORTED = new Throwable("Transaction aborted");
private final TransactionChainProxy parent;
private final ActorSelection leader;
- private final DataTree tree;
+ private final ReadOnlyDataTree tree;
- LocalTransactionChain(final TransactionChainProxy parent, final ActorSelection leader, final DataTree tree) {
- this.parent = Preconditions.checkNotNull(parent);
- this.leader = Preconditions.checkNotNull(leader);
- this.tree = Preconditions.checkNotNull(tree);
+ LocalTransactionChain(final TransactionChainProxy parent, final ActorSelection leader,
+ final ReadOnlyDataTree tree) {
+ this.parent = requireNonNull(parent);
+ this.leader = requireNonNull(leader);
+ this.tree = requireNonNull(tree);
}
- DataTree getDataTree() {
+ ReadOnlyDataTree getDataTree() {
return tree;
}
}
@Override
- protected DOMStoreThreePhaseCommitCohort createCohort(final SnapshotBackedWriteTransaction<TransactionIdentifier> transaction, final DataTreeModification modification) {
- return new LocalThreePhaseCommitCohort(parent.getActorContext(), leader, transaction, modification) {
- @Override
- protected void transactionAborted(final SnapshotBackedWriteTransaction<TransactionIdentifier> transaction) {
- onTransactionFailed(transaction, ABORTED);
- }
-
- @Override
- protected void transactionCommitted(final SnapshotBackedWriteTransaction<TransactionIdentifier> transaction) {
- onTransactionCommited(transaction);
- }
- };
+ protected DOMStoreThreePhaseCommitCohort createCohort(
+ final SnapshotBackedWriteTransaction<TransactionIdentifier> transaction,
+ final DataTreeModification modification,
+ final Exception operationError) {
+ return new LocalChainThreePhaseCommitCohort(transaction, modification, operationError);
}
@Override
public DOMStoreWriteTransaction newWriteOnlyTransaction(TransactionIdentifier identifier) {
return super.newWriteOnlyTransaction(identifier);
}
+
+ @SuppressWarnings({"unchecked", "checkstyle:IllegalCatch"})
+ @Override
+ public LocalThreePhaseCommitCohort onTransactionReady(DOMStoreWriteTransaction tx, Exception operationError) {
+ checkArgument(tx instanceof SnapshotBackedWriteTransaction);
+ if (operationError != null) {
+ return new LocalChainThreePhaseCommitCohort((SnapshotBackedWriteTransaction<TransactionIdentifier>)tx,
+ operationError);
+ }
+
+ try {
+ return (LocalThreePhaseCommitCohort) tx.ready();
+ } catch (Exception e) {
+ // Unfortunately we need to cast to SnapshotBackedWriteTransaction here as it's required by
+ // LocalThreePhaseCommitCohort and the base class.
+ return new LocalChainThreePhaseCommitCohort((SnapshotBackedWriteTransaction<TransactionIdentifier>)tx, e);
+ }
+ }
+
+ private class LocalChainThreePhaseCommitCohort extends LocalThreePhaseCommitCohort {
+
+ protected LocalChainThreePhaseCommitCohort(SnapshotBackedWriteTransaction<TransactionIdentifier> transaction,
+ DataTreeModification modification, Exception operationError) {
+ super(parent.getActorUtils(), leader, transaction, modification, operationError);
+ }
+
+ protected LocalChainThreePhaseCommitCohort(SnapshotBackedWriteTransaction<TransactionIdentifier> transaction,
+ Exception operationError) {
+ super(parent.getActorUtils(), leader, transaction, operationError);
+ }
+
+ @Override
+ protected void transactionAborted(SnapshotBackedWriteTransaction<TransactionIdentifier> transaction) {
+ onTransactionFailed(transaction, ABORTED);
+ }
+
+ @Override
+ protected void transactionCommitted(SnapshotBackedWriteTransaction<TransactionIdentifier> transaction) {
+ onTransactionCommited(transaction);
+ }
+ }
}