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