Skip to content

Commit fd6caae

Browse files
Backport to branch(3.12) : Fix SQL Server 2017 CI (#2607)
Co-authored-by: Vincent Guilpain <[email protected]>
1 parent a65c0ea commit fd6caae

File tree

5 files changed

+71
-52
lines changed

5 files changed

+71
-52
lines changed

.github/workflows/ci.yaml

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ env:
3939
ORG_GRADLE_PROJECT_integrationTestJavaRuntimeVersion: "${{ github.event_name != 'workflow_dispatch' && '8' || inputs.INT_TEST_JAVA_RUNTIME_VERSION }}"
4040
ORG_GRADLE_PROJECT_integrationTestJavaRuntimeVendor: "${{ github.event_name != 'workflow_dispatch' && 'temurin' || inputs.INT_TEST_JAVA_RUNTIME_VENDOR }}"
4141
# This variable evaluates to: if {!(Temurin JDK 8) && !(Oracle JDK)} then {true} else {false}
42+
# Oracle JDK that are linux compatible and publicly available through direct download exist for all LTS versions
4243
SET_UP_INT_TEST_RUNTIME_NON_ORACLE_JDK: "${{ (github.event_name == 'workflow_dispatch' && !(inputs.INT_TEST_JAVA_RUNTIME_VERSION == '8' && inputs.INT_TEST_JAVA_RUNTIME_VENDOR == 'temurin') && !(inputs.INT_TEST_JAVA_RUNTIME_VENDOR == 'oracle')) && 'true' || 'false' }}"
4344

4445
jobs:
@@ -234,9 +235,10 @@ jobs:
234235
name: Cosmos DB integration test
235236
runs-on: windows-latest
236237
env:
238+
# Official Oracle JDK images that are windows compatible and publicly available through direct download do not exist for JDK 8 and 11 so we use instead cached versions hosted on the Scalar container registry.
237239
# This variable evaluates to: if {!(Temurin JDK 8) && !(Oracle JDK 8 or 11)} then {true} else {false}
238240
SET_UP_INT_TEST_RUNTIME_JDK_WHEN_NOT_ORACLE_8_OR_11: "${{ (github.event_name == 'workflow_dispatch' && !(inputs.INT_TEST_JAVA_RUNTIME_VERSION == '8' && inputs.INT_TEST_JAVA_RUNTIME_VENDOR == 'temurin') && !(inputs.INT_TEST_JAVA_RUNTIME_VENDOR == 'oracle' && (inputs.INT_TEST_JAVA_RUNTIME_VERSION == '8' || inputs.INT_TEST_JAVA_RUNTIME_VERSION == '11'))) && 'true' || 'false' }}"
239-
SET_UP_INT_TEST_RUNTIME_ORACLE_JDK_8_OR_11: "${{ (inputs.INT_TEST_JAVA_RUNTIME_VENDOR == 'oracle' && (inputs.INT_TEST_JAVA_RUNTIME_VERSION == '8' || inputs.INT_TEST_JAVA_RUNTIME_VERSION == '11')) && 'true' || 'false' }}"
241+
SET_UP_INT_TEST_RUNTIME_ORACLE_JDK_8_OR_11: "${{ ((inputs.INT_TEST_JAVA_RUNTIME_VERSION == '8' || inputs.INT_TEST_JAVA_RUNTIME_VERSION == '11') && inputs.INT_TEST_JAVA_RUNTIME_VENDOR == 'oracle') && 'true' || 'false' }}"
240242

241243
steps:
242244
- uses: actions/checkout@v4
@@ -593,7 +595,7 @@ jobs:
593595
POSTGRES_PASSWORD: postgres
594596
ports:
595597
- 5432:5432
596-
598+
597599
steps:
598600
- uses: actions/checkout@v4
599601

@@ -1005,22 +1007,23 @@ jobs:
10051007

10061008
integration-test-for-jdbc-sqlserver-2017:
10071009
name: SQL Server 2017 integration test
1008-
runs-on: ubuntu-20.04
1009-
1010-
services:
1011-
sqlserver:
1012-
image: mcr.microsoft.com/mssql/server:2017-latest
1013-
env:
1014-
MSSQL_PID: "Express"
1015-
SA_PASSWORD: "SqlServer17"
1016-
ACCEPT_EULA: "Y"
1017-
ports:
1018-
- 1433:1433
1019-
options: --name sqlserver17
1010+
runs-on: windows-latest
1011+
env:
1012+
# Official Oracle JDK images that are windows compatible and publicly available through direct download do not exist for JDK 8 and 11 so we use instead cached versions hosted on the Scalar container registry.
1013+
# This variable evaluates to: if {!(Temurin JDK 8) && !(Oracle JDK 8 or 11)} then {true} else {false}
1014+
SET_UP_INT_TEST_RUNTIME_JDK_WHEN_NOT_ORACLE_8_OR_11: "${{ (github.event_name == 'workflow_dispatch' && !(inputs.INT_TEST_JAVA_RUNTIME_VERSION == '8' && inputs.INT_TEST_JAVA_RUNTIME_VENDOR == 'temurin') && !(inputs.INT_TEST_JAVA_RUNTIME_VENDOR == 'oracle' && (inputs.INT_TEST_JAVA_RUNTIME_VERSION == '8' || inputs.INT_TEST_JAVA_RUNTIME_VERSION == '11'))) && 'true' || 'false' }}"
1015+
SET_UP_INT_TEST_RUNTIME_ORACLE_JDK_8_OR_11: "${{ ((inputs.INT_TEST_JAVA_RUNTIME_VERSION == '8' || inputs.INT_TEST_JAVA_RUNTIME_VERSION == '11') && inputs.INT_TEST_JAVA_RUNTIME_VENDOR == 'oracle') && 'true' || 'false' }}"
10201016

10211017
steps:
10221018
- uses: actions/checkout@v4
10231019

1020+
- name: Setup Sql Server 2017
1021+
uses: rails-sqlserver/setup-mssql@v1
1022+
with:
1023+
components: sqlcmd,sqlengine
1024+
sa-password: "SqlServer17"
1025+
version: 2017
1026+
10241027
- name: Set up JDK ${{ env.JAVA_VERSION }} (${{ env.JAVA_VENDOR }})
10251028
uses: actions/setup-java@v4
10261029
with:
@@ -1029,34 +1032,45 @@ jobs:
10291032

10301033
- name: Set up JDK ${{ env.INT_TEST_JAVA_RUNTIME_VERSION }} (${{ env.INT_TEST_JAVA_RUNTIME_VENDOR }}) to run integration test
10311034
uses: actions/setup-java@v4
1032-
if: ${{ env.SET_UP_INT_TEST_RUNTIME_NON_ORACLE_JDK == 'true'}}
1035+
if: ${{ env.SET_UP_INT_TEST_RUNTIME_JDK_WHEN_NOT_ORACLE_8_OR_11 == 'true'}}
10331036
with:
10341037
java-version: ${{ env.INT_TEST_JAVA_RUNTIME_VERSION }}
10351038
distribution: ${{ env.INT_TEST_JAVA_RUNTIME_VENDOR }}
10361039

1037-
- name: Login to Oracle container registry
1040+
- name: Login to GitHub Container Registry
10381041
uses: docker/login-action@v3
1039-
if: ${{ env.INT_TEST_JAVA_RUNTIME_VENDOR == 'oracle' }}
1042+
if: ${{ env.SET_UP_INT_TEST_RUNTIME_ORACLE_JDK_8_OR_11 == 'true'}}
10401043
with:
1041-
registry: container-registry.oracle.com
1042-
username: ${{ secrets.OCR_USERNAME }}
1043-
password: ${{ secrets.OCR_TOKEN }}
1044+
registry: ghcr.io
1045+
username: ${{ github.repository_owner }}
1046+
password: ${{ secrets.CR_PAT }}
10441047

10451048
- name: Set up JDK ${{ env.INT_TEST_JAVA_RUNTIME_VERSION }} (oracle) to run the integration test
1046-
if: ${{ env.INT_TEST_JAVA_RUNTIME_VENDOR == 'oracle' }}
1049+
if: ${{ env.SET_UP_INT_TEST_RUNTIME_ORACLE_JDK_8_OR_11 == 'true'}}
10471050
run: |
1048-
container_id=$(docker create "container-registry.oracle.com/java/jdk:${{ env.INT_TEST_JAVA_RUNTIME_VERSION }}")
1049-
docker cp -L "$container_id:/usr/java/default" /usr/lib/jvm/oracle-jdk && docker rm "$container_id"
1051+
$container_id=$(docker create "ghcr.io/scalar-labs/oracle/jdk:${{ env.INT_TEST_JAVA_RUNTIME_VERSION }}-windows")
1052+
docker cp "${container_id}:oracle-jdk.exe" .
1053+
docker rm "$container_id"
1054+
Write-Host "Install Oracle JDK"
1055+
Start-Process "oracle-jdk.exe" -NoNewWindow -Wait -ArgumentList "/s"
1056+
Write-Host "Oracle JDK installation successful"
1057+
if ( ${env:INT_TEST_JAVA_RUNTIME_VERSION} -eq '8' ) {
1058+
$jdk_root_dir = "jdk-1.8"
1059+
} else {
1060+
$jdk_root_dir = "jdk-11"
1061+
}
1062+
echo "JAVA_HOME=C:\Program Files\Java\${jdk_root_dir}" >> ${env:GITHUB_ENV}
10501063
10511064
- name: Create no superuser
1052-
run: ./ci/no-superuser/create-no-superuser-sqlserver.sh sqlserver17 SqlServer17 10 3
1065+
run: ./ci/no-superuser/create-no-superuser-sqlserver.sh SqlServer17 10 3
1066+
shell: bash
10531067
timeout-minutes: 1
10541068

10551069
- name: Setup Gradle
10561070
uses: gradle/actions/setup-gradle@v4
10571071

10581072
- name: Execute Gradle 'integrationTestJdbc' task
1059-
run: ./gradlew integrationTestJdbc "-Dscalardb.jdbc.url=jdbc:sqlserver://localhost:1433;databaseName=test_db;encrypt=true;trustServerCertificate=true" -Dscalardb.jdbc.username=no_superuser -Dscalardb.jdbc.password=no_superuser_password
1073+
run: ./gradlew.bat integrationTestJdbc "-Dscalardb.jdbc.url=jdbc:sqlserver://localhost:1433;databaseName=test_db;encrypt=true;trustServerCertificate=true" "-Dfile.encoding=UTF-8" "-Dscalardb.jdbc.username=no_superuser" "-Dscalardb.jdbc.password=no_superuser_password"
10601074

10611075
- name: Upload Gradle test reports
10621076
if: always()
@@ -1111,7 +1125,7 @@ jobs:
11111125
docker cp -L "$container_id:/usr/java/default" /usr/lib/jvm/oracle-jdk && docker rm "$container_id"
11121126
11131127
- name: Create no superuser
1114-
run: ./ci/no-superuser/create-no-superuser-sqlserver.sh sqlserver19 SqlServer19 10 3
1128+
run: ./ci/no-superuser/create-no-superuser-sqlserver.sh SqlServer19 10 3 sqlserver19
11151129
timeout-minutes: 1
11161130

11171131
- name: Setup Gradle
@@ -1173,7 +1187,7 @@ jobs:
11731187
docker cp -L "$container_id:/usr/java/default" /usr/lib/jvm/oracle-jdk && docker rm "$container_id"
11741188
11751189
- name: Create no superuser
1176-
run: ./ci/no-superuser/create-no-superuser-sqlserver.sh sqlserver22 SqlServer22 10 3
1190+
run: ./ci/no-superuser/create-no-superuser-sqlserver.sh SqlServer22 10 3 sqlserver22
11771191
timeout-minutes: 1
11781192

11791193
- name: Setup Gradle

ci/no-superuser/create-no-superuser-sqlserver.sh

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,24 @@
22
set -u
33

44
# Get container name and password from arguments
5-
SQL_SERVER_CONTAINER_NAME=$1
6-
SQL_SERVER_PASSWORD=$2
7-
MAX_RETRY_COUNT=$3
8-
RETRY_INTERVAL=$4
5+
SQL_SERVER_PASSWORD=$1
6+
MAX_RETRY_COUNT=$2
7+
RETRY_INTERVAL=$3
8+
# If set, use `sqlcmd` of the SQL Server docker container. If unset, use `sqlcmd` installed on the host.
9+
SQL_SERVER_CONTAINER_NAME=${4:-''}
910
COUNT=0
1011

11-
# Check if the `/opt/mssql-tools18/bin/sqlcmd` command exists or not.
12-
docker exec -t ${SQL_SERVER_CONTAINER_NAME} ls /opt/mssql-tools18/bin/sqlcmd
13-
if [[ $? -eq 0 ]]; then
14-
SQLCMD=/opt/mssql-tools18/bin/sqlcmd
12+
if [[ -n $SQL_SERVER_CONTAINER_NAME ]]; then
13+
# Check if the `/opt/mssql-tools18/bin/sqlcmd` command exists or not.
14+
docker exec -t ${SQL_SERVER_CONTAINER_NAME} ls /opt/mssql-tools18/bin/sqlcmd
15+
if [[ $? -eq 0 ]]; then
16+
SQLCMD="docker exec -t $SQL_SERVER_CONTAINER_NAME /opt/mssql-tools18/bin/sqlcmd"
17+
else
18+
# If there is no `/opt/mssql-tools18/bin/sqlcmd` command, we use old command.
19+
SQLCMD="docker exec -t $SQL_SERVER_CONTAINER_NAME /opt/mssql-tools/bin/sqlcmd"
20+
fi
1521
else
16-
# If there is no `/opt/mssql-tools18/bin/sqlcmd` command, we use old command.
17-
SQLCMD=/opt/mssql-tools/bin/sqlcmd
22+
SQLCMD=sqlcmd
1823
fi
1924

2025
echo "INFO: Creating no superuser start."
@@ -30,7 +35,7 @@ do
3035

3136
echo "INFO: Retry count: ${COUNT}"
3237

33-
docker exec -t ${SQL_SERVER_CONTAINER_NAME} ${SQLCMD} -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d master -C -Q "SELECT 1"
38+
${SQLCMD} -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d master -C -Q "SELECT 1"
3439

3540
if [[ $? -eq 0 ]]; then
3641
break
@@ -50,40 +55,40 @@ echo "INFO: sqlcmd command succeeded. Continue creating no superuser."
5055

5156
# Create login
5257
echo "INFO: Create login start"
53-
docker exec -t ${SQL_SERVER_CONTAINER_NAME} ${SQLCMD} -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d master -C -Q "CREATE LOGIN no_superuser WITH PASSWORD = 'no_superuser_password', DEFAULT_DATABASE = master , CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF"
58+
${SQLCMD} -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d master -C -Q "CREATE LOGIN no_superuser WITH PASSWORD = 'no_superuser_password', DEFAULT_DATABASE = master , CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF"
5459
echo "INFO: Create login end"
5560

5661
# Create database
5762
echo "INFO: Create database start"
58-
docker exec -t ${SQL_SERVER_CONTAINER_NAME} ${SQLCMD} -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d master -C -Q "CREATE DATABASE test_db COLLATE Japanese_BIN2"
63+
${SQLCMD} -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d master -C -Q "CREATE DATABASE test_db COLLATE Japanese_BIN2"
5964
echo "INFO: Create database end"
6065

6166
# Create no_superuser
6267
echo "INFO: Create no_superuser start"
63-
docker exec -t ${SQL_SERVER_CONTAINER_NAME} ${SQLCMD} -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d test_db -C -Q "CREATE USER no_superuser FOR LOGIN no_superuser"
68+
${SQLCMD} -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d test_db -C -Q "CREATE USER no_superuser FOR LOGIN no_superuser"
6469
echo "INFO: Create no_superuser end"
6570

6671
# Add roles
6772
echo "INFO: Add role db_ddladmin start"
68-
docker exec -t ${SQL_SERVER_CONTAINER_NAME} ${SQLCMD} -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d test_db -C -Q "EXEC sp_addrolemember @rolename = 'db_ddladmin', @membername = 'no_superuser'"
73+
${SQLCMD} -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d test_db -C -Q "EXEC sp_addrolemember @rolename = 'db_ddladmin', @membername = 'no_superuser'"
6974
echo "INFO: Add role db_ddladmin end"
7075

7176
echo "INFO: Add role db_datawriter start"
72-
docker exec -t ${SQL_SERVER_CONTAINER_NAME} ${SQLCMD} -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d test_db -C -Q "EXEC sp_addrolemember @rolename = 'db_datawriter', @membername = 'no_superuser'"
77+
${SQLCMD} -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d test_db -C -Q "EXEC sp_addrolemember @rolename = 'db_datawriter', @membername = 'no_superuser'"
7378
echo "INFO: Add role db_datawriter end"
7479

7580
echo "INFO: Add role db_datareader start"
76-
docker exec -t ${SQL_SERVER_CONTAINER_NAME} ${SQLCMD} -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d test_db -C -Q "EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'no_superuser'"
81+
${SQLCMD} -S localhost -U sa -P ${SQL_SERVER_PASSWORD} -d test_db -C -Q "EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'no_superuser'"
7782
echo "INFO: Add role db_datareader end"
7883

7984
# Check the collation of test_db (for debugging purposes)
8085
echo "INFO: Check collation start"
81-
docker exec -t ${SQL_SERVER_CONTAINER_NAME} ${SQLCMD} -S localhost -U no_superuser -P no_superuser_password -d test_db -C -Q "SELECT name, collation_name FROM sys.databases"
86+
${SQLCMD} -S localhost -U no_superuser -P no_superuser_password -d test_db -C -Q "SELECT name, collation_name FROM sys.databases"
8287
echo "INFO: Check collation end"
8388

8489
# Check if no_superuser can access SQL Server (for debugging purposes)
8590
echo "INFO: SELECT @@version start"
86-
docker exec -t ${SQL_SERVER_CONTAINER_NAME} ${SQLCMD} -S localhost -U no_superuser -P no_superuser_password -d test_db -C -Q "SELECT @@version"
91+
${SQLCMD} -S localhost -U no_superuser -P no_superuser_password -d test_db -C -Q "SELECT @@version"
8792
echo "INFO: SELECT @@version end"
8893

8994
echo "INFO: Creating no superuser succeeded."

integration-test/src/main/java/com/scalar/db/transaction/consensuscommit/ConsensusCommitNullMetadataIntegrationTestBase.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ public void scan_ScanGivenForPreparedWhenCoordinatorStateAborted_ShouldRollback(
617617
selection_SelectionGivenForPreparedWhenCoordinatorStateNotExistAndExpired_ShouldAbortTransaction(
618618
Selection s) throws ExecutionException, CoordinatorException, TransactionException {
619619
// Arrange
620-
long prepared_at = System.currentTimeMillis() - RecoveryHandler.TRANSACTION_LIFETIME_MILLIS;
620+
long prepared_at = System.currentTimeMillis() - RecoveryHandler.TRANSACTION_LIFETIME_MILLIS - 1;
621621
populatePreparedRecordWithNullMetadataAndCoordinatorStateRecord(
622622
storage, namespace1, TABLE_1, TransactionState.PREPARED, prepared_at, null);
623623
DistributedTransaction transaction = manager.begin();
@@ -985,7 +985,7 @@ public void scan_ScanGivenForDeletedWhenCoordinatorStateAborted_ShouldRollback()
985985
selection_SelectionGivenForDeletedWhenCoordinatorStateNotExistAndExpired_ShouldAbortTransaction(
986986
Selection s) throws ExecutionException, CoordinatorException, TransactionException {
987987
// Arrange
988-
long prepared_at = System.currentTimeMillis() - RecoveryHandler.TRANSACTION_LIFETIME_MILLIS;
988+
long prepared_at = System.currentTimeMillis() - RecoveryHandler.TRANSACTION_LIFETIME_MILLIS - 1;
989989
populatePreparedRecordWithNullMetadataAndCoordinatorStateRecord(
990990
storage, namespace1, TABLE_1, TransactionState.DELETED, prepared_at, null);
991991
DistributedTransaction transaction = manager.begin();

integration-test/src/main/java/com/scalar/db/transaction/consensuscommit/ConsensusCommitSpecificIntegrationTestBase.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ public void scan_ScanGivenForPreparedWhenCoordinatorStateAborted_ShouldRollback(
448448
selection_SelectionGivenForPreparedWhenCoordinatorStateNotExistAndExpired_ShouldAbortTransaction(
449449
Selection s) throws ExecutionException, CoordinatorException, TransactionException {
450450
// Arrange
451-
long prepared_at = System.currentTimeMillis() - RecoveryHandler.TRANSACTION_LIFETIME_MILLIS;
451+
long prepared_at = System.currentTimeMillis() - RecoveryHandler.TRANSACTION_LIFETIME_MILLIS - 1;
452452
populatePreparedRecordAndCoordinatorStateRecord(
453453
storage, namespace1, TABLE_1, TransactionState.PREPARED, prepared_at, null);
454454
DistributedTransaction transaction = manager.begin();
@@ -816,7 +816,7 @@ public void scan_ScanGivenForDeletedWhenCoordinatorStateAborted_ShouldRollback()
816816
selection_SelectionGivenForDeletedWhenCoordinatorStateNotExistAndExpired_ShouldAbortTransaction(
817817
Selection s) throws ExecutionException, CoordinatorException, TransactionException {
818818
// Arrange
819-
long prepared_at = System.currentTimeMillis() - RecoveryHandler.TRANSACTION_LIFETIME_MILLIS;
819+
long prepared_at = System.currentTimeMillis() - RecoveryHandler.TRANSACTION_LIFETIME_MILLIS - 1;
820820
populatePreparedRecordAndCoordinatorStateRecord(
821821
storage, namespace1, TABLE_1, TransactionState.DELETED, prepared_at, null);
822822
DistributedTransaction transaction = manager.begin();

integration-test/src/main/java/com/scalar/db/transaction/consensuscommit/TwoPhaseConsensusCommitSpecificIntegrationTestBase.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ public void scan_ScanGivenForPreparedWhenCoordinatorStateAborted_ShouldRollback(
418418
SelectionType selectionType)
419419
throws ExecutionException, TransactionException, CoordinatorException {
420420
// Arrange
421-
long prepared_at = System.currentTimeMillis() - RecoveryHandler.TRANSACTION_LIFETIME_MILLIS;
421+
long prepared_at = System.currentTimeMillis() - RecoveryHandler.TRANSACTION_LIFETIME_MILLIS - 1;
422422
populatePreparedRecordAndCoordinatorStateRecordForStorage1(
423423
TransactionState.PREPARED, prepared_at, null);
424424

@@ -798,7 +798,7 @@ public void scan_ScanGivenForDeletedWhenCoordinatorStateAborted_ShouldRollback()
798798
SelectionType selectionType)
799799
throws ExecutionException, TransactionException, CoordinatorException {
800800
// Arrange
801-
long prepared_at = System.currentTimeMillis() - RecoveryHandler.TRANSACTION_LIFETIME_MILLIS;
801+
long prepared_at = System.currentTimeMillis() - RecoveryHandler.TRANSACTION_LIFETIME_MILLIS - 1;
802802
populatePreparedRecordAndCoordinatorStateRecordForStorage1(
803803
TransactionState.DELETED, prepared_at, null);
804804

0 commit comments

Comments
 (0)