Skip to content

Commit e9a1975

Browse files
committed
make MapStatsContainer thread-safe and fix tests
1 parent 5f1fb46 commit e9a1975

File tree

14 files changed

+70
-27
lines changed

14 files changed

+70
-27
lines changed

api/src/main/java/de/learnlib/sul/TimedSUL.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package de.learnlib.sul;
22

3-
import net.automatalib.symbol.time.TimedOutput;
4-
import net.automatalib.symbol.time.TimedInput;
53
import net.automatalib.symbol.time.InputSymbol;
64
import net.automatalib.symbol.time.TimeStepSequence;
5+
import net.automatalib.symbol.time.TimedInput;
6+
import net.automatalib.symbol.time.TimedOutput;
77
import net.automatalib.symbol.time.TimeoutSymbol;
88
import net.automatalib.word.Word;
99
import net.automatalib.word.WordBuilder;
@@ -101,4 +101,8 @@ default Word<TimedOutput<O>> collectTimeouts(TimeStepSequence<I> input) {
101101
return wbOutput.toWord();
102102
}
103103

104+
@Override
105+
default TimedSUL<I, O> fork() {
106+
throw new UnsupportedOperationException();
107+
}
104108
}

examples/src/main/java/de/learnlib/example/mmlt/Example1.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ private static void runExperiment(ExtensibleLStarMMLT<String, String> learner,
126126
stats.setCounter("result_locs", "Locations in result", finalHypothesis.getStates().size());
127127

128128
// Print final result + statistics:
129-
stats.printStats();
129+
System.out.println(stats.printStats());
130130

131131
new ObservationTableASCIIWriter<>().write(learner.getObservationTable(), System.out);
132132

filters/cache/src/test/java/de/learnlib/filter/cache/AbstractParallelCacheTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import de.learnlib.oracle.EquivalenceOracle;
2323
import de.learnlib.oracle.ParallelOracle;
2424
import de.learnlib.query.DefaultQuery;
25+
import de.learnlib.statistic.Statistics;
2526
import net.automatalib.alphabet.Alphabet;
2627
import net.automatalib.common.util.collection.IterableUtil;
2728
import net.automatalib.word.Word;
@@ -64,14 +65,15 @@ public void setUp() {
6465
this.targetModel = getTargetModel();
6566
this.cache = getCacheRepresentative();
6667
this.parallelOracle = getParallelOracle();
68+
Statistics.getContainer().clear();
6769
}
6870

6971
@AfterClass
7072
public void teardown() {
7173
this.parallelOracle.shutdownNow();
7274
}
7375

74-
@Test(timeOut = 20000)
76+
@Test
7577
public void testConcurrentMembershipQueries() {
7678
Assert.assertEquals(getNumberOfQueries(), 0);
7779

@@ -103,7 +105,7 @@ public void testConcurrentMembershipQueries() {
103105
Assert.assertEquals(numOfQueriesAfter, numOfQueriesBefore);
104106
}
105107

106-
@Test(dependsOnMethods = "testConcurrentMembershipQueries", timeOut = 20000)
108+
@Test(dependsOnMethods = "testConcurrentMembershipQueries")
107109
public void testConcurrentEquivalenceQueries() {
108110
final long previousCount = getNumberOfQueries();
109111
final EquivalenceOracle<? super A, I, D> eqOracle = cache.createCacheConsistencyTest();

filters/cache/src/test/java/de/learnlib/filter/cache/dfa/AbstractDFACacheTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ protected DFACacheOracle<Character> getResumedOracle(DFACacheOracle<Character> o
5858

5959
@Override
6060
protected long getNumberOfPosedQueries() {
61-
return Statistics.getContainer().getCount(DFACounterOracle.SYMBOL_KEY).orElse(0L);
61+
return Statistics.getContainer().getCount(DFACounterOracle.QUERY_KEY).orElse(0L);
6262
}
6363

6464
@Override

filters/cache/src/test/java/de/learnlib/filter/cache/dfa/DFAHashCacheTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ protected DFAHashCacheOracle<Character> getResumedOracle(DFAHashCacheOracle<Char
5656

5757
@Override
5858
protected long getNumberOfPosedQueries() {
59-
return Statistics.getContainer().getCount(DFACounterOracle.SYMBOL_KEY).orElse(0L);
59+
return Statistics.getContainer().getCount(DFACounterOracle.QUERY_KEY).orElse(0L);
6060
}
6161

6262
@Override

filters/cache/src/test/java/de/learnlib/filter/cache/dfa/DFAParallelCacheTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,6 @@ protected ParallelOracle<Character, Boolean> getParallelOracle() {
7575

7676
@Override
7777
protected long getNumberOfQueries() {
78-
return Statistics.getContainer().getCount(DFACounterOracle.SYMBOL_KEY).orElse(0L);
78+
return Statistics.getContainer().getCount(DFACounterOracle.QUERY_KEY).orElse(0L);
7979
}
8080
}

filters/statistics/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ limitations under the License.
5252
<groupId>de.learnlib.tooling</groupId>
5353
<artifactId>annotations</artifactId>
5454
</dependency>
55+
<dependency>
56+
<groupId>org.kohsuke.metainf-services</groupId>
57+
<artifactId>metainf-services</artifactId>
58+
</dependency>
5559

5660
<!-- test -->
5761
<dependency>

filters/statistics/src/main/java/de/learnlib/filter/statistic/container/MapStatsContainer.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ public class MapStatsContainer implements StatsContainer {
1414
private final Map<String, LearnerStatistic> statistics = new HashMap<>(); // id -> stat
1515

1616
@Override
17-
public void addTextInfo(String id, @Nullable String description, String text) {
17+
public synchronized void addTextInfo(String id, @Nullable String description, String text) {
1818
statistics.put(id, new TextStatistic(id, description, text));
1919
}
2020

2121
@Override
22-
public Optional<String> getTextValue(String id) {
22+
public synchronized Optional<String> getTextValue(String id) {
2323
var value = statistics.get(id);
2424
if (value instanceof TextStatistic textStatistic) {
2525
return Optional.of(textStatistic.getText());
@@ -28,12 +28,12 @@ public Optional<String> getTextValue(String id) {
2828
}
2929

3030
@Override
31-
public void setFlag(String id, @Nullable String description, boolean value) {
31+
public synchronized void setFlag(String id, @Nullable String description, boolean value) {
3232
statistics.put(id, new FlagStatistic(id, description, value));
3333
}
3434

3535
@Override
36-
public Optional<Boolean> getFlagValue(String id) {
36+
public synchronized Optional<Boolean> getFlagValue(String id) {
3737
var value = statistics.get(id);
3838
if (value instanceof FlagStatistic flagStatistic) {
3939
return Optional.of(flagStatistic.isFlagged());
@@ -42,7 +42,7 @@ public Optional<Boolean> getFlagValue(String id) {
4242
}
4343

4444
@Override
45-
public void startOrResumeClock(String id, @Nullable String description) {
45+
public synchronized void startOrResumeClock(String id, @Nullable String description) {
4646
var value = statistics.get(id);
4747
if (value instanceof StopClockStatistic clockStatistic) {
4848
clockStatistic.resume();
@@ -55,15 +55,15 @@ public void startOrResumeClock(String id, @Nullable String description) {
5555
}
5656

5757
@Override
58-
public void pauseClock(String id) {
58+
public synchronized void pauseClock(String id) {
5959
var value = statistics.get(id);
6060
if (value instanceof StopClockStatistic clockStatistic) {
6161
clockStatistic.pause();
6262
}
6363
}
6464

6565
@Override
66-
public Optional<Duration> getClockValue(String id) {
66+
public synchronized Optional<Duration> getClockValue(String id) {
6767
var value = statistics.get(id);
6868
if (value instanceof StopClockStatistic clockStatistic) {
6969
return Optional.of(clockStatistic.getElapsed());
@@ -72,7 +72,7 @@ public Optional<Duration> getClockValue(String id) {
7272
}
7373

7474
@Override
75-
public void increaseCounter(String id, @Nullable String description, long increment) {
75+
public synchronized void increaseCounter(String id, @Nullable String description, long increment) {
7676
var value = statistics.get(id);
7777
if (value instanceof CounterStatistic counterStatistic) {
7878
counterStatistic.increase(increment);
@@ -83,12 +83,12 @@ public void increaseCounter(String id, @Nullable String description, long increm
8383
}
8484

8585
@Override
86-
public void setCounter(String id, @Nullable String description, long count) {
86+
public synchronized void setCounter(String id, @Nullable String description, long count) {
8787
statistics.put(id, new CounterStatistic(id, description, count));
8888
}
8989

9090
@Override
91-
public Optional<Long> getCount(String id) {
91+
public synchronized Optional<Long> getCount(String id) {
9292
var value = statistics.get(id);
9393
if (value instanceof CounterStatistic counterStatistic) {
9494
return Optional.of(counterStatistic.getCount());
@@ -97,7 +97,7 @@ public Optional<Long> getCount(String id) {
9797
}
9898

9999
@Override
100-
public void clear() {
100+
public synchronized void clear() {
101101
statistics.clear();
102102
}
103103

filters/statistics/src/main/java/de/learnlib/filter/statistic/container/MapStatsProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import de.learnlib.statistic.StatisticsProvider;
44
import de.learnlib.statistic.StatsContainer;
5+
import org.kohsuke.MetaInfServices;
56

7+
@MetaInfServices(StatisticsProvider.class)
68
public class MapStatsProvider implements StatisticsProvider {
79

810
final ThreadLocal<StatsContainer> threadLocal = ThreadLocal.withInitial(MapStatsContainer::new);

filters/statistics/src/main/java/de/learnlib/filter/statistic/sul/CounterObservableSUL.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package de.learnlib.filter.statistic.sul;
1717

18+
import de.learnlib.statistic.Statistics;
19+
import de.learnlib.statistic.StatsContainer;
1820
import de.learnlib.sul.ObservableSUL;
1921

2022
public class CounterObservableSUL<S, I, O> extends CounterSUL<I, O> implements ObservableSUL<S, I, O> {
@@ -25,14 +27,18 @@ public CounterObservableSUL(ObservableSUL<S, I, O> sul) {
2527
this(sul, "");
2628
}
2729

28-
private CounterObservableSUL(ObservableSUL<S, I, O> sul, String prefix) {
29-
super(sul, prefix);
30+
public CounterObservableSUL(ObservableSUL<S, I, O> sul, String prefix) {
31+
this(sul, prefix, Statistics.getContainer());
32+
}
33+
34+
protected CounterObservableSUL(ObservableSUL<S, I, O> sul, String prefix, StatsContainer statistics) {
35+
super(sul, prefix, statistics);
3036
this.sul = sul;
3137
}
3238

3339
@Override
3440
public ObservableSUL<S, I, O> fork() {
35-
return new CounterObservableSUL<>(this.sul.fork(), super.prefix);
41+
return new CounterObservableSUL<>(this.sul.fork(), super.prefix, super.statistics);
3642
}
3743

3844
@Override

0 commit comments

Comments
 (0)