Handle AbortLocalTransactionRequest 70/57370/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 25 Apr 2017 14:58:47 +0000 (16:58 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 18 May 2017 15:25:02 +0000 (17:25 +0200)
When local transactions are aborted from the frontend, it is done
via a dedicated message which we failed to account for. This can
happen only as an alternative to CommitLocalTransactionRequest,
hence needs to be handled only in FrontendReadWriteTransaction.

Change-Id: I350a103f132da473d397a7d5f7de7e45850911f3
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 79418d81cd6accb12ee52d33d5add6f495d7db3c)

opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractFrontendHistory.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/FrontendReadWriteTransaction.java

index b7bd46c738d8a6fa5f55ecb09933048592b27c30..5690f1b0d5f4417214d9106099dfd3b046eab0b0 100644 (file)
@@ -175,7 +175,7 @@ abstract class AbstractFrontendHistory implements Identifiable<LocalHistoryIdent
         }
         if (request instanceof AbstractReadTransactionRequest) {
             if (((AbstractReadTransactionRequest<?>) request).isSnapshotOnly()) {
-                LOG.debug("{}: allocatint new open snapshot {}", persistenceId(), id);
+                LOG.debug("{}: allocating new open snapshot {}", persistenceId(), id);
                 tree.getStats().incrementReadOnlyTransactionCount();
                 return createOpenSnapshot(id);
             }
index 64aef6838b1af2969fbe077a7127ff4a04e24c17..9f1df4c8ab31b45fdea9d47bf7c11ddc20c25331 100644 (file)
@@ -14,6 +14,7 @@ import com.google.common.util.concurrent.FutureCallback;
 import java.util.Collection;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.NotThreadSafe;
+import org.opendaylight.controller.cluster.access.commands.AbortLocalTransactionRequest;
 import org.opendaylight.controller.cluster.access.commands.CommitLocalTransactionRequest;
 import org.opendaylight.controller.cluster.access.commands.ExistsTransactionRequest;
 import org.opendaylight.controller.cluster.access.commands.ExistsTransactionSuccess;
@@ -101,7 +102,10 @@ final class FrontendReadWriteTransaction extends FrontendTransaction {
             handleTransactionDoCommit((TransactionDoCommitRequest) request, envelope, now);
             return null;
         } else if (request instanceof TransactionAbortRequest) {
-            handleTransactionAbort((TransactionAbortRequest) request, envelope, now);
+            handleTransactionAbort(request.getSequence(), envelope, now);
+            return null;
+        } else if (request instanceof AbortLocalTransactionRequest) {
+            handleLocalTransactionAbort(request.getSequence(), envelope, now);
             return null;
         } else {
             LOG.warn("Rejecting unsupported request {}", request);
@@ -142,11 +146,17 @@ final class FrontendReadWriteTransaction extends FrontendTransaction {
         });
     }
 
-    private void handleTransactionAbort(final TransactionAbortRequest request,
-            final RequestEnvelope envelope, final long now) throws RequestException {
+    private void handleLocalTransactionAbort(final long sequence, final RequestEnvelope envelope, final long now) {
+        Preconditions.checkState(readyCohort == null, "Transaction {} encountered local abort with commit underway",
+                getIdentifier());
+        openTransaction.abort(() -> recordAndSendSuccess(envelope, now, new TransactionAbortSuccess(getIdentifier(),
+            sequence)));
+    }
+
+    private void handleTransactionAbort(final long sequence, final RequestEnvelope envelope, final long now) {
         if (readyCohort == null) {
-            openTransaction.abort(() -> recordAndSendSuccess(envelope, now,
-                new TransactionAbortSuccess(getIdentifier(), request.getSequence())));
+            openTransaction.abort(() -> recordAndSendSuccess(envelope, now, new TransactionAbortSuccess(getIdentifier(),
+                sequence)));
             return;
         }
 
@@ -154,8 +164,7 @@ final class FrontendReadWriteTransaction extends FrontendTransaction {
             @Override
             public void onSuccess(final Void result) {
                 readyCohort = null;
-                recordAndSendSuccess(envelope, now, new TransactionAbortSuccess(getIdentifier(),
-                    request.getSequence()));
+                recordAndSendSuccess(envelope, now, new TransactionAbortSuccess(getIdentifier(), sequence));
                 LOG.debug("Transaction {} aborted", getIdentifier());
             }