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.