Skip to content

Commit 8d1792e

Browse files
committed
Merge branch 'continued-modularization_3-3' into continued-modularization
2 parents 3576c76 + 818b501 commit 8d1792e

67 files changed

Lines changed: 329 additions & 246 deletions

File tree

Some content is hidden

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

client/pom.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,21 @@
172172
<artifactId>targeting-engine</artifactId>
173173
<version>${project.version}</version>
174174
</dependency>
175+
<dependency>
176+
<groupId>io.split.client</groupId>
177+
<artifactId>parsing-commons</artifactId>
178+
<version>${project.version}</version>
179+
</dependency>
180+
<dependency>
181+
<groupId>io.split.client</groupId>
182+
<artifactId>storage-commons</artifactId>
183+
<version>${project.version}</version>
184+
</dependency>
185+
<dependency>
186+
<groupId>io.split.client</groupId>
187+
<artifactId>segment-commons</artifactId>
188+
<version>${project.version}</version>
189+
</dependency>
175190
<dependency>
176191
<groupId>io.split.client</groupId>
177192
<artifactId>pluggable-storage</artifactId>

client/src/main/java/io/split/client/CacheUpdaterService.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import io.split.storages.SplitCacheProducer;
1313

1414
import java.util.ArrayList;
15+
import java.util.Arrays;
1516
import java.util.HashSet;
1617
import java.util.List;
1718
import java.util.Map;
@@ -77,9 +78,9 @@ private List<ParsedCondition> getConditions(String splitKey, ParsedSplit split,
7778
private ParsedCondition createWhitelistCondition(String splitKey, Partition partition) {
7879
ParsedCondition parsedCondition = new ParsedCondition(ConditionType.WHITELIST,
7980
new CombiningMatcher(CombiningMatcher.Combiner.AND,
80-
new java.util.ArrayList<>(java.util.Arrays.asList(
81-
new AttributeMatcher(null, new WhitelistMatcher(java.util.Arrays.asList(splitKey)), false)))),
82-
new java.util.ArrayList<>(java.util.Arrays.asList(partition)), splitKey);
81+
new ArrayList<>(Arrays.asList(
82+
new AttributeMatcher(null, new WhitelistMatcher(Arrays.asList(splitKey)), false)))),
83+
new ArrayList<>(Arrays.asList(partition)), splitKey);
8384
return parsedCondition;
8485
}
8586

@@ -89,8 +90,8 @@ private ParsedCondition createRolloutCondition(Partition partition) {
8990
rolloutPartition.size = 0;
9091
ParsedCondition parsedCondition = new ParsedCondition(ConditionType.ROLLOUT,
9192
new CombiningMatcher(CombiningMatcher.Combiner.AND,
92-
new java.util.ArrayList<>(java.util.Arrays.asList(new AttributeMatcher(null, new AllKeysMatcher(), false)))),
93-
new java.util.ArrayList<>(java.util.Arrays.asList(partition, rolloutPartition)), "LOCAL");
93+
new ArrayList<>(Arrays.asList(new AttributeMatcher(null, new AllKeysMatcher(), false)))),
94+
new ArrayList<>(Arrays.asList(partition, rolloutPartition)), "LOCAL");
9495

9596
return parsedCondition;
9697
}

client/src/main/java/io/split/client/SplitFactoryImpl.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,10 @@
5757
import io.split.engine.experiments.SplitParser;
5858
import io.split.engine.experiments.SplitSynchronizationTask;
5959
import io.split.engine.experiments.RuleBasedSegmentParser;
60+
import io.split.engine.segments.ExecutorFactory;
6061
import io.split.engine.segments.SegmentChangeFetcher;
6162
import io.split.engine.segments.SegmentSynchronizationTaskImp;
63+
import io.split.engine.segments.TelemetryListener;
6264
import io.split.integrations.IntegrationsConfig;
6365
import io.split.service.SplitHttpClientImpl;
6466
import io.split.service.SplitHttpClient;
@@ -85,6 +87,7 @@
8587
import io.split.storages.pluggable.adapters.UserCustomRuleBasedSegmentAdapterConsumer;
8688
import io.split.storages.pluggable.domain.UserStorageWrapper;
8789
import io.split.storages.pluggable.synchronizer.TelemetryConsumerSubmitter;
90+
import io.split.telemetry.domain.enums.LastSynchronizationRecordsEnum;
8891
import io.split.telemetry.storage.InMemoryTelemetryStorage;
8992
import io.split.telemetry.storage.NoopTelemetryStorage;
9093
import io.split.telemetry.storage.TelemetryStorage;
@@ -129,6 +132,7 @@
129132
import java.util.List;
130133
import java.util.ArrayList;
131134

135+
import io.split.client.utils.SplitExecutorFactory;
132136
import static io.split.client.utils.SplitExecutorFactory.buildExecutorService;
133137

134138
public class SplitFactoryImpl implements SplitFactory {
@@ -427,12 +431,17 @@ protected SplitFactoryImpl(SplitClientConfig config) {
427431
segmentChangeFetcher = new LocalhostSegmentChangeFetcher(config.segmentDirectory());
428432
}
429433

434+
TelemetryListener segmentTelemetryListener =
435+
t -> _telemetryStorageProducer.recordSuccessfulSync(LastSynchronizationRecordsEnum.SEGMENTS, t);
436+
ExecutorFactory segmentExecutorFactory =
437+
(tf, name, n) -> SplitExecutorFactory.buildScheduledExecutorService(tf, name, n);
430438
_segmentSynchronizationTaskImp = new SegmentSynchronizationTaskImp(segmentChangeFetcher,
431439
config.segmentsRefreshRate(),
432440
config.numThreadsForSegmentFetch(),
433441
segmentCache,
434-
_telemetryStorageProducer,
442+
segmentTelemetryListener,
435443
_splitCache,
444+
segmentExecutorFactory,
436445
config.getThreadFactory(),
437446
ruleBasedSegmentCache);
438447

@@ -696,12 +705,17 @@ private SegmentSynchronizationTaskImp buildSegments(SplitClientConfig config,
696705
SegmentChangeFetcher segmentChangeFetcher = HttpSegmentChangeFetcher.create(_splitHttpClient, _rootTarget,
697706
_telemetryStorageProducer);
698707

708+
TelemetryListener segTelemetryListener =
709+
t -> _telemetryStorageProducer.recordSuccessfulSync(LastSynchronizationRecordsEnum.SEGMENTS, t);
710+
ExecutorFactory segExecutorFactory =
711+
(tf, name, n) -> SplitExecutorFactory.buildScheduledExecutorService(tf, name, n);
699712
return new SegmentSynchronizationTaskImp(segmentChangeFetcher,
700713
config.segmentsRefreshRate(),
701714
config.numThreadsForSegmentFetch(),
702715
segmentCacheProducer,
703-
_telemetryStorageProducer,
716+
segTelemetryListener,
704717
splitCacheConsumer,
718+
segExecutorFactory,
705719
config.getThreadFactory(),
706720
ruleBasedSegmentCache);
707721
}

client/src/main/java/io/split/engine/evaluator/EvaluationContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public RuleBasedSegmentCacheConsumer getRuleBasedSegmentCache() {
3838
@Override
3939
public EvaluationResult evaluate(String matchingKey, String bucketingKey, String ruleName, Map<String, Object> attributes) {
4040
EvaluatorImp.TreatmentLabelAndChangeNumber r = _evaluator.evaluateFeature(matchingKey, bucketingKey, ruleName, attributes);
41-
return new EvaluationResult(r.treatment, r.label, r.changeNumber, r.configurations, r.track);
41+
return new EvaluationResult(r.treatment, r.label);
4242
}
4343

4444
@Override

client/src/main/java/io/split/engine/evaluator/EvaluatorImp.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,12 @@ private TreatmentLabelAndChangeNumber getTreatment(String matchingKey, String bu
116116
try {
117117
EvaluationResult r = _targetingEngine.evaluate(matchingKey, bucketingKey,
118118
parsedSplit.targetingRule(), attributes, _evaluationContext);
119-
return new TreatmentLabelAndChangeNumber(r.treatment, r.label, r.version, r.config, r.impressionsDisabled);
119+
String config = parsedSplit.configurations() != null
120+
? parsedSplit.configurations().get(r.treatment) : null;
121+
return new TreatmentLabelAndChangeNumber(r.treatment, r.label,
122+
parsedSplit.changeNumber(), config, parsedSplit.impressionsDisabled());
120123
} catch (VersionedExceptionWrapper e) {
121-
throw new ChangeNumberExceptionWrapper(e.wrappedException(), e.version());
124+
throw new ChangeNumberExceptionWrapper(e.wrappedException(), parsedSplit.changeNumber());
122125
}
123126
}
124127

client/src/main/java/io/split/engine/experiments/ParsedSplit.java

Lines changed: 9 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,9 @@ public static ParsedSplit createParsedSplitForTests(
6868
flagSets,
6969
impressionsDisabled,
7070
prerequisitesMatcher,
71-
buildTargetingRule(feature, seed, killed, defaultTreatment, matcherAndSplits, trafficTypeName,
72-
changeNumber, 100, seed, algo, null, flagSets, impressionsDisabled, prerequisitesMatcher)
71+
TargetingRuleFactory.buildTargetingRule(seed, killed, defaultTreatment, matcherAndSplits,
72+
100, seed, algo,
73+
prerequisitesMatcher == null ? Collections.emptyList() : prerequisitesMatcher.getPrerequisites())
7374
);
7475
}
7576

@@ -102,8 +103,9 @@ public static ParsedSplit createParsedSplitForTests(
102103
flagSets,
103104
impressionsDisabled,
104105
prerequisitesMatcher,
105-
buildTargetingRule(feature, seed, killed, defaultTreatment, matcherAndSplits, trafficTypeName,
106-
changeNumber, 100, seed, algo, configurations, flagSets, impressionsDisabled, prerequisitesMatcher)
106+
TargetingRuleFactory.buildTargetingRule(seed, killed, defaultTreatment, matcherAndSplits,
107+
100, seed, algo,
108+
prerequisitesMatcher == null ? Collections.emptyList() : prerequisitesMatcher.getPrerequisites())
107109
);
108110
}
109111

@@ -126,9 +128,9 @@ public ParsedSplit(
126128
this(feature, seed, killed, defaultTreatment, matcherAndSplits, trafficTypeName, changeNumber,
127129
trafficAllocation, trafficAllocationSeed, algo, configurations, flagSets,
128130
impressionsDisabled, prerequisitesMatcher,
129-
buildTargetingRule(feature, seed, killed, defaultTreatment, matcherAndSplits, trafficTypeName,
130-
changeNumber, trafficAllocation, trafficAllocationSeed, algo, configurations,
131-
flagSets, impressionsDisabled, prerequisitesMatcher));
131+
TargetingRuleFactory.buildTargetingRule(seed, killed, defaultTreatment, matcherAndSplits,
132+
trafficAllocation, trafficAllocationSeed, algo,
133+
prerequisitesMatcher == null ? Collections.emptyList() : prerequisitesMatcher.getPrerequisites()));
132134
}
133135

134136
public ParsedSplit(
@@ -284,39 +286,6 @@ public String toString() {
284286

285287
}
286288

287-
private static TargetingRule buildTargetingRule(
288-
String feature, int seed, boolean killed, String defaultTreatment,
289-
List<ParsedCondition> matcherAndSplits, String trafficTypeName, long changeNumber,
290-
int trafficAllocation, int trafficAllocationSeed, int algo,
291-
Map<String, String> configurations, HashSet<String> flagSets,
292-
boolean impressionsDisabled, PrerequisitesMatcher prerequisitesMatcher) {
293-
List<io.split.rules.model.Condition> conditions = matcherAndSplits == null
294-
? Collections.<io.split.rules.model.Condition>emptyList()
295-
: matcherAndSplits.stream()
296-
.map(ParsedSplit::toTargetingCondition)
297-
.collect(Collectors.toList());
298-
List<io.split.rules.model.Prerequisite> prereqs = prerequisitesMatcher == null
299-
? Collections.<io.split.rules.model.Prerequisite>emptyList()
300-
: prerequisitesMatcher.getPrerequisites() == null
301-
? Collections.<io.split.rules.model.Prerequisite>emptyList()
302-
: Collections.unmodifiableList(prerequisitesMatcher.getPrerequisites());
303-
return new TargetingRule(feature, seed, killed, defaultTreatment, conditions, trafficTypeName,
304-
changeNumber, trafficAllocation, trafficAllocationSeed, algo, configurations,
305-
flagSets == null ? new java.util.HashSet<>() : flagSets, impressionsDisabled, prereqs);
306-
}
307-
308-
private static io.split.rules.model.Condition toTargetingCondition(ParsedCondition c) {
309-
List<io.split.rules.model.Partition> partitions = c.partitions() == null
310-
? Collections.<io.split.rules.model.Partition>emptyList()
311-
: c.partitions().stream()
312-
.map(p -> new io.split.rules.model.Partition(p.treatment, p.size))
313-
.collect(Collectors.toList());
314-
io.split.rules.model.ConditionType condType = c.conditionType() == ConditionType.ROLLOUT
315-
? io.split.rules.model.ConditionType.ROLLOUT
316-
: io.split.rules.model.ConditionType.WHITELIST;
317-
return new io.split.rules.model.Condition(condType, c.matcher(), partitions, c.label());
318-
}
319-
320289
public Set<String> getSegmentsNames() {
321290
return parsedConditions().stream()
322291
.flatMap(parsedCondition -> parsedCondition.matcher().attributeMatchers().stream())

client/src/main/java/io/split/engine/experiments/SplitParser.java

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

33
import java.util.ArrayList;
44
import java.util.Collections;
5-
import java.util.HashSet;
65
import java.util.List;
76
import java.util.Objects;
87
import java.util.stream.Collectors;
@@ -75,19 +74,13 @@ private ParsedSplit parseWithoutExceptionHandling(Split split) {
7574
.collect(Collectors.toList());
7675

7776
TargetingRule targetingRule = new TargetingRule(
78-
split.name,
7977
split.seed,
8078
split.killed,
8179
split.defaultTreatment,
8280
targetingConditionList,
83-
split.trafficTypeName,
84-
split.changeNumber,
8581
split.trafficAllocation,
8682
split.trafficAllocationSeed,
8783
split.algo,
88-
split.configurations,
89-
split.sets == null ? new java.util.HashSet<>() : split.sets,
90-
split.impressionsDisabled,
9184
prerequisites);
9285

9386
return new ParsedSplit(
Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package io.split.storages;
22

3-
import java.util.Set;
4-
5-
public interface SplitCacheCommons {
3+
public interface SplitCacheCommons extends SegmentsProvider {
64
long getChangeNumber();
7-
Set<String> getSegments();
85
}

client/src/test/java/io/split/engine/common/LocalhostSynchronizerTest.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
import io.split.client.utils.FileInputStreamProvider;
88
import io.split.client.utils.InputStreamProvider;
99
import io.split.engine.experiments.*;
10+
import io.split.engine.segments.ExecutorFactory;
1011
import io.split.engine.segments.SegmentChangeFetcher;
1112
import io.split.engine.segments.SegmentSynchronizationTaskImp;
13+
import io.split.engine.segments.TelemetryListener;
1214
import io.split.storages.*;
1315
import io.split.storages.memory.InMemoryCacheImp;
1416
import io.split.storages.memory.RuleBasedSegmentCacheInMemoryImp;
@@ -24,6 +26,8 @@
2426
public class LocalhostSynchronizerTest {
2527

2628
private static final TelemetryStorage TELEMETRY_STORAGE_NOOP = Mockito.mock(NoopTelemetryStorage.class);
29+
private static final TelemetryListener TELEMETRY_LISTENER = t -> {};
30+
private static final ExecutorFactory EXECUTOR_FACTORY = (tf, name, n) -> java.util.concurrent.Executors.newScheduledThreadPool(n);
2731
private static final FlagSetsFilter FLAG_SETS_FILTER = new FlagSetsFilterImpl(new HashSet<>());
2832

2933
@Test
@@ -45,7 +49,7 @@ public void testSyncAll(){
4549
SegmentCacheProducer segmentCacheProducer = new SegmentCacheInMemoryImpl();
4650

4751
SegmentSynchronizationTaskImp segmentSynchronizationTaskImp = new SegmentSynchronizationTaskImp(segmentChangeFetcher, 1000, 1, segmentCacheProducer,
48-
TELEMETRY_STORAGE_NOOP, splitCacheProducer, null, ruleBasedSegmentCache);
52+
TELEMETRY_LISTENER, splitCacheProducer, EXECUTOR_FACTORY, null, ruleBasedSegmentCache);
4953
SplitTasks splitTasks = SplitTasks.build(splitSynchronizationTask, segmentSynchronizationTaskImp, null, null, null, null);
5054

5155
LocalhostSynchronizer localhostSynchronizer = new LocalhostSynchronizer(splitTasks, splitFetcher, false);
@@ -72,7 +76,7 @@ public void testPeriodicFetching() throws InterruptedException {
7276
SegmentCacheProducer segmentCacheProducer = new SegmentCacheInMemoryImpl();
7377

7478
SegmentSynchronizationTaskImp segmentSynchronizationTaskImp = new SegmentSynchronizationTaskImp(segmentChangeFetcher, 1000, 1, segmentCacheProducer,
75-
TELEMETRY_STORAGE_NOOP, splitCacheProducer, null, ruleBasedSegmentCache);
79+
TELEMETRY_LISTENER, splitCacheProducer, EXECUTOR_FACTORY, null, ruleBasedSegmentCache);
7680

7781
SplitTasks splitTasks = SplitTasks.build(splitSynchronizationTask, segmentSynchronizationTaskImp, null, null, null, null);
7882
LocalhostSynchronizer localhostSynchronizer = new LocalhostSynchronizer(splitTasks, splitFetcher, true);

client/src/test/java/io/split/engine/common/SynchronizerTest.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
import io.split.client.impressions.UniqueKeysTracker;
66
import io.split.client.interceptors.FlagSetsFilter;
77
import io.split.client.interceptors.FlagSetsFilterImpl;
8+
import io.split.engine.segments.ExecutorFactory;
89
import io.split.engine.segments.SegmentChangeFetcher;
910
import io.split.engine.segments.SegmentSynchronizationTaskImp;
11+
import io.split.engine.segments.TelemetryListener;
1012
import io.split.storages.*;
1113
import io.split.storages.memory.InMemoryCacheImp;
1214
import io.split.engine.experiments.FetchResult;
@@ -81,9 +83,11 @@ public void syncAll() throws InterruptedException {
8183

8284
@Test
8385
public void testSyncAllSegments() throws InterruptedException, NoSuchFieldException, IllegalAccessException {
86+
ExecutorFactory executorFactory = (tf, name, n) -> java.util.concurrent.Executors.newScheduledThreadPool(n);
87+
TelemetryListener telemetryListener = t -> {};
8488
SegmentSynchronizationTask segmentSynchronizationTask = new SegmentSynchronizationTaskImp(Mockito.mock(SegmentChangeFetcher.class),
85-
20L, 1, _segmentCacheProducer, Mockito.mock(TelemetryRuntimeProducer.class),
86-
Mockito.mock(SplitCacheConsumer.class), null, Mockito.mock(RuleBasedSegmentCache.class));
89+
20L, 1, _segmentCacheProducer, telemetryListener,
90+
Mockito.mock(SplitCacheConsumer.class), executorFactory, null, Mockito.mock(RuleBasedSegmentCache.class));
8791
Field synchronizerSegmentFetcher = SynchronizerImp.class.getDeclaredField("_segmentSynchronizationTaskImp");
8892
synchronizerSegmentFetcher.setAccessible(true);
8993
Field modifiersField = Field.class.getDeclaredField("modifiers");

0 commit comments

Comments
 (0)