Skip to content

Commit 67e770a

Browse files
authored
Merge pull request #551 from splitio/rbs-oldspec-storage
updated storage, localhost and tests
2 parents 65958cb + 39325f8 commit 67e770a

15 files changed

+697
-46
lines changed

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

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@
55
import io.split.Spec;
66
import io.split.client.dtos.SplitChange;
77
import io.split.client.dtos.SplitHttpResponse;
8-
import io.split.client.dtos.RuleBasedSegment;
98
import io.split.client.dtos.SplitChangesOldPayloadDto;
10-
import io.split.client.dtos.ChangeDto;
11-
import io.split.client.dtos.Split;
129
import io.split.client.exceptions.UriTooLongException;
1310
import io.split.client.utils.Json;
1411
import io.split.client.utils.Utils;
@@ -25,7 +22,6 @@
2522

2623
import java.net.URI;
2724
import java.net.URISyntaxException;
28-
import java.util.ArrayList;
2925

3026
import static com.google.common.base.Preconditions.checkNotNull;
3127
import static io.split.Spec.SPEC_1_3;
@@ -91,7 +87,7 @@ public SplitChange fetch(long since, long sinceRBS, FetchOptions options) {
9187
_log.warn("Detected proxy without support for Feature flags spec {} version, will switch to spec version {}",
9288
SPEC_1_3, SPEC_1_1);
9389
_lastProxyCheckTimestamp = System.currentTimeMillis();
94-
return fetch(since, 0, options);
90+
return fetch(since, sinceRBS, options);
9591
}
9692

9793
_telemetryRuntimeProducer.recordSyncError(ResourceEnum.SPLIT_SYNC, response.statusCode());
@@ -100,30 +96,21 @@ public SplitChange fetch(long since, long sinceRBS, FetchOptions options) {
10096
);
10197
}
10298

103-
String body = response.body();
10499
if (specVersion.equals(Spec.SPEC_1_1)) {
105-
return Json.fromJson(body, SplitChangesOldPayloadDto.class).toSplitChange();
100+
return Json.fromJson(response.body(), SplitChangesOldPayloadDto.class).toSplitChange();
106101
}
107102

108-
return Json.fromJson(body, SplitChange.class);
109-
103+
SplitChange splitChange = Json.fromJson(response.body(), SplitChange.class);
104+
splitChange.clearCache = _lastProxyCheckTimestamp != 0;
105+
_lastProxyCheckTimestamp = 0L;
106+
return splitChange;
110107
} catch (Exception e) {
111108
throw new IllegalStateException(String.format("Problem fetching splitChanges since %s: %s", since, e), e);
112109
} finally {
113110
_telemetryRuntimeProducer.recordSyncLatency(HTTPLatenciesEnum.SPLITS, System.currentTimeMillis() - start);
114111
}
115112
}
116113

117-
public Long getLastProxyCheckTimestamp() {
118-
return _lastProxyCheckTimestamp;
119-
}
120-
121-
public void setLastProxyCheckTimestamp(long lastProxyCheckTimestamp) {
122-
synchronized (_lock) {
123-
_lastProxyCheckTimestamp = lastProxyCheckTimestamp;
124-
}
125-
}
126-
127114

128115
private URI buildURL(FetchOptions options, long since, long sinceRBS) throws URISyntaxException {
129116
URIBuilder uriBuilder = new URIBuilder(_target).addParameter(SPEC, "" + specVersion);

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package io.split.client;
22

3+
import com.google.gson.JsonObject;
34
import com.google.gson.stream.JsonReader;
45
import io.split.client.dtos.SplitChange;
6+
import io.split.client.dtos.SplitChangesOldPayloadDto;
57
import io.split.client.utils.InputStreamProvider;
68
import io.split.client.utils.Json;
79
import io.split.client.utils.LocalhostSanitizer;
@@ -37,13 +39,20 @@ public JsonLocalhostSplitChangeFetcher(InputStreamProvider inputStreamProvider)
3739
public SplitChange fetch(long since, long sinceRBS, FetchOptions options) {
3840
try {
3941
JsonReader jsonReader = new JsonReader(new BufferedReader(new InputStreamReader(_inputStreamProvider.get(), StandardCharsets.UTF_8)));
42+
if (checkOldSpec(new JsonReader(new BufferedReader(new InputStreamReader(_inputStreamProvider.get(), StandardCharsets.UTF_8))))) {
43+
return Json.fromJson(jsonReader, SplitChangesOldPayloadDto.class).toSplitChange();
44+
}
4045
SplitChange splitChange = Json.fromJson(jsonReader, SplitChange.class);
4146
return processSplitChange(splitChange, since, sinceRBS);
4247
} catch (Exception e) {
4348
throw new IllegalStateException("Problem fetching splitChanges: " + e.getMessage(), e);
4449
}
4550
}
4651

52+
private boolean checkOldSpec(JsonReader jsonReader) {
53+
return Json.fromJson(jsonReader, JsonObject.class).has("splits");
54+
}
55+
4756
private SplitChange processSplitChange(SplitChange splitChange, long changeNumber, long changeNumberRBS) throws NoSuchAlgorithmException {
4857
SplitChange splitChangeToProcess = LocalhostSanitizer.sanitization(splitChange);
4958
// if the till is less than storage CN and different from the default till ignore the change

client/src/main/java/io/split/client/dtos/ChangeDto.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.split.client.dtos;
22

3+
import java.util.ArrayList;
34
import java.util.List;
45

56
public class ChangeDto<T> {

client/src/main/java/io/split/client/dtos/RuleBasedSegmentChange.java

Lines changed: 0 additions & 9 deletions
This file was deleted.

client/src/main/java/io/split/client/dtos/SplitChange.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ public class SplitChange {
77
public ChangeDto<Split> featureFlags;
88
@SerializedName("rbs")
99
public ChangeDto<RuleBasedSegment> ruleBasedSegments;
10+
public boolean clearCache;
1011
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,11 @@ private Set<String> runWithoutExceptionHandling(FetchOptions options) throws Int
122122
throw new IllegalStateException("SplitChange was null");
123123
}
124124

125+
if (change.clearCache) {
126+
_splitCacheProducer.clear();
127+
_ruleBasedSegmentCacheProducer.clear();
128+
}
129+
125130
if (checkExitConditions(change.featureFlags, _splitCacheProducer.getChangeNumber()) ||
126131
checkExitConditions(change.ruleBasedSegments, _ruleBasedSegmentCacheProducer.getChangeNumber())) {
127132
return segments;

client/src/main/java/io/split/storages/RuleBasedSegmentCacheProducer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ public interface RuleBasedSegmentCacheProducer {
99
void setChangeNumber(long changeNumber);
1010
long getChangeNumber();
1111
void update(List<ParsedRuleBasedSegment> toAdd, List<String> toRemove, long changeNumber);
12+
void clear();
1213
}

client/src/main/java/io/split/storages/memory/InMemoryCacheImp.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,9 @@ public void kill(String splitName, String defaultTreatment, long changeNumber) {
140140
@Override
141141
public void clear() {
142142
_concurrentMap.clear();
143+
_changeNumber.set(-1);
143144
_concurrentTrafficTypeNameSet.clear();
145+
_flagSets.clear();
144146
}
145147

146148
@Override

client/src/main/java/io/split/storages/memory/RuleBasedSegmentCacheInMemoryImp.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ public List<String> ruleBasedSegmentNames() {
7171
return ruleBasedSegmentNamesList;
7272
}
7373

74+
@Override
7475
public void clear() {
76+
_changeNumber.set(-1);
7577
_concurrentMap.clear();
7678
}
7779

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package io.split.storages.pluggable.adapters;
2+
3+
import io.split.client.dtos.RuleBasedSegment;
4+
import io.split.client.utils.Json;
5+
import io.split.engine.experiments.ParsedRuleBasedSegment;
6+
import io.split.storages.RuleBasedSegmentCacheProducer;
7+
import io.split.storages.pluggable.domain.PrefixAdapter;
8+
import io.split.storages.pluggable.domain.UserStorageWrapper;
9+
import io.split.storages.pluggable.utils.Helper;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
12+
import pluggable.CustomStorageWrapper;
13+
14+
import java.util.HashSet;
15+
import java.util.List;
16+
import java.util.Set;
17+
18+
import static com.google.common.base.Preconditions.checkNotNull;
19+
20+
public class UserCustomRuleBasedSegmentAdapterProducer implements RuleBasedSegmentCacheProducer {
21+
22+
private static final Logger _log = LoggerFactory.getLogger(UserCustomRuleBasedSegmentAdapterProducer.class);
23+
24+
private final UserStorageWrapper _userStorageWrapper;
25+
26+
public UserCustomRuleBasedSegmentAdapterProducer(CustomStorageWrapper customStorageWrapper) {
27+
_userStorageWrapper = new UserStorageWrapper(checkNotNull(customStorageWrapper));
28+
}
29+
30+
@Override
31+
public long getChangeNumber() {
32+
String wrapperResponse = _userStorageWrapper.get(PrefixAdapter.buildRuleBasedSegmentChangeNumber());
33+
return Helper.responseToLong(wrapperResponse, -1L);
34+
}
35+
36+
@Override
37+
public boolean remove(String ruleBasedSegmentName) {
38+
// NoOp
39+
return true;
40+
}
41+
42+
@Override
43+
public void setChangeNumber(long changeNumber) {
44+
//NoOp
45+
}
46+
47+
@Override
48+
public void clear() {
49+
//NoOp
50+
}
51+
52+
@Override
53+
public void update(List<ParsedRuleBasedSegment> toAdd, List<String> toRemove, long changeNumber) {
54+
//NoOp
55+
}
56+
57+
public Set<String> getSegments() {
58+
//NoOp
59+
return new HashSet<>();
60+
}
61+
}

0 commit comments

Comments
 (0)