*/
package org.opendaylight.mdsal.dom.spi.store;
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+
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 org.opendaylight.mdsal.dom.spi.store.SnapshotBackedReadTransaction.TransactionClosePrototype;
import org.opendaylight.mdsal.dom.spi.store.SnapshotBackedWriteTransaction.TransactionReadyPrototype;
-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.tree.api.DataTreeModification;
+import org.opendaylight.yangtools.yang.data.tree.api.DataTreeSnapshot;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
*/
@Beta
public abstract class AbstractSnapshotBackedTransactionChain<T>
- extends TransactionReadyPrototype<T> implements DOMStoreTransactionChain {
+ extends TransactionReadyPrototype<T> implements DOMStoreTransactionChain, TransactionClosePrototype<T> {
private abstract static class State {
/**
* Allocate a new snapshot.
private final AbstractSnapshotBackedTransactionChain<?> chain;
Idle(final AbstractSnapshotBackedTransactionChain<?> chain) {
- this.chain = Preconditions.checkNotNull(chain);
+ this.chain = requireNonNull(chain);
}
@Override
private volatile DataTreeSnapshot snapshot;
Allocated(final DOMStoreWriteTransaction transaction) {
- this.transaction = Preconditions.checkNotNull(transaction);
+ this.transaction = requireNonNull(transaction);
}
public DOMStoreWriteTransaction getTransaction() {
@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);
- 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());
}
}
private final String message;
Shutdown(final String message) {
- this.message = Preconditions.checkNotNull(message);
+ this.message = requireNonNull(message);
}
@Override
return newReadOnlyTransaction(nextTransactionIdentifier());
}
- protected DOMStoreReadTransaction newReadOnlyTransaction(T transactionId) {
+ protected DOMStoreReadTransaction newReadOnlyTransaction(final T transactionId) {
final Entry<State, DataTreeSnapshot> entry = getSnapshot();
return SnapshotBackedTransactions.newReadTransaction(transactionId,
- getDebugTransactions(), entry.getValue());
+ getDebugTransactions(), entry.getValue(), this);
+ }
+
+ @Override
+ public void transactionClosed(final SnapshotBackedReadTransaction<T> tx) {
+ // Defaults to no-op
}
@Override
return newReadWriteTransaction(nextTransactionIdentifier());
}
- protected DOMStoreReadWriteTransaction newReadWriteTransaction(T transactionId) {
+ protected DOMStoreReadWriteTransaction newReadWriteTransaction(final T transactionId) {
Entry<State, DataTreeSnapshot> entry;
DOMStoreReadWriteTransaction ret;
do {
entry = getSnapshot();
- ret = new SnapshotBackedReadWriteTransaction<T>(transactionId,
+ ret = new SnapshotBackedReadWriteTransaction<>(transactionId,
getDebugTransactions(), entry.getValue(), this);
} while (!recordTransaction(entry.getKey(), ret));
return newWriteOnlyTransaction(nextTransactionIdentifier());
}
- protected DOMStoreWriteTransaction newWriteOnlyTransaction(T transactionId) {
+ protected DOMStoreWriteTransaction newWriteOnlyTransaction(final T transactionId) {
Entry<State, DataTreeSnapshot> entry;
DOMStoreWriteTransaction ret;
do {
entry = getSnapshot();
- ret = new SnapshotBackedWriteTransaction<T>(transactionId,
+ ret = new SnapshotBackedWriteTransaction<>(transactionId,
getDebugTransactions(), entry.getValue(), this);
} while (!recordTransaction(entry.getKey(), ret));
if (allocated.getTransaction().equals(tx)) {
final boolean success = STATE_UPDATER.compareAndSet(this, localState, idleState);
if (!success) {
- LOG.warn("Transaction {} aborted, but chain {} s"
- + "tate 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
protected final DOMStoreThreePhaseCommitCohort transactionReady(
- final SnapshotBackedWriteTransaction<T> tx, final DataTreeModification tree) {
+ 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();
- 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);
}
- return createCohort(tx, tree);
+ return createCohort(tx, tree, readyError);
}
@Override
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");
* 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 operationError Any previous error that could be reported through three phase commit
* @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);
}