This is an automated email from the ASF dual-hosted git repository.

karan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 80d6763e390 ServerSelector: Synchronize getAllServers(). (#17499)
80d6763e390 is described below

commit 80d6763e390303952db7b4f6a3246d1eccb3e4d5
Author: Gian Merlino <[email protected]>
AuthorDate: Wed Nov 27 00:01:00 2024 -0800

    ServerSelector: Synchronize getAllServers(). (#17499)
    
    This method was missing some required synchronization. This patch also
    adds GuardedBy annotations to historicalServers and realtimeServers, which
    would have caught it.
---
 .../druid/client/selector/ServerSelector.java      | 31 +++++++++++++---------
 1 file changed, 18 insertions(+), 13 deletions(-)

diff --git 
a/server/src/main/java/org/apache/druid/client/selector/ServerSelector.java 
b/server/src/main/java/org/apache/druid/client/selector/ServerSelector.java
index 30b259b6619..99d883c3301 100644
--- a/server/src/main/java/org/apache/druid/client/selector/ServerSelector.java
+++ b/server/src/main/java/org/apache/druid/client/selector/ServerSelector.java
@@ -19,6 +19,7 @@
 
 package org.apache.druid.client.selector;
 
+import com.google.errorprone.annotations.concurrent.GuardedBy;
 import it.unimi.dsi.fastutil.ints.Int2ObjectRBTreeMap;
 import org.apache.druid.client.DataSegmentInterner;
 import org.apache.druid.query.Query;
@@ -40,9 +41,10 @@ import java.util.concurrent.atomic.AtomicReference;
  */
 public class ServerSelector implements Overshadowable<ServerSelector>
 {
-
+  @GuardedBy("this")
   private final Int2ObjectRBTreeMap<Set<QueryableDruidServer>> 
historicalServers;
 
+  @GuardedBy("this")
   private final Int2ObjectRBTreeMap<Set<QueryableDruidServer>> realtimeServers;
 
   private final TierSelectorStrategy strategy;
@@ -145,18 +147,21 @@ public class ServerSelector implements 
Overshadowable<ServerSelector>
 
   public List<DruidServerMetadata> getAllServers()
   {
-    List<DruidServerMetadata> servers = new ArrayList<>();
-    historicalServers.values()
-        .stream()
-        .flatMap(Collection::stream)
-        .map(server -> server.getServer().getMetadata())
-        .forEach(servers::add);
-
-    realtimeServers.values()
-        .stream()
-        .flatMap(Collection::stream)
-        .map(server -> server.getServer().getMetadata())
-        .forEach(servers::add);
+    final List<DruidServerMetadata> servers = new ArrayList<>();
+
+    synchronized (this) {
+      historicalServers.values()
+                       .stream()
+                       .flatMap(Collection::stream)
+                       .map(server -> server.getServer().getMetadata())
+                       .forEach(servers::add);
+
+      realtimeServers.values()
+                     .stream()
+                     .flatMap(Collection::stream)
+                     .map(server -> server.getServer().getMetadata())
+                     .forEach(servers::add);
+    }
 
     return servers;
   }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to