From 91da9e95c1e529016e8a591237fa8d2e6e980d8e Mon Sep 17 00:00:00 2001 From: Stephanie Tilden Date: Wed, 16 Dec 2020 14:29:55 -0500 Subject: [PATCH] Make DiscoveryServer stream ID global When surfacing V2 and V3 streams alongside each other in envoy-control, DiscoveryServerCallbacks are unable to differentiate between V2 & V3 ADS upon onStreamClose(), onStreamCloseWithError(). This means that any DiscoveryServerCallback that keeps state cannot pivot on stream IDs, since there will be duplicate between V2 & V3. This change creates a global StreamCounter, which ensures stream IDs will be unique across V2 & V3 streams. Signed-off-by: Stephanie Tilden --- .../controlplane/server/DiscoveryServer.java | 4 +--- .../envoyproxy/controlplane/server/StreamCounter.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 server/src/main/java/io/envoyproxy/controlplane/server/StreamCounter.java diff --git a/server/src/main/java/io/envoyproxy/controlplane/server/DiscoveryServer.java b/server/src/main/java/io/envoyproxy/controlplane/server/DiscoveryServer.java index ca028882d..99cc74056 100644 --- a/server/src/main/java/io/envoyproxy/controlplane/server/DiscoveryServer.java +++ b/server/src/main/java/io/envoyproxy/controlplane/server/DiscoveryServer.java @@ -10,7 +10,6 @@ import java.util.Collection; import java.util.List; import java.util.concurrent.Executor; -import java.util.concurrent.atomic.AtomicLong; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,7 +20,6 @@ public abstract class DiscoveryServer { final ConfigWatcher configWatcher; final ProtoResourcesSerializer protoResourcesSerializer; private final ExecutorGroup executorGroup; - private final AtomicLong streamCount = new AtomicLong(); /** * Creates the server. @@ -59,7 +57,7 @@ StreamObserver createRequestHandler( boolean ads, String defaultTypeUrl) { - long streamId = streamCount.getAndIncrement(); + long streamId = StreamCounter.getAndIncrement(); Executor executor = executorGroup.next(); LOGGER.debug("[{}] open stream from {}", streamId, defaultTypeUrl); diff --git a/server/src/main/java/io/envoyproxy/controlplane/server/StreamCounter.java b/server/src/main/java/io/envoyproxy/controlplane/server/StreamCounter.java new file mode 100644 index 000000000..8a9c7acf4 --- /dev/null +++ b/server/src/main/java/io/envoyproxy/controlplane/server/StreamCounter.java @@ -0,0 +1,11 @@ +package io.envoyproxy.controlplane.server; + +import java.util.concurrent.atomic.AtomicLong; + +public final class StreamCounter { + private static final AtomicLong streamCount = new AtomicLong(); + + public static long getAndIncrement() { + return streamCount.getAndIncrement(); + } +}