Skip to content

Commit 65a496e

Browse files
committed
add jcstress tests
1 parent 7b5041c commit 65a496e

File tree

4 files changed

+107
-4
lines changed

4 files changed

+107
-4
lines changed

.github/workflows/master.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@ jobs:
2828
- name: Setup Gradle
2929
uses: gradle/actions/setup-gradle@v5
3030
- name: build test and publish
31-
run: ./gradlew assemble && ./gradlew check --info && ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository -x check --info --stacktrace
31+
run: ./gradlew assemble && ./gradlew check --info && && ./gradlew jcstress && ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository -x check --info --stacktrace
3232
env:
3333
CI: true

.github/workflows/pull_request.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ jobs:
2626
- name: Setup Gradle
2727
uses: gradle/actions/setup-gradle@v5
2828
- name: build and test
29-
run: ./gradlew assemble && ./gradlew check --info --stacktrace
29+
run: ./gradlew assemble && ./gradlew check --info --stacktrace && ./gradlew jcstress
3030
env:
3131
CI: true

build.gradle

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import net.ltgt.gradle.errorprone.CheckSeverity
12
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
23
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
3-
import net.ltgt.gradle.errorprone.CheckSeverity
4+
45
import java.text.SimpleDateFormat
56

67
plugins {
@@ -15,6 +16,7 @@ plugins {
1516
id 'com.github.ben-manes.versions' version '0.53.0'
1617
id "me.champeau.jmh" version "0.7.3"
1718
id "net.ltgt.errorprone" version '4.3.0'
19+
id "io.github.reyerizo.gradle.jcstress" version "0.8.15"
1820

1921
// Kotlin just for tests - not production code
2022
id 'org.jetbrains.kotlin.jvm' version '2.2.20'
@@ -229,7 +231,8 @@ nexusPublishing {
229231
// https://central.sonatype.org/publish/publish-portal-ossrh-staging-api/#configuration
230232
nexusUrl.set(uri("https://ossrh-staging-api.central.sonatype.com/service/local/"))
231233
// GraphQL Java does not publish snapshots, but adding this URL for completeness
232-
snapshotRepositoryUrl.set(uri("https://central.sonatype.com/repository/maven-snapshots/")) }
234+
snapshotRepositoryUrl.set(uri("https://central.sonatype.com/repository/maven-snapshots/"))
235+
}
233236
}
234237
}
235238

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package org.dataloader;
2+
3+
import org.openjdk.jcstress.annotations.Actor;
4+
import org.openjdk.jcstress.annotations.Arbiter;
5+
import org.openjdk.jcstress.annotations.JCStressTest;
6+
import org.openjdk.jcstress.annotations.Outcome;
7+
import org.openjdk.jcstress.annotations.State;
8+
import org.openjdk.jcstress.infra.results.II_Result;
9+
10+
import java.util.List;
11+
import java.util.concurrent.CompletableFuture;
12+
import java.util.concurrent.atomic.AtomicInteger;
13+
14+
import static org.openjdk.jcstress.annotations.Expect.ACCEPTABLE;
15+
16+
@JCStressTest
17+
@State
18+
@Outcome(id = "2000, 2000", expect = ACCEPTABLE, desc = "accepted")
19+
public class DataLoaderDispatchJCStress {
20+
21+
22+
AtomicInteger counter = new AtomicInteger();
23+
AtomicInteger batchLoaderCount = new AtomicInteger();
24+
volatile boolean finished1;
25+
volatile boolean finished2;
26+
27+
28+
BatchLoader<String, String> batchLoader = keys -> {
29+
return CompletableFuture.supplyAsync(() -> {
30+
batchLoaderCount.getAndAdd(keys.size());
31+
return keys;
32+
});
33+
};
34+
DataLoader<String, String> dataLoader = DataLoaderFactory.newDataLoader(batchLoader);
35+
36+
public DataLoaderDispatchJCStress() {
37+
38+
}
39+
40+
@Actor
41+
public void load1() {
42+
for (int i = 0; i < 1000; i++) {
43+
dataLoader.load("load-1-" + i);
44+
}
45+
finished1 = true;
46+
}
47+
48+
@Actor
49+
public void load2() {
50+
for (int i = 0; i < 1000; i++) {
51+
dataLoader.load("load-2-" + i);
52+
}
53+
finished2 = true;
54+
}
55+
56+
57+
@Actor
58+
public void dispatch1() {
59+
while (!finished1 || !finished2) {
60+
try {
61+
List<String> dispatchedResult = dataLoader.dispatch().get();
62+
counter.getAndAdd(dispatchedResult.size());
63+
} catch (Exception e) {
64+
throw new RuntimeException(e);
65+
}
66+
}
67+
try {
68+
List<String> dispatchedResult = dataLoader.dispatch().get();
69+
counter.getAndAdd(dispatchedResult.size());
70+
} catch (Exception e) {
71+
throw new RuntimeException(e);
72+
}
73+
}
74+
75+
@Actor
76+
public void dispatch2() {
77+
while (!finished1 || !finished2) {
78+
try {
79+
List<String> dispatchedResult = dataLoader.dispatch().get();
80+
counter.getAndAdd(dispatchedResult.size());
81+
} catch (Exception e) {
82+
throw new RuntimeException(e);
83+
}
84+
}
85+
try {
86+
List<String> dispatchedResult = dataLoader.dispatch().get();
87+
counter.getAndAdd(dispatchedResult.size());
88+
} catch (Exception e) {
89+
throw new RuntimeException(e);
90+
}
91+
}
92+
93+
@Arbiter
94+
public void arbiter(II_Result r) {
95+
r.r1 = counter.get();
96+
r.r2 = batchLoaderCount.get();
97+
}
98+
99+
100+
}

0 commit comments

Comments
 (0)