[ONOS-6345] Track tombstones within transactions for optimistic locking on null values
Change-Id: Ib4764721e512462ec1552124ff696b8f89687d8f
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/Transaction.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/Transaction.java
index 82b3919..8ad8cb8 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/Transaction.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/Transaction.java
@@ -109,6 +109,7 @@
protected final Transactional<T> transactionalObject;
private final AtomicBoolean open = new AtomicBoolean();
private volatile State state = State.ACTIVE;
+ private volatile Version lock;
public Transaction(TransactionId transactionId, Transactional<T> transactionalObject) {
this.transactionId = transactionId;
@@ -191,7 +192,10 @@
*/
public CompletableFuture<Version> begin() {
open();
- return transactionalObject.begin(transactionId);
+ return transactionalObject.begin(transactionId).thenApply(lock -> {
+ this.lock = lock;
+ return lock;
+ });
}
/**
@@ -208,8 +212,10 @@
public CompletableFuture<Boolean> prepare(List<T> updates) {
checkOpen();
checkActive();
+ Version lock = this.lock;
+ checkState(lock != null, TX_INACTIVE_ERROR);
setState(State.PREPARING);
- return transactionalObject.prepare(new TransactionLog<T>(transactionId, updates))
+ return transactionalObject.prepare(new TransactionLog<T>(transactionId, lock.value(), updates))
.thenApply(succeeded -> {
setState(State.PREPARED);
return succeeded;
@@ -228,8 +234,10 @@
public CompletableFuture<Boolean> prepareAndCommit(List<T> updates) {
checkOpen();
checkActive();
+ Version lock = this.lock;
+ checkState(lock != null, TX_INACTIVE_ERROR);
setState(State.PREPARING);
- return transactionalObject.prepareAndCommit(new TransactionLog<T>(transactionId, updates))
+ return transactionalObject.prepareAndCommit(new TransactionLog<T>(transactionId, lock.value(), updates))
.thenApply(succeeded -> {
setState(State.COMMITTED);
return succeeded;