FrankChen021 commented on code in PR #18136:
URL: https://github.com/apache/druid/pull/18136#discussion_r2181956105


##########
server/src/test/java/org/apache/druid/client/selector/TierSelectorStrategyTest.java:
##########
@@ -260,17 +261,223 @@ public void testServerSelectorStrategyDefaults()
     servers.add(p0);
     RandomServerSelectorStrategy strategy = new RandomServerSelectorStrategy();
     Assert.assertEquals(strategy.pick(servers, 
EasyMock.createMock(DataSegment.class)), p0);
-    Assert.assertEquals(strategy.pick(EasyMock.createMock(Query.class), 
servers, EasyMock.createMock(DataSegment.class)), p0);
-    ServerSelectorStrategy defaultDeprecatedServerSelectorStrategy = new 
ServerSelectorStrategy() {
+    Assert.assertEquals(
+        strategy.pick(
+            EasyMock.createMock(Query.class),
+            servers,
+            EasyMock.createMock(DataSegment.class)
+        ), p0
+    );
+    ServerSelectorStrategy defaultDeprecatedServerSelectorStrategy = new 
ServerSelectorStrategy()
+    {
       @Override
-      public <T> List<QueryableDruidServer> pick(@Nullable Query<T> query, 
Set<QueryableDruidServer> servers, DataSegment segment,
-          int numServersToPick)
+      public <T> List<QueryableDruidServer> pick(
+          @Nullable Query<T> query, Collection<QueryableDruidServer> servers, 
DataSegment segment,
+          int numServersToPick
+      )
       {
         return strategy.pick(servers, segment, numServersToPick);
       }
     };
-    Assert.assertEquals(defaultDeprecatedServerSelectorStrategy.pick(servers, 
EasyMock.createMock(DataSegment.class)), p0);
-    Assert.assertEquals(defaultDeprecatedServerSelectorStrategy.pick(servers, 
EasyMock.createMock(DataSegment.class), 1).get(0), p0);
+    Assert.assertEquals(
+        defaultDeprecatedServerSelectorStrategy.pick(servers, 
EasyMock.createMock(DataSegment.class)),
+        p0
+    );
+    Assert.assertEquals(
+        defaultDeprecatedServerSelectorStrategy.pick(servers, 
EasyMock.createMock(DataSegment.class), 1)
+                                               .get(0), p0
+    );
+  }
+
+  /**
+   * Tests the PreferredTierSelectorStrategy with various configurations and 
expected selections.
+   * It verifies
+   * 1. The preferred tier is respected when picking a server.
+   * 2. When getting all servers, the preferred tier is ignored, and the 
returned list is sorted by priority.
+   * 3. When getting a limited number of candidates, it returns the top N 
servers with the preferred tier first.
+   */
+  private void testPreferredTierSelectorStrategy(
+      PreferredTierSelectorStrategy tierSelectorStrategy,
+      QueryableDruidServer... expectedSelection
+  )
+  {
+    final ServerSelector serverSelector = new ServerSelector(
+        new DataSegment(
+            "test",
+            Intervals.of("2013-01-01/2013-01-02"),
+            DateTimes.of("2013-01-01").toString(),
+            new HashMap<>(),
+            new ArrayList<>(),
+            new ArrayList<>(),
+            NoneShardSpec.instance(),
+            0,
+            0L
+        ),
+        tierSelectorStrategy,
+        HistoricalFilter.IDENTITY_FILTER
+    );
+
+    List<QueryableDruidServer> servers = new 
ArrayList<>(Arrays.asList(expectedSelection));
+
+    List<DruidServerMetadata> expectedCandidates = new ArrayList<>();
+    for (QueryableDruidServer server : servers) {
+      expectedCandidates.add(server.getServer().getMetadata());
+    }
+    Collections.shuffle(servers);
+    for (QueryableDruidServer server : servers) {
+      serverSelector.addServerAndUpdateSegment(server, 
serverSelector.getSegment());
+    }
+
+    // Verify that the preferred tier is respected when picking a server
+    Assert.assertEquals(expectedSelection[0], serverSelector.pick(null, 
CloneQueryMode.EXCLUDECLONES));
+    Assert.assertEquals(expectedSelection[0], 
serverSelector.pick(EasyMock.createMock(Query.class), 
CloneQueryMode.EXCLUDECLONES));
+
+    // Verify that when getting all severs, the preferred tier is ignored, the 
returned list is sorted by priority
+    List<DruidServerMetadata> allServers = new ArrayList<>(expectedCandidates);
+    allServers.sort((o1, o2) -> 
tierSelectorStrategy.getComparator().compare(o1.getPriority(), 
o2.getPriority()));
+    Assert.assertEquals(allServers, serverSelector.getCandidates(-1, 
CloneQueryMode.EXCLUDECLONES));
+
+    // Verify that when getting a limited number of candidates, returns the 
top N servers with preferred tier first
+    Assert.assertEquals(expectedCandidates.subList(0, 2), 
serverSelector.getCandidates(2, CloneQueryMode.EXCLUDECLONES));
+  }
+
+  @Test
+  public void testPreferredTierSelectorStrategyHighestPriority()
+  {
+    DirectDruidClient client = EasyMock.createMock(DirectDruidClient.class);
+    QueryableDruidServer preferredTierLowPriority = new QueryableDruidServer(
+        new DruidServer("test1", "localhost", null, 0, ServerType.HISTORICAL, 
"preferred", 0),
+        client
+    );
+    QueryableDruidServer preferredTierHighPriority = new QueryableDruidServer(
+        new DruidServer("test2", "localhost", null, 0, ServerType.HISTORICAL, 
"preferred", 1),
+        client
+    );
+    QueryableDruidServer nonPreferredTierHighestPriority = new 
QueryableDruidServer(
+        new DruidServer("test3", "localhost", null, 0, ServerType.HISTORICAL, 
"non-preferred", 2),
+        client
+    );
+
+    testPreferredTierSelectorStrategy(
+        new PreferredTierSelectorStrategy(
+            new ConnectionCountServerSelectorStrategy(),
+            new PreferredTierSelectorStrategyConfig("preferred", "highest")
+        ),
+        preferredTierHighPriority, preferredTierLowPriority, 
nonPreferredTierHighestPriority
+    );
+  }
+
+  @Test
+  public void testPreferredTierSelectorStrategyLowestPriority()
+  {
+    DirectDruidClient client = EasyMock.createMock(DirectDruidClient.class);
+    QueryableDruidServer preferredTierLowPriority = new QueryableDruidServer(
+        new DruidServer("test1", "localhost", null, 0, ServerType.HISTORICAL, 
"preferred", 0),
+        client
+    );
+    QueryableDruidServer preferredTierHighPriority = new QueryableDruidServer(
+        new DruidServer("test2", "localhost", null, 0, ServerType.HISTORICAL, 
"preferred", 1),
+        client
+    );
+    QueryableDruidServer nonPreferredTierLowestPriority = new 
QueryableDruidServer(
+        new DruidServer("test3", "localhost", null, 0, ServerType.HISTORICAL, 
"non-preferred", -1),
+        client
+    );
+
+    testPreferredTierSelectorStrategy(
+        new PreferredTierSelectorStrategy(
+            new ConnectionCountServerSelectorStrategy(),
+            new PreferredTierSelectorStrategyConfig("preferred", "lowest")
+        ),
+        preferredTierLowPriority, preferredTierHighPriority, 
nonPreferredTierLowestPriority
+    );
+  }
+
+  @Test
+  public void testPreferredTierSelectorStrategyWithFallback()
+  {
+    DirectDruidClient client = EasyMock.createMock(DirectDruidClient.class);
+    // Create only non-preferred tier servers with different priorities
+    QueryableDruidServer nonPreferredTierLowPriority = new 
QueryableDruidServer(
+        new DruidServer("test1", "localhost", null, 0, ServerType.HISTORICAL, 
"non-preferred", 0),
+        client
+    );
+    QueryableDruidServer nonPreferredTierMediumPriority = new 
QueryableDruidServer(
+        new DruidServer("test2", "localhost", null, 0, ServerType.HISTORICAL, 
"non-preferred", 1),
+        client
+    );
+    QueryableDruidServer nonPreferredTierHighPriority = new 
QueryableDruidServer(
+        new DruidServer("test3", "localhost", null, 0, ServerType.HISTORICAL, 
"non-preferred", 2),
+        client
+    );
+
+    // Since no preferred tier servers are available, it should fall back to 
other servers
+    // based on highest priority
+    testPreferredTierSelectorStrategy(
+        new PreferredTierSelectorStrategy(
+            new ConnectionCountServerSelectorStrategy(),
+            new PreferredTierSelectorStrategyConfig("preferred", "highest")
+        ),
+        nonPreferredTierHighPriority, nonPreferredTierMediumPriority, 
nonPreferredTierLowPriority
+    );
+  }
+
+  @Test
+  public void testPreferredTierSelectorStrategyMixedServers()
+  {
+    DirectDruidClient client = EasyMock.createMock(DirectDruidClient.class);
+    QueryableDruidServer preferredTierLowPriority = new QueryableDruidServer(
+        new DruidServer("test1", "localhost", null, 0, ServerType.HISTORICAL, 
"preferred", 0),
+        client
+    );
+    QueryableDruidServer preferredTierHighPriority = new QueryableDruidServer(
+        new DruidServer("test2", "localhost", null, 0, ServerType.HISTORICAL, 
"preferred", 1),
+        client
+    );
+    QueryableDruidServer anotherTierHighPriority = new QueryableDruidServer(
+        new DruidServer("test3", "localhost", null, 0, ServerType.HISTORICAL, 
"tier1", 2),
+        client
+    );
+    QueryableDruidServer yetAnotherTierMediumPriority = new 
QueryableDruidServer(

Review Comment:
   it looks like two servers with same priority bring different results with 
multiple runs. 
   fixed by setting different priorities for this cases to make sure the test 
result is stable.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to