BUG-8494: propagate submit failure immediately 80/59280/2
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 20 Jun 2017 14:06:01 +0000 (16:06 +0200)
committerTom Pantelis <tompantelis@gmail.com>
Wed, 21 Jun 2017 13:42:40 +0000 (13:42 +0000)
Rather than waiting for abort to complete, which cannot happen
during isolation for example, propagate timeout immediately.

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

opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/ConcurrentDOMDataBroker.java

index 156050485d5465a422cc268df8e48e96be076581..71cd2dc7fe2df10fa9b7f3a6e4ea037ea419f217 100644 (file)
@@ -210,19 +210,8 @@ public class ConcurrentDOMDataBroker extends AbstractDOMBroker {
         }
 
         LOG.warn("Tx: {} Error during phase {}, starting Abort", transaction.getIdentifier(), phase, throwable);
-        final Exception e;
-        if (throwable instanceof NoShardLeaderException || throwable instanceof ShardLeaderNotRespondingException) {
-            e = new DataStoreUnavailableException(throwable.getMessage(), throwable);
-        } else if (throwable instanceof Exception) {
-            e = (Exception)throwable;
-        } else {
-            e = new RuntimeException("Unexpected error occurred", throwable);
-        }
-
-        final TransactionCommitFailedException clientException = exMapper.apply(e);
 
         // Transaction failed - tell all cohorts to abort.
-
         @SuppressWarnings("unchecked")
         ListenableFuture<Void>[] canCommitFutures = new ListenableFuture[cohorts.size()];
         int index = 0;
@@ -230,21 +219,28 @@ public class ConcurrentDOMDataBroker extends AbstractDOMBroker {
             canCommitFutures[index++] = cohort.abort();
         }
 
+        // Propagate the original exception
+        final Exception e;
+        if (throwable instanceof NoShardLeaderException || throwable instanceof ShardLeaderNotRespondingException) {
+            e = new DataStoreUnavailableException(throwable.getMessage(), throwable);
+        } else if (throwable instanceof Exception) {
+            e = (Exception)throwable;
+        } else {
+            e = new RuntimeException("Unexpected error occurred", throwable);
+        }
+        clientSubmitFuture.setException(exMapper.apply(e));
+
         ListenableFuture<List<Void>> combinedFuture = Futures.allAsList(canCommitFutures);
         Futures.addCallback(combinedFuture, new FutureCallback<List<Void>>() {
             @Override
             public void onSuccess(List<Void> notUsed) {
                 // Propagate the original exception to the client.
-                clientSubmitFuture.setException(clientException);
+                LOG.debug("Tx: {} aborted successfully", transaction.getIdentifier());
             }
 
             @Override
             public void onFailure(Throwable failure) {
                 LOG.error("Tx: {} Error during Abort.", transaction.getIdentifier(), failure);
-
-                // Propagate the original exception as that is what caused the Tx to fail and is
-                // what's interesting to the client.
-                clientSubmitFuture.setException(clientException);
             }
         }, MoreExecutors.directExecutor());
     }