Skip to content

Commit 9fe9c83

Browse files
committed
Merged changes and resolved conflicts with master branch
2 parents 761deca + 960a825 commit 9fe9c83

File tree

102 files changed

+2499
-432
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

102 files changed

+2499
-432
lines changed

.github/workflows/ci.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,12 @@ jobs:
6767
run: |
6868
mkdir -p /tmp/gradle_test_reports/core
6969
mkdir -p /tmp/gradle_test_reports/schema-loader
70+
mkdir -p /tmp/gradle_test_reports/data-loader/core
71+
mkdir -p /tmp/gradle_test_reports/data-loader/cli
7072
cp -a core/build/reports/tests/test /tmp/gradle_test_reports/core/
7173
cp -a schema-loader/build/reports/tests/test /tmp/gradle_test_reports/schema-loader/
74+
cp -a data-loader/core/build/reports/tests/test /tmp/gradle_test_reports/data-loader/core/
75+
cp -a data-loader/cli/build/reports/tests/test /tmp/gradle_test_reports/data-loader/cli/
7276
7377
- name: Upload Gradle test reports
7478
if: always()
@@ -83,9 +87,13 @@ jobs:
8387
mkdir -p /tmp/gradle_spotbugs_reports/core
8488
mkdir -p /tmp/gradle_spotbugs_reports/schema-loader
8589
mkdir -p /tmp/gradle_spotbugs_reports/integration-test
90+
mkdir -p /tmp/gradle_spotbugs_reports/data-loader/core
91+
mkdir -p /tmp/gradle_spotbugs_reports/data-loader/cli
8692
cp -a core/build/reports/spotbugs /tmp/gradle_spotbugs_reports/core/
8793
cp -a schema-loader/build/reports/spotbugs /tmp/gradle_spotbugs_reports/schema-loader/
8894
cp -a integration-test/build/reports/spotbugs /tmp/gradle_spotbugs_reports/integration-test/
95+
cp -a data-loader/core/build/reports/spotbugs /tmp/gradle_spotbugs_reports/data-loader/core/
96+
cp -a data-loader/cli/build/reports/spotbugs /tmp/gradle_spotbugs_reports/data-loader/cli/
8997
9098
- name: Upload Spotbugs reports
9199
if: always()
@@ -113,6 +121,9 @@ jobs:
113121
- name: Dockerfile Lint for ScalarDB Schema Loader
114122
run: ./gradlew schema-loader:dockerfileLint
115123

124+
- name: Dockerfile Lint for ScalarDB Data Loader CLI
125+
run: ./gradlew data-loader:cli:dockerfileLint
126+
116127
integration-test-for-cassandra-3-0:
117128
name: Cassandra 3.0 integration test (${{ matrix.mode.label }})
118129
runs-on: ubuntu-latest

.github/workflows/create-release.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,16 @@ jobs:
7777
asset_path: schema-loader/build/libs/scalardb-schema-loader-${{ steps.version.outputs.version }}.jar
7878
asset_name: scalardb-schema-loader-${{ steps.version.outputs.version }}.jar
7979
asset_content_type: application/java-archive
80+
81+
- name: Build scalardb-data-loader-cli jar
82+
run: ./gradlew :data-loader:cli:shadowJar
83+
84+
- name: Upload scalardb-data-loader-cli jar
85+
uses: actions/upload-release-asset@v1
86+
env:
87+
GITHUB_TOKEN: ${{ secrets.GH_PROJECT_ACCESS_TOKEN }}
88+
with:
89+
upload_url: ${{ steps.create_release.outputs.upload_url }}
90+
asset_path: data-loader/cli/build/libs/scalardb-data-loader-cli-${{ steps.version.outputs.version }}.jar
91+
asset_name: scalardb-data-loader-cli-${{ steps.version.outputs.version }}.jar
92+
asset_content_type: application/java-archive

.github/workflows/release-snapshot.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,4 @@ jobs:
5656
if: contains(steps.version.outputs.version, '-SNAPSHOT')
5757
run: |
5858
docker push ghcr.io/scalar-labs/scalardb-schema-loader:${{ steps.version.outputs.version }}
59+
docker push ghcr.io/scalar-labs/scalardb-data-loader-cli:${{ steps.version.outputs.version }}

.github/workflows/remove-untagged-images.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,9 @@ jobs:
2525
with:
2626
github-token: ${{ secrets.CR_PAT }}
2727
package-name: scalardb-schema-loader
28+
29+
- name: scalardb-data-loader-cli
30+
uses: camargo/delete-untagged-action@v1
31+
with:
32+
github-token: ${{ secrets.CR_PAT }}
33+
package-name: scalardb-data-loader-cli

.github/workflows/upload-artifacts.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ jobs:
5656
- name: Push containers
5757
run: |
5858
docker push ghcr.io/scalar-labs/scalardb-schema-loader:${{ steps.version.outputs.version }}
59+
docker push ghcr.io/scalar-labs/scalardb-data-loader-cli:${{ steps.version.outputs.version }}
5960
6061
- name: Upload scalardb, scalardb-schema-loader, scalardb-data-loader-core, and scalardb-integration-test to Maven Central Repository
6162
run: |

.github/workflows/vuln-check.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
with:
2626
target-ref: ${{ inputs.target-ref }}
2727
find-latest-release: ${{ inputs.find-latest-release }}
28-
images: '[["ScalarDB Schema Loader", "scalardb-schema-loader"]]'
28+
images: '[["ScalarDB Schema Loader", "scalardb-schema-loader"], ["ScalarDB Data Loader CLI", "scalardb-data-loader-cli"]]'
2929
version-command: "./gradlew :core:properties -q | grep version: | awk '{print $2}'"
3030
secrets:
3131
CR_PAT: ${{ secrets.CR_PAT }}

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ subprojects {
3030
awssdkVersion = '2.31.3'
3131
commonsDbcp2Version = '2.13.0'
3232
mysqlDriverVersion = '8.4.0'
33-
postgresqlDriverVersion = '42.7.6'
33+
postgresqlDriverVersion = '42.7.7'
3434
oracleDriverVersion = '23.8.0.25.04'
3535
sqlserverDriverVersion = '12.8.1.jre8'
3636
sqliteDriverVersion = '3.50.1.0'
3737
yugabyteDriverVersion = '42.7.3-yb-4'
38-
db2DriverVersion= '12.1.0.0'
38+
db2DriverVersion= '12.1.2.0'
3939
mariadDbDriverVersion = '3.5.3'
4040
picocliVersion = '4.7.7'
4141
commonsTextVersion = '1.13.1'

core/src/main/java/com/scalar/db/storage/jdbc/JdbcDatabase.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,17 @@ public Scanner scan(Scan scan) throws ExecutionException {
117117
close(connection);
118118
throw new ExecutionException(
119119
CoreError.JDBC_ERROR_OCCURRED_IN_SELECTION.buildMessage(e.getMessage()), e);
120+
} catch (Exception e) {
121+
try {
122+
if (connection != null) {
123+
connection.rollback();
124+
}
125+
} catch (SQLException ex) {
126+
e.addSuppressed(ex);
127+
}
128+
129+
close(connection);
130+
throw e;
120131
}
121132
}
122133

@@ -186,6 +197,9 @@ public void mutate(List<? extends Mutation> mutations) throws ExecutionException
186197
close(connection);
187198
throw new ExecutionException(
188199
CoreError.JDBC_ERROR_OCCURRED_IN_MUTATION.buildMessage(e.getMessage()), e);
200+
} catch (Exception e) {
201+
close(connection);
202+
throw e;
189203
}
190204

191205
try {

core/src/main/java/com/scalar/db/transaction/consensuscommit/CommitHandler.java

Lines changed: 51 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class CommitHandler {
3636
protected final Coordinator coordinator;
3737
private final TransactionTableMetadataManager tableMetadataManager;
3838
private final ParallelExecutor parallelExecutor;
39+
protected final boolean coordinatorWriteOmissionOnReadOnlyEnabled;
3940

4041
@LazyInit @Nullable private BeforePreparationSnapshotHook beforePreparationSnapshotHook;
4142

@@ -44,11 +45,13 @@ public CommitHandler(
4445
DistributedStorage storage,
4546
Coordinator coordinator,
4647
TransactionTableMetadataManager tableMetadataManager,
47-
ParallelExecutor parallelExecutor) {
48+
ParallelExecutor parallelExecutor,
49+
boolean coordinatorWriteOmissionOnReadOnlyEnabled) {
4850
this.storage = checkNotNull(storage);
4951
this.coordinator = checkNotNull(coordinator);
5052
this.tableMetadataManager = checkNotNull(tableMetadataManager);
5153
this.parallelExecutor = checkNotNull(parallelExecutor);
54+
this.coordinatorWriteOmissionOnReadOnlyEnabled = coordinatorWriteOmissionOnReadOnlyEnabled;
5255
}
5356

5457
/**
@@ -106,42 +109,62 @@ private void waitBeforePreparationSnapshotHookFuture(
106109
}
107110
}
108111

109-
public void commit(Snapshot snapshot) throws CommitException, UnknownTransactionStatusException {
112+
public void commit(Snapshot snapshot, boolean readOnly)
113+
throws CommitException, UnknownTransactionStatusException {
114+
boolean hasWritesOrDeletesInSnapshot = !readOnly && snapshot.hasWritesOrDeletes();
115+
110116
Optional<Future<Void>> snapshotHookFuture = invokeBeforePreparationSnapshotHook(snapshot);
111-
try {
112-
prepare(snapshot);
113-
} catch (PreparationException e) {
114-
safelyCallOnFailureBeforeCommit(snapshot);
115-
abortState(snapshot.getId());
116-
rollbackRecords(snapshot);
117-
if (e instanceof PreparationConflictException) {
118-
throw new CommitConflictException(e.getMessage(), e, e.getTransactionId().orElse(null));
117+
118+
if (hasWritesOrDeletesInSnapshot) {
119+
try {
120+
prepare(snapshot);
121+
} catch (PreparationException e) {
122+
safelyCallOnFailureBeforeCommit(snapshot);
123+
abortState(snapshot.getId());
124+
rollbackRecords(snapshot);
125+
if (e instanceof PreparationConflictException) {
126+
throw new CommitConflictException(e.getMessage(), e, e.getTransactionId().orElse(null));
127+
}
128+
throw new CommitException(e.getMessage(), e, e.getTransactionId().orElse(null));
129+
} catch (Exception e) {
130+
safelyCallOnFailureBeforeCommit(snapshot);
131+
throw e;
119132
}
120-
throw new CommitException(e.getMessage(), e, e.getTransactionId().orElse(null));
121-
} catch (Exception e) {
122-
safelyCallOnFailureBeforeCommit(snapshot);
123-
throw e;
124133
}
125134

126-
try {
127-
validate(snapshot);
128-
} catch (ValidationException e) {
129-
safelyCallOnFailureBeforeCommit(snapshot);
130-
abortState(snapshot.getId());
131-
rollbackRecords(snapshot);
132-
if (e instanceof ValidationConflictException) {
133-
throw new CommitConflictException(e.getMessage(), e, e.getTransactionId().orElse(null));
135+
if (snapshot.hasReads()) {
136+
try {
137+
validate(snapshot);
138+
} catch (ValidationException e) {
139+
safelyCallOnFailureBeforeCommit(snapshot);
140+
141+
// If the transaction has no writes and deletes, we don't need to abort-state and
142+
// rollback-records since there are no changes to be made.
143+
if (hasWritesOrDeletesInSnapshot || !coordinatorWriteOmissionOnReadOnlyEnabled) {
144+
abortState(snapshot.getId());
145+
}
146+
if (hasWritesOrDeletesInSnapshot) {
147+
rollbackRecords(snapshot);
148+
}
149+
150+
if (e instanceof ValidationConflictException) {
151+
throw new CommitConflictException(e.getMessage(), e, e.getTransactionId().orElse(null));
152+
}
153+
throw new CommitException(e.getMessage(), e, e.getTransactionId().orElse(null));
154+
} catch (Exception e) {
155+
safelyCallOnFailureBeforeCommit(snapshot);
156+
throw e;
134157
}
135-
throw new CommitException(e.getMessage(), e, e.getTransactionId().orElse(null));
136-
} catch (Exception e) {
137-
safelyCallOnFailureBeforeCommit(snapshot);
138-
throw e;
139158
}
140159

141160
waitBeforePreparationSnapshotHookFuture(snapshot, snapshotHookFuture.orElse(null));
142161

143-
commitState(snapshot);
144-
commitRecords(snapshot);
162+
if (hasWritesOrDeletesInSnapshot || !coordinatorWriteOmissionOnReadOnlyEnabled) {
163+
commitState(snapshot);
164+
}
165+
if (hasWritesOrDeletesInSnapshot) {
166+
commitRecords(snapshot);
167+
}
145168
}
146169

147170
protected void handleCommitConflict(Snapshot snapshot, Exception cause)

core/src/main/java/com/scalar/db/transaction/consensuscommit/CommitHandlerWithGroupCommit.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.scalar.db.api.DistributedStorage;
66
import com.scalar.db.api.TransactionState;
77
import com.scalar.db.exception.transaction.CommitConflictException;
8+
import com.scalar.db.exception.transaction.CommitException;
89
import com.scalar.db.exception.transaction.UnknownTransactionStatusException;
910
import com.scalar.db.transaction.consensuscommit.Coordinator.State;
1011
import com.scalar.db.util.groupcommit.Emittable;
@@ -28,15 +29,31 @@ public CommitHandlerWithGroupCommit(
2829
Coordinator coordinator,
2930
TransactionTableMetadataManager tableMetadataManager,
3031
ParallelExecutor parallelExecutor,
32+
boolean coordinatorWriteOmissionOnReadOnlyEnabled,
3133
CoordinatorGroupCommitter groupCommitter) {
32-
super(storage, coordinator, tableMetadataManager, parallelExecutor);
34+
super(
35+
storage,
36+
coordinator,
37+
tableMetadataManager,
38+
parallelExecutor,
39+
coordinatorWriteOmissionOnReadOnlyEnabled);
3340

3441
checkNotNull(groupCommitter);
3542
// The methods of this emitter will be called via GroupCommitter.ready().
3643
groupCommitter.setEmitter(new Emitter(coordinator));
3744
this.groupCommitter = groupCommitter;
3845
}
3946

47+
@Override
48+
public void commit(Snapshot snapshot, boolean readOnly)
49+
throws CommitException, UnknownTransactionStatusException {
50+
if (!readOnly && !snapshot.hasWritesOrDeletes() && coordinatorWriteOmissionOnReadOnlyEnabled) {
51+
cancelGroupCommitIfNeeded(snapshot.getId());
52+
}
53+
54+
super.commit(snapshot, readOnly);
55+
}
56+
4057
@Override
4158
protected void onFailureBeforeCommit(Snapshot snapshot) {
4259
cancelGroupCommitIfNeeded(snapshot.getId());

0 commit comments

Comments
 (0)