Skip to content
This repository was archived by the owner on May 30, 2024. It is now read-only.

Commit 49cf6df

Browse files
authored
Merge pull request #205 from launchdarkly/eb/ch51696/stream-store-status
(5.0 - #7) add stream logic for data store outages + improve test code
2 parents 5c179a2 + 9dbefe3 commit 49cf6df

24 files changed

+821
-598
lines changed

src/main/java/com/launchdarkly/sdk/server/DataStoreStatusProviderImpl.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,8 @@ public Status getStoreStatus() {
1818
}
1919

2020
@Override
21-
public void addStatusListener(StatusListener listener) {
22-
if (delegateTo != null) {
23-
delegateTo.addStatusListener(listener);
24-
}
21+
public boolean addStatusListener(StatusListener listener) {
22+
return delegateTo != null && delegateTo.addStatusListener(listener);
2523
}
2624

2725
@Override

src/main/java/com/launchdarkly/sdk/server/DataStoreUpdatesImpl.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.google.common.collect.ImmutableSet;
55
import com.launchdarkly.sdk.server.DataModelDependencies.KindAndKey;
66
import com.launchdarkly.sdk.server.interfaces.DataStore;
7+
import com.launchdarkly.sdk.server.interfaces.DataStoreStatusProvider;
78
import com.launchdarkly.sdk.server.interfaces.DataStoreTypes.DataKind;
89
import com.launchdarkly.sdk.server.interfaces.DataStoreTypes.FullDataSet;
910
import com.launchdarkly.sdk.server.interfaces.DataStoreTypes.ItemDescriptor;
@@ -32,10 +33,12 @@ final class DataStoreUpdatesImpl implements DataStoreUpdates {
3233
private final DataStore store;
3334
private final FlagChangeEventPublisher flagChangeEventPublisher;
3435
private final DataModelDependencies.DependencyTracker dependencyTracker = new DataModelDependencies.DependencyTracker();
35-
36+
private final DataStoreStatusProvider dataStoreStatusProvider;
37+
3638
DataStoreUpdatesImpl(DataStore store, FlagChangeEventPublisher flagChangeEventPublisher) {
3739
this.store = store;
3840
this.flagChangeEventPublisher = flagChangeEventPublisher;
41+
this.dataStoreStatusProvider = new DataStoreStatusProviderImpl(store);
3942
}
4043

4144
@Override
@@ -78,6 +81,11 @@ public void upsert(DataKind kind, String key, ItemDescriptor item) {
7881
}
7982
}
8083

84+
@Override
85+
public DataStoreStatusProvider getStatusProvider() {
86+
return dataStoreStatusProvider;
87+
}
88+
8189
private boolean hasFlagChangeEventListeners() {
8290
return flagChangeEventPublisher != null && flagChangeEventPublisher.hasListeners();
8391
}

src/main/java/com/launchdarkly/sdk/server/FeatureRequestor.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,21 @@
11
package com.launchdarkly.sdk.server;
22

3+
import com.google.common.collect.ImmutableList;
4+
import com.google.common.collect.ImmutableMap;
5+
import com.launchdarkly.sdk.server.DataModel.VersionedData;
6+
import com.launchdarkly.sdk.server.interfaces.DataStoreTypes.DataKind;
7+
import com.launchdarkly.sdk.server.interfaces.DataStoreTypes.FullDataSet;
8+
import com.launchdarkly.sdk.server.interfaces.DataStoreTypes.ItemDescriptor;
9+
import com.launchdarkly.sdk.server.interfaces.DataStoreTypes.KeyedItems;
10+
311
import java.io.Closeable;
412
import java.io.IOException;
13+
import java.util.AbstractMap;
514
import java.util.Map;
615

16+
import static com.launchdarkly.sdk.server.DataModel.FEATURES;
17+
import static com.launchdarkly.sdk.server.DataModel.SEGMENTS;
18+
719
interface FeatureRequestor extends Closeable {
820
DataModel.FeatureFlag getFlag(String featureKey) throws IOException, HttpErrorException;
921

@@ -19,5 +31,23 @@ static class AllData {
1931
this.flags = flags;
2032
this.segments = segments;
2133
}
34+
35+
FullDataSet<ItemDescriptor> toFullDataSet() {
36+
return new FullDataSet<ItemDescriptor>(ImmutableMap.of(
37+
FEATURES, toKeyedItems(FEATURES, flags),
38+
SEGMENTS, toKeyedItems(SEGMENTS, segments)
39+
).entrySet());
40+
}
41+
42+
static KeyedItems<ItemDescriptor> toKeyedItems(DataKind kind, Map<String, ? extends VersionedData> itemsMap) {
43+
ImmutableList.Builder<Map.Entry<String, ItemDescriptor>> builder = ImmutableList.builder();
44+
if (itemsMap != null) {
45+
for (Map.Entry<String, ? extends VersionedData> e: itemsMap.entrySet()) {
46+
ItemDescriptor item = new ItemDescriptor(e.getValue().getVersion(), e.getValue());
47+
builder.add(new AbstractMap.SimpleEntry<>(e.getKey(), item));
48+
}
49+
}
50+
return new KeyedItems<>(builder.build());
51+
}
2252
}
2353
}

src/main/java/com/launchdarkly/sdk/server/PollingProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public Future<Void> start() {
6464
scheduler.scheduleAtFixedRate(() -> {
6565
try {
6666
FeatureRequestor.AllData allData = requestor.getAllData();
67-
dataStoreUpdates.init(DefaultFeatureRequestor.toFullDataSet(allData));
67+
dataStoreUpdates.init(allData.toFullDataSet());
6868
if (!initialized.getAndSet(true)) {
6969
logger.info("Initialized LaunchDarkly client.");
7070
initFuture.set(null);

0 commit comments

Comments
 (0)