You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ni...@apache.org on 2018/05/08 02:03:35 UTC

[incubator-servicecomb-saga] branch master updated: SCB-547 try to fix the EventScanner multiple AbortedGlobalTx issue (#186)

This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git


The following commit(s) were added to refs/heads/master by this push:
     new ef3d7b9  SCB-547 try to fix the EventScanner multiple AbortedGlobalTx issue (#186)
ef3d7b9 is described below

commit ef3d7b99c765f1aab974de3c16ea5d7de843f30a
Author: Willem Jiang <ji...@huawei.com>
AuthorDate: Tue May 8 10:03:33 2018 +0800

    SCB-547 try to fix the EventScanner multiple AbortedGlobalTx issue (#186)
---
 .../apache/servicecomb/saga/alpha/core/EventScanner.java    | 13 ++++++++++---
 .../servicecomb/saga/alpha/core/TxEventRepository.java      |  2 +-
 .../saga/alpha/core/TxConsistentServiceTest.java            |  2 +-
 .../saga/alpha/server/SpringTxEventRepository.java          |  2 +-
 .../saga/alpha/server/TxEventEnvelopeRepository.java        |  2 +-
 5 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/EventScanner.java b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/EventScanner.java
index 3168870..8082ab3 100644
--- a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/EventScanner.java
+++ b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/EventScanner.java
@@ -25,6 +25,7 @@ import static org.apache.servicecomb.saga.common.EventType.TxEndedEvent;
 import static org.apache.servicecomb.saga.common.EventType.TxStartedEvent;
 
 import java.lang.invoke.MethodHandles;
+import java.util.List;
 import java.util.concurrent.ScheduledExecutorService;
 
 import org.slf4j.Logger;
@@ -141,20 +142,26 @@ public class EventScanner implements Runnable {
   }
 
   private void updateTransactionStatus() {
-    eventRepository.findFirstAbortedGlobalTransaction().ifPresent(this::markGlobalTxEnd);
+    eventRepository.findFirstAbortedGlobalTransaction().ifPresent(this::markGlobalTxEndWithEvents);
   }
 
   private void markSagaEnded(TxEvent event) {
     if (commandRepository.findUncompletedCommands(event.globalTxId()).isEmpty()) {
-      markGlobalTxEnd(event);
+      markGlobalTxEntWithEvent(event);
     }
   }
 
-  private void markGlobalTxEnd(TxEvent event) {
+  private void markGlobalTxEntWithEvent(TxEvent event) {
     eventRepository.save(toSagaEndedEvent(event));
     LOG.info("Marked end of transaction with globalTxId {}", event.globalTxId());
   }
 
+  private void markGlobalTxEndWithEvents(List<TxEvent> events) {
+    events.forEach(event -> {
+      markGlobalTxEntWithEvent(event);
+    });
+  }
+
   private TxEvent toTxAbortedEvent(TxTimeout timeout) {
     return new TxEvent(
         timeout.serviceName(),
diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEventRepository.java b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEventRepository.java
index c481226..f2cccca 100644
--- a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEventRepository.java
+++ b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEventRepository.java
@@ -42,7 +42,7 @@ public interface TxEventRepository {
    * </ol>
    * @return
    */
-  Optional<TxEvent> findFirstAbortedGlobalTransaction();
+  Optional<List<TxEvent>> findFirstAbortedGlobalTransaction();
 
   /**
    * Find timeout {@link TxEvent}s. A timeout TxEvent satisfies below requirements:
diff --git a/alpha/alpha-core/src/test/java/org/apache/servicecomb/saga/alpha/core/TxConsistentServiceTest.java b/alpha/alpha-core/src/test/java/org/apache/servicecomb/saga/alpha/core/TxConsistentServiceTest.java
index 8faf0e8..b0c19c8 100644
--- a/alpha/alpha-core/src/test/java/org/apache/servicecomb/saga/alpha/core/TxConsistentServiceTest.java
+++ b/alpha/alpha-core/src/test/java/org/apache/servicecomb/saga/alpha/core/TxConsistentServiceTest.java
@@ -49,7 +49,7 @@ public class TxConsistentServiceTest {
     }
 
     @Override
-    public Optional<TxEvent> findFirstAbortedGlobalTransaction() {
+    public Optional<List<TxEvent>> findFirstAbortedGlobalTransaction() {
       return Optional.empty();
     }
 
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/SpringTxEventRepository.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/SpringTxEventRepository.java
index e48a780..951e533 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/SpringTxEventRepository.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/SpringTxEventRepository.java
@@ -40,7 +40,7 @@ class SpringTxEventRepository implements TxEventRepository {
   }
 
   @Override
-  public Optional<TxEvent> findFirstAbortedGlobalTransaction() {
+  public Optional<List<TxEvent>> findFirstAbortedGlobalTransaction() {
     return eventRepo.findFirstAbortedGlobalTxByType();
   }
 
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/TxEventEnvelopeRepository.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/TxEventEnvelopeRepository.java
index 6a8a263..fdf920f 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/TxEventEnvelopeRepository.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/TxEventEnvelopeRepository.java
@@ -46,7 +46,7 @@ interface TxEventEnvelopeRepository extends CrudRepository<TxEvent, Long> {
       + "  AND t2.localTxId = t.localTxId "
       + "  AND t2.type = 'TxStartedEvent') = 0 "
       + "OR t.globalTxId = t.localTxId)")
-  Optional<TxEvent> findFirstAbortedGlobalTxByType();
+  Optional<List<TxEvent>> findFirstAbortedGlobalTxByType();
 
   @Query("SELECT t FROM TxEvent t "
       + "WHERE t.type IN ('TxStartedEvent', 'SagaStartedEvent') "

-- 
To stop receiving notification emails like this one, please contact
ningjiang@apache.org.