Code Review
/
mdsal.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
Adopt odlparent-10.0.0/yangtools-8.0.0-SNAPSHOT
[mdsal.git]
/
dom
/
mdsal-dom-spi
/
src
/
main
/
java
/
org
/
opendaylight
/
mdsal
/
dom
/
spi
/
store
/
AbstractSnapshotBackedTransactionChain.java
diff --git
a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/AbstractSnapshotBackedTransactionChain.java
b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/AbstractSnapshotBackedTransactionChain.java
index 55634853387f5d0eb526dbd40397e55bd3697f36..85012c39b2dc727082302cd566b1c8836040a1f5 100644
(file)
--- a/
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/AbstractSnapshotBackedTransactionChain.java
+++ b/
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/AbstractSnapshotBackedTransactionChain.java
@@
-7,27
+7,30
@@
*/
package org.opendaylight.mdsal.dom.spi.store;
*/
package org.opendaylight.mdsal.dom.spi.store;
-import org.opendaylight.mdsal.dom.spi.store.SnapshotBackedWriteTransaction.TransactionReadyPrototype;
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
import com.google.common.annotations.Beta;
import com.google.common.annotations.Beta;
-import com.google.common.base.Preconditions;
import java.util.AbstractMap.SimpleEntry;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import java.util.AbstractMap.SimpleEntry;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
+import org.opendaylight.mdsal.dom.spi.store.SnapshotBackedReadTransaction.TransactionClosePrototype;
+import org.opendaylight.mdsal.dom.spi.store.SnapshotBackedWriteTransaction.TransactionReadyPrototype;
+import org.opendaylight.yangtools.yang.data.tree.api.DataTreeModification;
+import org.opendaylight.yangtools.yang.data.tree.api.DataTreeSnapshot;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * Abstract implementation of the {@link DOMStoreTransactionChain} interface relying on {@link DataTreeSnapshot} supplier
+ * Abstract implementation of the {@link DOMStoreTransactionChain}
+ * interface relying on {@link DataTreeSnapshot} supplier
* and backend commit coordinator.
* and backend commit coordinator.
- *
* @param <T> transaction identifier type
*/
@Beta
* @param <T> transaction identifier type
*/
@Beta
-public abstract class AbstractSnapshotBackedTransactionChain<T> extends TransactionReadyPrototype<T> implements DOMStoreTransactionChain {
- private static abstract class State {
+public abstract class AbstractSnapshotBackedTransactionChain<T>
+ extends TransactionReadyPrototype<T> implements DOMStoreTransactionChain, TransactionClosePrototype<T> {
+ private abstract static class State {
/**
* Allocate a new snapshot.
*
/**
* Allocate a new snapshot.
*
@@
-40,7
+43,7
@@
public abstract class AbstractSnapshotBackedTransactionChain<T> extends Transact
private final AbstractSnapshotBackedTransactionChain<?> chain;
Idle(final AbstractSnapshotBackedTransactionChain<?> chain) {
private final AbstractSnapshotBackedTransactionChain<?> chain;
Idle(final AbstractSnapshotBackedTransactionChain<?> chain) {
- this.chain =
Preconditions.checkNot
Null(chain);
+ this.chain =
requireNon
Null(chain);
}
@Override
}
@Override
@@
-59,7
+62,7
@@
public abstract class AbstractSnapshotBackedTransactionChain<T> extends Transact
private volatile DataTreeSnapshot snapshot;
Allocated(final DOMStoreWriteTransaction transaction) {
private volatile DataTreeSnapshot snapshot;
Allocated(final DOMStoreWriteTransaction transaction) {
- this.transaction =
Preconditions.checkNot
Null(transaction);
+ this.transaction =
requireNon
Null(transaction);
}
public DOMStoreWriteTransaction getTransaction() {
}
public DOMStoreWriteTransaction getTransaction() {
@@
-69,13
+72,13
@@
public abstract class AbstractSnapshotBackedTransactionChain<T> extends Transact
@Override
protected DataTreeSnapshot getSnapshot() {
final DataTreeSnapshot ret = snapshot;
@Override
protected DataTreeSnapshot getSnapshot() {
final DataTreeSnapshot ret = snapshot;
-
Preconditions.
checkState(ret != null, "Previous transaction %s is not ready yet", transaction.getIdentifier());
+ checkState(ret != null, "Previous transaction %s is not ready yet", transaction.getIdentifier());
return ret;
}
void setSnapshot(final DataTreeSnapshot snapshot) {
final boolean success = SNAPSHOT_UPDATER.compareAndSet(this, null, snapshot);
return ret;
}
void setSnapshot(final DataTreeSnapshot snapshot) {
final boolean success = SNAPSHOT_UPDATER.compareAndSet(this, null, snapshot);
-
Preconditions.
checkState(success, "Transaction %s has already been marked as ready", transaction.getIdentifier());
+ checkState(success, "Transaction %s has already been marked as ready", transaction.getIdentifier());
}
}
}
}
@@
-86,7
+89,7
@@
public abstract class AbstractSnapshotBackedTransactionChain<T> extends Transact
private final String message;
Shutdown(final String message) {
private final String message;
Shutdown(final String message) {
- this.message =
Preconditions.checkNot
Null(message);
+ this.message =
requireNon
Null(message);
}
@Override
}
@Override
@@
-96,8
+99,10
@@
public abstract class AbstractSnapshotBackedTransactionChain<T> extends Transact
}
@SuppressWarnings("rawtypes")
}
@SuppressWarnings("rawtypes")
- private static final AtomicReferenceFieldUpdater<AbstractSnapshotBackedTransactionChain, State> STATE_UPDATER =
- AtomicReferenceFieldUpdater.newUpdater(AbstractSnapshotBackedTransactionChain.class, State.class, "state");
+ private static final AtomicReferenceFieldUpdater<AbstractSnapshotBackedTransactionChain, State>
+ STATE_UPDATER =
+ AtomicReferenceFieldUpdater.newUpdater(AbstractSnapshotBackedTransactionChain.class,
+ State.class, "state");
private static final Logger LOG = LoggerFactory.getLogger(AbstractSnapshotBackedTransactionChain.class);
private static final Shutdown CLOSED = new Shutdown("Transaction chain is closed");
private static final Shutdown FAILED = new Shutdown("Transaction chain has failed");
private static final Logger LOG = LoggerFactory.getLogger(AbstractSnapshotBackedTransactionChain.class);
private static final Shutdown CLOSED = new Shutdown("Transaction chain is closed");
private static final Shutdown FAILED = new Shutdown("Transaction chain has failed");
@@
-115,8
+120,8
@@
public abstract class AbstractSnapshotBackedTransactionChain<T> extends Transact
}
private boolean recordTransaction(final State expected, final DOMStoreWriteTransaction transaction) {
}
private boolean recordTransaction(final State expected, final DOMStoreWriteTransaction transaction) {
- final State
state
= new Allocated(transaction);
- return STATE_UPDATER.compareAndSet(this, expected,
state
);
+ final State
real
= new Allocated(transaction);
+ return STATE_UPDATER.compareAndSet(this, expected,
real
);
}
@Override
}
@Override
@@
-124,9
+129,15
@@
public abstract class AbstractSnapshotBackedTransactionChain<T> extends Transact
return newReadOnlyTransaction(nextTransactionIdentifier());
}
return newReadOnlyTransaction(nextTransactionIdentifier());
}
- protected DOMStoreReadTransaction newReadOnlyTransaction(T transactionId) {
+ protected DOMStoreReadTransaction newReadOnlyTransaction(
final
T transactionId) {
final Entry<State, DataTreeSnapshot> entry = getSnapshot();
final Entry<State, DataTreeSnapshot> entry = getSnapshot();
- return SnapshotBackedTransactions.newReadTransaction(transactionId, getDebugTransactions(), entry.getValue());
+ return SnapshotBackedTransactions.newReadTransaction(transactionId,
+ getDebugTransactions(), entry.getValue(), this);
+ }
+
+ @Override
+ public void transactionClosed(final SnapshotBackedReadTransaction<T> tx) {
+ // Defaults to no-op
}
@Override
}
@Override
@@
-134,13
+145,14
@@
public abstract class AbstractSnapshotBackedTransactionChain<T> extends Transact
return newReadWriteTransaction(nextTransactionIdentifier());
}
return newReadWriteTransaction(nextTransactionIdentifier());
}
- protected DOMStoreReadWriteTransaction newReadWriteTransaction(T transactionId) {
+ protected DOMStoreReadWriteTransaction newReadWriteTransaction(
final
T transactionId) {
Entry<State, DataTreeSnapshot> entry;
DOMStoreReadWriteTransaction ret;
do {
entry = getSnapshot();
Entry<State, DataTreeSnapshot> entry;
DOMStoreReadWriteTransaction ret;
do {
entry = getSnapshot();
- ret = new SnapshotBackedReadWriteTransaction<T>(transactionId, getDebugTransactions(), entry.getValue(), this);
+ ret = new SnapshotBackedReadWriteTransaction<>(transactionId,
+ getDebugTransactions(), entry.getValue(), this);
} while (!recordTransaction(entry.getKey(), ret));
return ret;
} while (!recordTransaction(entry.getKey(), ret));
return ret;
@@
-151,13
+163,14
@@
public abstract class AbstractSnapshotBackedTransactionChain<T> extends Transact
return newWriteOnlyTransaction(nextTransactionIdentifier());
}
return newWriteOnlyTransaction(nextTransactionIdentifier());
}
- protected DOMStoreWriteTransaction newWriteOnlyTransaction(T transactionId) {
+ protected DOMStoreWriteTransaction newWriteOnlyTransaction(
final
T transactionId) {
Entry<State, DataTreeSnapshot> entry;
DOMStoreWriteTransaction ret;
do {
entry = getSnapshot();
Entry<State, DataTreeSnapshot> entry;
DOMStoreWriteTransaction ret;
do {
entry = getSnapshot();
- ret = new SnapshotBackedWriteTransaction<T>(transactionId, getDebugTransactions(), entry.getValue(), this);
+ ret = new SnapshotBackedWriteTransaction<>(transactionId,
+ getDebugTransactions(), entry.getValue(), this);
} while (!recordTransaction(entry.getKey(), ret));
return ret;
} while (!recordTransaction(entry.getKey(), ret));
return ret;
@@
-171,27
+184,31
@@
public abstract class AbstractSnapshotBackedTransactionChain<T> extends Transact
if (allocated.getTransaction().equals(tx)) {
final boolean success = STATE_UPDATER.compareAndSet(this, localState, idleState);
if (!success) {
if (allocated.getTransaction().equals(tx)) {
final boolean success = STATE_UPDATER.compareAndSet(this, localState, idleState);
if (!success) {
- LOG.warn("Transaction {} aborted, but chain {} state already transitioned from {} to {},
very strange",
- tx, this, localState, state);
+ LOG.warn("Transaction {} aborted, but chain {} state already transitioned from {} to {},
"
+
+ "very strange",
tx, this, localState, state);
}
}
}
}
@Override
}
}
}
}
@Override
- protected final DOMStoreThreePhaseCommitCohort transactionReady(final SnapshotBackedWriteTransaction<T> tx, final DataTreeModification tree) {
+ protected final DOMStoreThreePhaseCommitCohort transactionReady(
+ final SnapshotBackedWriteTransaction<T> tx,
+ final DataTreeModification tree,
+ final Exception readyError) {
final State localState = state;
if (localState instanceof Allocated) {
final Allocated allocated = (Allocated)localState;
final DOMStoreWriteTransaction transaction = allocated.getTransaction();
final State localState = state;
if (localState instanceof Allocated) {
final Allocated allocated = (Allocated)localState;
final DOMStoreWriteTransaction transaction = allocated.getTransaction();
- Preconditions.checkState(tx.equals(transaction), "Mis-ordered ready transaction %s last allocated was %s", tx, transaction);
+ checkState(tx.equals(transaction), "Mis-ordered ready transaction %s last allocated was %s", tx,
+ transaction);
allocated.setSnapshot(tree);
} else {
LOG.debug("Ignoring transaction {} readiness due to state {}", tx, localState);
}
allocated.setSnapshot(tree);
} else {
LOG.debug("Ignoring transaction {} readiness due to state {}", tx, localState);
}
- return createCohort(tx, tree);
+ return createCohort(tx, tree
, readyError
);
}
@Override
}
@Override
@@
-199,7
+216,7
@@
public abstract class AbstractSnapshotBackedTransactionChain<T> extends Transact
final State localState = state;
do {
final State localState = state;
do {
-
Preconditions.
checkState(!CLOSED.equals(localState), "Transaction chain {} has been closed", this);
+ checkState(!CLOSED.equals(localState), "Transaction chain {} has been closed", this);
if (FAILED.equals(localState)) {
LOG.debug("Ignoring user close in failed state");
if (FAILED.equals(localState)) {
LOG.debug("Ignoring user close in failed state");
@@
-210,7
+227,6
@@
public abstract class AbstractSnapshotBackedTransactionChain<T> extends Transact
/**
* Notify the base logic that a previously-submitted transaction has been committed successfully.
/**
* Notify the base logic that a previously-submitted transaction has been committed successfully.
- *
* @param transaction Transaction which completed successfully.
*/
protected final void onTransactionCommited(final SnapshotBackedWriteTransaction<T> transaction) {
* @param transaction Transaction which completed successfully.
*/
protected final void onTransactionCommited(final SnapshotBackedWriteTransaction<T> transaction) {
@@
-234,17
+250,18
@@
public abstract class AbstractSnapshotBackedTransactionChain<T> extends Transact
}
if (!STATE_UPDATER.compareAndSet(this, localState, idleState)) {
}
if (!STATE_UPDATER.compareAndSet(this, localState, idleState)) {
- LOG.debug("Transaction chain {} has already transitioned from {} to {}, not making it idle", this, localState, state);
+ LOG.debug("Transaction chain {} has already transitioned from "
+ + "{} to {}, not making it idle", this, localState, state);
}
}
/**
* Notify the base logic that a previously-submitted transaction has failed.
}
}
/**
* Notify the base logic that a previously-submitted transaction has failed.
- *
* @param transaction Transaction which failed.
* @param cause Failure cause
*/
* @param transaction Transaction which failed.
* @param cause Failure cause
*/
- protected final void onTransactionFailed(final SnapshotBackedWriteTransaction<T> transaction, final Throwable cause) {
+ protected final void onTransactionFailed(
+ final SnapshotBackedWriteTransaction<T> transaction, final Throwable cause) {
LOG.debug("Transaction chain {} failed on transaction {}", this, transaction, cause);
state = FAILED;
}
LOG.debug("Transaction chain {} failed on transaction {}", this, transaction, cause);
state = FAILED;
}
@@
-258,24
+275,24
@@
public abstract class AbstractSnapshotBackedTransactionChain<T> extends Transact
/**
* Inquire as to whether transactions should record their allocation context.
/**
* Inquire as to whether transactions should record their allocation context.
- *
* @return True if allocation context should be recorded.
*/
protected abstract boolean getDebugTransactions();
/**
* Take a fresh {@link DataTreeSnapshot} from the backend.
* @return True if allocation context should be recorded.
*/
protected abstract boolean getDebugTransactions();
/**
* Take a fresh {@link DataTreeSnapshot} from the backend.
- *
* @return A new snapshot.
*/
protected abstract DataTreeSnapshot takeSnapshot();
/**
* Create a cohort for driving the transaction through the commit process.
* @return A new snapshot.
*/
protected abstract DataTreeSnapshot takeSnapshot();
/**
* Create a cohort for driving the transaction through the commit process.
- *
* @param transaction Transaction handle
* @param modification {@link DataTreeModification} which needs to be applied to the backend
* @param transaction Transaction handle
* @param modification {@link DataTreeModification} which needs to be applied to the backend
+ * @param operationError Any previous error that could be reported through three phase commit
* @return A {@link DOMStoreThreePhaseCommitCohort} cohort.
*/
* @return A {@link DOMStoreThreePhaseCommitCohort} cohort.
*/
- protected abstract DOMStoreThreePhaseCommitCohort createCohort(final SnapshotBackedWriteTransaction<T> transaction, final DataTreeModification modification);
+ protected abstract DOMStoreThreePhaseCommitCohort createCohort(SnapshotBackedWriteTransaction<T> transaction,
+ DataTreeModification modification,
+ Exception operationError);
}
}