Skip to content

Commit 608c21c

Browse files
committed
refactor creating snapshot resources due to performance improvements
Signed-off-by: radoslaw.chrzanowski <[email protected]>
1 parent 68d2764 commit 608c21c

File tree

2 files changed

+50
-48
lines changed

2 files changed

+50
-48
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.envoyproxy.controlplane.cache;
2+
3+
import com.google.common.collect.ImmutableMap;
4+
import com.google.protobuf.Message;
5+
6+
class ResourceMapBuilder<T extends Message> {
7+
8+
private final ImmutableMap.Builder<String, VersionedResource<T>> versionedResources = ImmutableMap.builder();
9+
private final ImmutableMap.Builder<String, T> resources = ImmutableMap.builder();
10+
11+
12+
ImmutableMap<String, VersionedResource<T>> getVersionedResources() {
13+
return versionedResources.build();
14+
}
15+
16+
ImmutableMap<String, T> getResources() {
17+
return resources.build();
18+
}
19+
20+
void put(Object resource) {
21+
if (resource instanceof VersionedResource) {
22+
VersionedResource<T> eCast = (VersionedResource<T>) resource;
23+
versionedResources.put(Resources.getResourceName(eCast.resource()), eCast);
24+
resources.put(Resources.getResourceName(eCast.resource()), eCast.resource());
25+
} else {
26+
T eCast = (T) resource;
27+
versionedResources.put(Resources.getResourceName(eCast), VersionedResource.create(eCast));
28+
resources.put(Resources.getResourceName(eCast), eCast);
29+
}
30+
}
31+
32+
ResourceMapBuilder<T> putAll(ResourceMapBuilder<T> other) {
33+
versionedResources.putAll(other.getVersionedResources());
34+
resources.putAll(other.getResources());
35+
return this;
36+
}
37+
}

cache/src/main/java/io/envoyproxy/controlplane/cache/SnapshotResources.java

Lines changed: 13 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
package io.envoyproxy.controlplane.cache;
22

33
import com.google.auto.value.AutoValue;
4-
import com.google.common.base.Predicates;
5-
import com.google.common.collect.ImmutableMap;
6-
import com.google.common.collect.ImmutableMap.Builder;
74
import com.google.protobuf.Message;
85
import java.util.List;
96
import java.util.Map;
107
import java.util.stream.Collector;
11-
import java.util.stream.Collectors;
128
import java.util.stream.StreamSupport;
139

1410
@AutoValue
@@ -24,10 +20,10 @@ public abstract class SnapshotResources<T extends Message> {
2420
public static <T extends Message> SnapshotResources<T> create(
2521
Iterable<?> resources,
2622
String version) {
27-
ImmutableMap<String, VersionedResource<T>> versionedResourcesMap = createVersionedResourcesMap(resources);
23+
ResourceMapBuilder<T> resourcesMapBuilder = createResourcesMap(resources);
2824
return new AutoValue_SnapshotResources<>(
29-
versionedResourcesMap,
30-
createResourcesMap(versionedResourcesMap),
25+
resourcesMapBuilder.getVersionedResources(),
26+
resourcesMapBuilder.getResources(),
3127
(r) -> version
3228
);
3329
}
@@ -43,53 +39,22 @@ public static <T extends Message> SnapshotResources<T> create(
4339
public static <T extends Message> SnapshotResources<T> create(
4440
Iterable<VersionedResource<T>> resources,
4541
ResourceVersionResolver versionResolver) {
46-
ImmutableMap<String, VersionedResource<T>> versionedResourcesMap = createVersionedResourcesMap(resources);
42+
ResourceMapBuilder<T> resourcesMapBuilder = createResourcesMap(resources);
4743
return new AutoValue_SnapshotResources<>(
48-
versionedResourcesMap,
49-
createResourcesMap(versionedResourcesMap),
44+
resourcesMapBuilder.getVersionedResources(),
45+
resourcesMapBuilder.getResources(),
5046
versionResolver);
5147
}
5248

53-
private static <T extends Message> ImmutableMap<String, VersionedResource<T>> createVersionedResourcesMap(
49+
private static <T extends Message> ResourceMapBuilder<T> createResourcesMap(
5450
Iterable<?> resources) {
55-
List<?> resourcesList = StreamSupport.stream(resources.spliterator(), false)
56-
.collect(Collectors.toList());
57-
if (resourcesList.stream().allMatch(Predicates.instanceOf(VersionedResource.class)::apply)) {
58-
ImmutableMap<String, VersionedResource<T>> result = resourcesList.stream()
59-
.collect(
60-
Collector.of(
61-
Builder<String, VersionedResource<T>>::new,
62-
(b, e) -> {
63-
VersionedResource<T> eCast = (VersionedResource<T>) e;
64-
b.put(Resources.getResourceName(eCast.resource()), eCast);
65-
},
66-
(b1, b2) -> b1.putAll(b2.build()),
67-
Builder::build));
68-
return result;
69-
} else {
70-
return StreamSupport.stream(resources.spliterator(), false)
71-
.collect(
72-
Collector.of(
73-
Builder<String, VersionedResource<T>>::new,
74-
(b, e) -> {
75-
T eCast = (T) e;
76-
b.put(Resources.getResourceName(eCast), VersionedResource.create(eCast));
77-
},
78-
(b1, b2) -> b1.putAll(b2.build()),
79-
Builder::build));
80-
}
81-
}
8251

83-
private static <T extends Message> ImmutableMap<String, T> createResourcesMap(
84-
ImmutableMap<String, VersionedResource<T>> versionedResources) {
85-
return versionedResources.values().stream().collect(
86-
Collector.of(
87-
Builder<String, T>::new,
88-
(b, e) -> {
89-
b.put(Resources.getResourceName(e.resource()), e.resource());
90-
},
91-
(b1, b2) -> b1.putAll(b2.build()),
92-
Builder::build));
52+
return StreamSupport.stream(resources.spliterator(), false)
53+
.collect(
54+
Collector.of(
55+
ResourceMapBuilder<T>::new,
56+
ResourceMapBuilder::put,
57+
ResourceMapBuilder::putAll));
9358
}
9459

9560
/**

0 commit comments

Comments
 (0)