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]