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/04/18 22:34:30 UTC

[incubator-servicecomb-saga] branch master updated: SCB-505 Update to throw exception when the transaction timeout

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 aff2719  SCB-505 Update to throw exception when the transaction timeout
aff2719 is described below

commit aff2719e0322c452dc52c0e90f9150ac0fb123e6
Author: Zheng Feng <zh...@gmail.com>
AuthorDate: Wed Apr 18 23:04:33 2018 +0800

    SCB-505 Update to throw exception when the transaction timeout
---
 .../org/apache/servicecomb/saga/PackStepdefs.java    | 10 ++++++++--
 .../resources/pack_compensation_scenario.feature     |  2 +-
 .../src/test/resources/pack_success_scenario.feature |  2 +-
 .../src/test/resources/pack_timeout_scenario.feature |  4 ++--
 .../saga/alpha/core/TxConsistentService.java         | 20 ++++++++++++++++++--
 .../apache/servicecomb/saga/alpha/core/TxEvent.java  |  2 +-
 .../transaction/SagaStartAnnotationProcessor.java    |  5 ++++-
 pom.xml                                              |  7 +++++++
 8 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
index 857bb9f..4f2f729 100644
--- a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
+++ b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
@@ -35,6 +35,7 @@ import org.jboss.byteman.agent.submit.Submit;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import io.restassured.response.Response;
 import cucumber.api.DataTable;
 import cucumber.api.java.After;
 import cucumber.api.java8.En;
@@ -79,15 +80,20 @@ public class PackStepdefs implements En {
       bm.addRulesFromFiles(rules);
     });
 
-    When("^User ([A-Za-z]+) requests to book ([0-9]+) cars and ([0-9]+) rooms$", (username, cars, rooms) -> {
+    When("^User ([A-Za-z]+) requests to book ([0-9]+) cars and ([0-9]+) rooms (success|fail)$", (username, cars, rooms, result) -> {
       log.info("Received request from user {} to book {} cars and {} rooms", username, cars, rooms);
 
-      given()
+      Response resp = given()
           .pathParam("name", username)
           .pathParam("rooms", rooms)
           .pathParam("cars", cars)
           .when()
           .post(System.getProperty("booking.service.address") + "/booking/{name}/{rooms}/{cars}");
+      if (result.equals("success")) {
+        resp.then().statusCode(is(200));
+      } else if (result.equals("fail")) {
+        resp.then().statusCode(is(500));
+      }
     });
 
     Then("^Alpha records the following events$", (DataTable dataTable) -> {
diff --git a/acceptance-tests/acceptance-pack/src/test/resources/pack_compensation_scenario.feature b/acceptance-tests/acceptance-pack/src/test/resources/pack_compensation_scenario.feature
index fffcde2..64c5812 100644
--- a/acceptance-tests/acceptance-pack/src/test/resources/pack_compensation_scenario.feature
+++ b/acceptance-tests/acceptance-pack/src/test/resources/pack_compensation_scenario.feature
@@ -21,7 +21,7 @@ Feature: Alpha records transaction events
     And Booking Service is up and running
     And Alpha is up and running
 
-    When User Sean requests to book 5 cars and 3 rooms
+    When User Sean requests to book 5 cars and 3 rooms fail
 
     Then Alpha records the following events
       | serviceName  | type               |
diff --git a/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature b/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
index cba7f5d..7132cbb 100644
--- a/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
+++ b/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
@@ -21,7 +21,7 @@ Feature: Alpha records transaction events
     And Booking Service is up and running
     And Alpha is up and running
 
-    When User Sean requests to book 2 cars and 1 rooms
+    When User Sean requests to book 2 cars and 1 rooms success
 
     Then Alpha records the following events
       | serviceName  | type             |
diff --git a/acceptance-tests/acceptance-pack/src/test/resources/pack_timeout_scenario.feature b/acceptance-tests/acceptance-pack/src/test/resources/pack_timeout_scenario.feature
index 2a3e59d..a49d340 100644
--- a/acceptance-tests/acceptance-pack/src/test/resources/pack_timeout_scenario.feature
+++ b/acceptance-tests/acceptance-pack/src/test/resources/pack_timeout_scenario.feature
@@ -23,7 +23,7 @@ Feature: Alpha records transaction events
 
     Given Install the byteman script booking_timeout.btm to Booking Service
 
-    When User Sean requests to book 1 cars and 1 rooms
+    When User Sean requests to book 1 cars and 1 rooms fail
 
     Then Alpha records the following events
       | serviceName  | type               |
@@ -35,7 +35,7 @@ Feature: Alpha records transaction events
       | pack-booking | TxAbortedEvent     |
       | pack-hotel   | TxCompensatedEvent |
       | pack-car     | TxCompensatedEvent |
-      | pack-booking | SagaEndedEvent     |
+      | pack-car     | SagaEndedEvent     |
 
     Then Car Service contains the following booking orders
       | name | amount | confirmed | cancelled |
diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxConsistentService.java b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxConsistentService.java
index c55090a..968e5b7 100644
--- a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxConsistentService.java
+++ b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxConsistentService.java
@@ -17,10 +17,14 @@
 
 package org.apache.servicecomb.saga.alpha.core;
 
+import static org.apache.servicecomb.saga.common.EventType.SagaEndedEvent;
 import static org.apache.servicecomb.saga.common.EventType.TxAbortedEvent;
 import static org.apache.servicecomb.saga.common.EventType.TxStartedEvent;
 
 import java.lang.invoke.MethodHandles;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,16 +34,28 @@ public class TxConsistentService {
 
   private final TxEventRepository eventRepository;
 
+  private final List<String> types = Arrays.asList(TxStartedEvent.name(), SagaEndedEvent.name());
+
   public TxConsistentService(TxEventRepository eventRepository) {
     this.eventRepository = eventRepository;
   }
 
   public boolean handle(TxEvent event) {
-    if (TxStartedEvent.name().equals(event.type()) && isGlobalTxAborted(event)) {
-      log.info("Sub-transaction rejected, because its parent with globalTxId {} was already aborted", event.globalTxId());
+    if (types.contains(event.type()) && isGlobalTxAborted(event)) {
+      log.info("Transaction event {} rejected, because its parent with globalTxId {} was already aborted", event.type(), event.globalTxId());
       return false;
     }
 
+    if (SagaEndedEvent.name().equals(event.type()) && !event.expiryTime().equals(new Date(TxEvent.MAX_TIMESTAMP))) {
+      // if we get the SagaEndedEvent and the expiryTime is not MAX_TIME, we need to check if it is timeout
+      if (eventRepository.findTimeoutEvents().stream()
+          .filter(txEvent -> txEvent.globalTxId().equals(event.globalTxId()))
+          .count() == 1) {
+        log.warn("Transaction {} is timeout and will be handled by the event scanner", event.globalTxId());
+        return false;
+      }
+    }
+
     eventRepository.save(event);
 
     return true;
diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEvent.java b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEvent.java
index b17a120..76dfca7 100644
--- a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEvent.java
+++ b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEvent.java
@@ -32,7 +32,7 @@ import javax.persistence.Transient;
 @Table(name = "TxEvent")
 public class TxEvent {
   @Transient
-  private static final long MAX_TIMESTAMP = 253402214400000L; // 9999-12-31 00:00:00
+  public static final long MAX_TIMESTAMP = 253402214400000L; // 9999-12-31 00:00:00
 
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
diff --git a/omega/omega-transaction/src/main/java/org/apache/servicecomb/saga/omega/transaction/SagaStartAnnotationProcessor.java b/omega/omega-transaction/src/main/java/org/apache/servicecomb/saga/omega/transaction/SagaStartAnnotationProcessor.java
index d3d55fe..b7afcf5 100644
--- a/omega/omega-transaction/src/main/java/org/apache/servicecomb/saga/omega/transaction/SagaStartAnnotationProcessor.java
+++ b/omega/omega-transaction/src/main/java/org/apache/servicecomb/saga/omega/transaction/SagaStartAnnotationProcessor.java
@@ -42,7 +42,10 @@ class SagaStartAnnotationProcessor implements EventAwareInterceptor {
 
   @Override
   public void postIntercept(String parentTxId, String compensationMethod) {
-    sender.send(new SagaEndedEvent(omegaContext.globalTxId(), omegaContext.localTxId()));
+    AlphaResponse response = sender.send(new SagaEndedEvent(omegaContext.globalTxId(), omegaContext.localTxId()));
+    if (response.aborted()) {
+      throw new OmegaException("transaction " + parentTxId + " is aborted");
+    }
   }
 
   @Override
diff --git a/pom.xml b/pom.xml
old mode 100755
new mode 100644
index 889c122..fe3da30
--- a/pom.xml
+++ b/pom.xml
@@ -585,6 +585,13 @@
             </dependency>
           </dependencies>
         </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <configuration>
+            <redirectTestOutputToFile>true</redirectTestOutputToFile>
+          </configuration>
+        </plugin>
       </plugins>
     </pluginManagement>
     <!-- enable the rat check by default -->

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