WillemJiang closed pull request #175: SCB-505 Update to throw exception when 
the transaction timeout
URL: https://github.com/apache/incubator-servicecomb-saga/pull/175
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

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 857bb9f5..4f2f729a 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.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 PackStepdefs() {
       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 fffcde24..64c58125 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 cba7f5df..7132cbb8 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 2a3e59de..a49d340f 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 c55090a4..968e5b78 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 @@
 
   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 b17a1209..76dfca75 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 @@
 @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 d3d55fe5..b7afcf53 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 @@ public AlphaResponse preIntercept(String parentTxId, String 
compensationMethod,
 
   @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 889c1222..fe3da30c
--- 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 -->


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to