Skip to content

Commit 102b04e

Browse files
authored
feat: update sticky proto (#282)
* fixup! update sticky proto
1 parent c557854 commit 102b04e

File tree

5 files changed

+44
-36
lines changed

5 files changed

+44
-36
lines changed

confidence-proto/src/main/proto/confidence/wasm/wasm_api.proto

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@ message ResolveWithStickyRequest {
2020
ResolveFlagsRequest resolve_request = 1;
2121

2222
// Context about the materialization required for the resolve
23-
MaterializationContext materialization_context = 7;
23+
map<string, MaterializationMap> materializations_per_unit = 2;
2424

2525
// if a materialization info is missing, we want to return to the caller immediately
26-
bool fail_fast_on_sticky = 8;
26+
bool fail_fast_on_sticky = 3;
2727
}
2828

29-
message MaterializationContext {
30-
map<string, MaterializationInfo> unit_materialization_info = 1;
29+
message MaterializationMap {
30+
// materialization name to info
31+
map<string, MaterializationInfo> info_map = 1;
3132
}
3233

3334
message MaterializationInfo {

openfeature-provider-local/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<maven.compiler.source>17</maven.compiler.source>
2020
<maven.compiler.target>17</maven.compiler.target>
2121
<!-- WASM file version. When updated, make sure to mvn clean to force a new download -->
22-
<confidence.resolver.wasm.version>v0.3.1</confidence.resolver.wasm.version>
22+
<confidence.resolver.wasm.version>v0.4.0</confidence.resolver.wasm.version>
2323
</properties>
2424

2525

openfeature-provider-local/src/main/java/com/spotify/confidence/MaterializationRepository.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package com.spotify.confidence;
22

3-
import java.util.List;
43
import java.util.Map;
54
import java.util.concurrent.CompletableFuture;
65

76
public non-sealed interface MaterializationRepository extends StickyResolveStrategy {
87
CompletableFuture<Map<String, MaterializationInfo>> loadMaterializedAssignmentsForUnit(
9-
String unit, Map<String, List<String>> materializationsToRules);
8+
String unit, String materialization);
109

1110
CompletableFuture<Void> storeAssignment(
1211
String unit, Map<String, MaterializationInfo> assignments);

openfeature-provider-local/src/main/java/com/spotify/confidence/SwapWasmResolverApi.java

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.spotify.confidence;
22

3+
import com.spotify.confidence.flags.resolver.v1.MaterializationMap;
34
import com.spotify.confidence.flags.resolver.v1.ResolveWithStickyRequest;
45
import com.spotify.confidence.flags.resolver.v1.ResolveWithStickyResponse;
56
import com.spotify.confidence.shaded.flags.resolver.v1.ResolveFlagsRequest;
@@ -8,6 +9,7 @@
89
import java.util.List;
910
import java.util.Map;
1011
import java.util.concurrent.CompletableFuture;
12+
import java.util.concurrent.ExecutionException;
1113
import java.util.concurrent.atomic.AtomicReference;
1214
import java.util.concurrent.locks.ReentrantLock;
1315
import java.util.stream.Collectors;
@@ -147,36 +149,46 @@ private ResolveWithStickyRequest handleMissingMaterializations(
147149
missingItems.stream()
148150
.collect(
149151
Collectors.groupingBy(
150-
ResolveWithStickyResponse.MissingMaterializationItem::getUnit,
151-
Collectors.toMap(
152-
ResolveWithStickyResponse.MissingMaterializationItem
153-
::getReadMaterialization,
154-
item -> List.of(item.getRule()),
155-
(existing, replacement) -> {
156-
final var combined = new java.util.ArrayList<>(existing);
157-
combined.addAll(replacement);
158-
return combined;
159-
})));
152+
ResolveWithStickyResponse.MissingMaterializationItem::getUnit));
160153

161-
// Load materialized assignments for all missing units
162-
final var materializationContext = request.getMaterializationContext().toBuilder();
154+
final HashMap<String, MaterializationMap> materializationPerUnitMap = new HashMap<>();
163155

156+
// Load materialized assignments for all missing units
164157
missingByUnit.forEach(
165-
(unit, materializationsToRules) -> {
166-
try {
167-
final var loadedAssignments =
168-
repository.loadMaterializedAssignmentsForUnit(unit, materializationsToRules).get();
169-
loadedAssignments.forEach(
170-
(materialization, info) ->
171-
materializationContext.putUnitMaterializationInfo(unit, info.toProto()));
172-
} catch (Exception e) {
173-
throw new RuntimeException(
174-
"Failed to load materialized assignments for unit: " + unit, e);
175-
}
158+
(unit, materializationInfoItem) -> {
159+
materializationInfoItem.forEach(
160+
item -> {
161+
final Map<String, MaterializationInfo> loadedAssignments;
162+
try {
163+
loadedAssignments =
164+
repository
165+
.loadMaterializedAssignmentsForUnit(unit, item.getReadMaterialization())
166+
.get();
167+
} catch (InterruptedException | ExecutionException e) {
168+
throw new RuntimeException(e);
169+
}
170+
materializationPerUnitMap.put(
171+
unit,
172+
MaterializationMap.newBuilder()
173+
.putAllInfoMap(
174+
loadedAssignments.entrySet().stream()
175+
.collect(
176+
Collectors.toMap(
177+
Map.Entry::getKey,
178+
e -> {
179+
final var info = e.getValue();
180+
return com.spotify.confidence.flags.resolver.v1
181+
.MaterializationInfo.newBuilder()
182+
.setUnitInInfo(info.isUnitInMaterialization())
183+
.putAllRuleToVariant(info.ruleToVariant())
184+
.build();
185+
})))
186+
.build());
187+
});
176188
});
177189

178190
// Return new request with updated materialization context
179-
return request.toBuilder().setMaterializationContext(materializationContext.build()).build();
191+
return request.toBuilder().putAllMaterializationsPerUnit(materializationPerUnitMap).build();
180192
}
181193

182194
public ResolveFlagsResponse resolve(ResolveFlagsRequest request) {

openfeature-provider-local/src/test/java/com/spotify/confidence/WasmResolveTest.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import static org.junit.jupiter.api.Assertions.assertNull;
55
import static org.junit.jupiter.api.Assertions.assertTrue;
66
import static org.mockito.ArgumentMatchers.any;
7-
import static org.mockito.ArgumentMatchers.eq;
87
import static org.mockito.Mockito.mock;
98
import static org.mockito.Mockito.verify;
109
import static org.mockito.Mockito.when;
@@ -19,7 +18,6 @@
1918
import dev.openfeature.sdk.ImmutableContext;
2019
import dev.openfeature.sdk.ProviderEvaluation;
2120
import dev.openfeature.sdk.Value;
22-
import java.util.List;
2321
import java.util.Map;
2422
import java.util.concurrent.CompletableFuture;
2523
import org.junit.jupiter.api.Test;
@@ -145,8 +143,6 @@ public void testMaterializationRepositoryWhenMaterializationsMissing() {
145143
assertEquals("on", structure.getValue("data").asString());
146144

147145
// Assert that the materialization repository was called with correct input
148-
verify(mockRepository)
149-
.loadMaterializedAssignmentsForUnit(
150-
eq("test-user"), eq(Map.of("read-mat", List.of("MyRule"))));
146+
verify(mockRepository).loadMaterializedAssignmentsForUnit("test-user", "read-mat");
151147
}
152148
}

0 commit comments

Comments
 (0)