Skip to content

Commit

Permalink
Add more tests to cover cases around ignore_weighted_routing
Browse files Browse the repository at this point in the history
  • Loading branch information
linuxpi committed Mar 25, 2023
1 parent 0c908db commit 256ba08
Show file tree
Hide file tree
Showing 2 changed files with 169 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -1193,6 +1193,52 @@ public void testPreferenceSearchWithWeightedRouting() {
assertEquals(RestStatus.OK.getStatus(), searchResponse.status().getStatus());
}

public void testPreferenceSearchWithIgnoreWeightedRouting() {
Settings commonSettings = Settings.builder()
.put("cluster.routing.allocation.awareness.attributes", "zone")
.put("cluster.routing.allocation.awareness.force.zone.values", "a,b,c")
.put("cluster.routing.weighted.fail_open", true)
.put("cluster.routing.weighted.strict", false)
.put("cluster.routing.ignore_weighted_routing", true)
.build();

int nodeCountPerAZ = 1;
Map<String, List<String>> nodeMap = setupCluster(nodeCountPerAZ, commonSettings);

int numShards = 10;
int numReplicas = 2;
setUpIndexing(numShards, numReplicas);

logger.info("--> setting shard routing weights for weighted round robin");
Map<String, Double> weights = Map.of("a", 1.0, "b", 1.0, "c", 0.0);
setShardRoutingWeights(weights);

String customPreference = randomAlphaOfLength(10);
String nodeInZoneA = nodeMap.get("a").get(0);
String nodeInZoneB = nodeMap.get("b").get(0);
String nodeInZoneC = nodeMap.get("c").get(0);

Map<String, String> nodeIDMap = new HashMap<>();
DiscoveryNodes dataNodes = internalCluster().clusterService().state().nodes();
for (DiscoveryNode node : dataNodes) {
nodeIDMap.put(node.getName(), node.getId());
}

SearchResponse searchResponse = internalCluster().client(nodeMap.get("b").get(0))
.prepareSearch()
.setPreference(randomFrom("_local", "_prefer_nodes:" + "zone:a", customPreference))
.get();
assertEquals(RestStatus.OK.getStatus(), searchResponse.status().getStatus());

searchResponse = internalCluster().client(nodeMap.get("a").get(0))
.prepareSearch()
.setPreference(
"_only_nodes:" + nodeIDMap.get(nodeInZoneA) + "," + nodeIDMap.get(nodeInZoneB) + "," + nodeIDMap.get(nodeInZoneC)
)
.get();
assertEquals(RestStatus.OK.getStatus(), searchResponse.status().getStatus());
}

/**
* Assert that preference based search with preference type is not allowed with strict weighted shard routing
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@
public class FailAwareWeightedRoutingTests extends OpenSearchTestCase {

private ClusterState setUpCluster() {
return setUpCluster(Settings.EMPTY);
}

private ClusterState setUpCluster(Settings transientSettings) {
ClusterState clusterState = ClusterState.builder(new ClusterName("test")).build();

// set up nodes
Expand Down Expand Up @@ -78,7 +82,7 @@ private ClusterState setUpCluster() {
Map<String, Double> weights = Map.of("a", 1.0, "b", 1.0, "c", 0.0);
WeightedRouting weightedRouting = new WeightedRouting("zone", weights);
WeightedRoutingMetadata weightedRoutingMetadata = new WeightedRoutingMetadata(weightedRouting, 0);
Metadata.Builder metadataBuilder = Metadata.builder(clusterState.metadata());
Metadata.Builder metadataBuilder = Metadata.builder(clusterState.metadata()).transientSettings(transientSettings);
metadataBuilder.putCustom(WeightedRoutingMetadata.TYPE, weightedRoutingMetadata);
clusterState = ClusterState.builder(clusterState).metadata(metadataBuilder).build();

Expand Down Expand Up @@ -143,6 +147,124 @@ public void testFindNextWithoutFailOpen() throws IOException {
assertEquals(1, shardSkipped.get());
}

public void testFindNextWithJustOneShardInStandbyZone() throws IOException {
ClusterState clusterState = setUpCluster();

AtomicInteger shardSkipped = new AtomicInteger();
// set up index
IndexMetadata indexMetadata = IndexMetadata.builder("test")
.settings(
Settings.builder()
.put(SETTING_VERSION_CREATED, Version.CURRENT)
.put(SETTING_NUMBER_OF_SHARDS, 1)
.put(SETTING_NUMBER_OF_REPLICAS, 2)
.put(SETTING_CREATION_DATE, System.currentTimeMillis())
)
.build();

ShardRouting shardRoutingA = TestShardRouting.newShardRouting("test", 0, "node_zone_a", true, ShardRoutingState.STARTED);
ShardRouting shardRoutingB = TestShardRouting.newShardRouting("test", 0, "node_zone_b", false, ShardRoutingState.STARTED);
ShardRouting shardRoutingC = TestShardRouting.newShardRouting("test", 0, "node_zone_c", false, ShardRoutingState.STARTED);

Metadata.Builder metadataBuilder = Metadata.builder(clusterState.metadata());
metadataBuilder.put(indexMetadata, false).generateClusterUuidIfNeeded();
IndexRoutingTable.Builder indexRoutingTableBuilder = IndexRoutingTable.builder(indexMetadata.getIndex());

final ShardId shardId = new ShardId("test", "_na_", 0);
IndexShardRoutingTable.Builder indexShardRoutingBuilder = new IndexShardRoutingTable.Builder(shardId);
indexShardRoutingBuilder.addShard(shardRoutingA);
indexShardRoutingBuilder.addShard(shardRoutingB);
indexShardRoutingBuilder.addShard(shardRoutingC);

indexRoutingTableBuilder.addIndexShard(indexShardRoutingBuilder.build());
RoutingTable.Builder routingTableBuilder = RoutingTable.builder();
routingTableBuilder.add(indexRoutingTableBuilder.build());
clusterState = ClusterState.builder(clusterState).routingTable(routingTableBuilder.build()).build();

List<ShardRouting> shardRoutings = new ArrayList<>();
shardRoutings.add(shardRoutingC);

String clusterAlias = randomBoolean() ? null : randomAlphaOfLengthBetween(5, 10);
SearchShardIterator searchShardIterator = new SearchShardIterator(
clusterAlias,
shardId,
shardRoutings,
OriginalIndicesTests.randomOriginalIndices()
);

// fail open is not executed since fail open conditions don't met
SearchShardTarget next = FailAwareWeightedRouting.getInstance()
.findNext(searchShardIterator, clusterState, new OpenSearchRejectedExecutionException(), () -> shardSkipped.incrementAndGet());
assertNotNull(next);
next = FailAwareWeightedRouting.getInstance()
.findNext(searchShardIterator, clusterState, new OpenSearchRejectedExecutionException(), () -> shardSkipped.incrementAndGet());
assertNull(next);
assertEquals(0, shardSkipped.get());
}

public void testFindNextWithIgnoreWeightedRoutingTrue() throws IOException {
ClusterState clusterState = setUpCluster(Settings.builder().put("cluster.routing.ignore_weighted_routing", true).build());

AtomicInteger shardSkipped = new AtomicInteger();
// set up index
IndexMetadata indexMetadata = IndexMetadata.builder("test")
.settings(
Settings.builder()
.put(SETTING_VERSION_CREATED, Version.CURRENT)
.put(SETTING_NUMBER_OF_SHARDS, 1)
.put(SETTING_NUMBER_OF_REPLICAS, 2)
.put(SETTING_CREATION_DATE, System.currentTimeMillis())
)
.build();

ShardRouting shardRoutingA = TestShardRouting.newShardRouting("test", 0, "node_zone_a", true, ShardRoutingState.STARTED);
ShardRouting shardRoutingB = TestShardRouting.newShardRouting("test", 0, "node_zone_b", false, ShardRoutingState.STARTED);
ShardRouting shardRoutingC = TestShardRouting.newShardRouting("test", 0, "node_zone_c", false, ShardRoutingState.STARTED);

Metadata.Builder metadataBuilder = Metadata.builder(clusterState.metadata());
metadataBuilder.put(indexMetadata, false).generateClusterUuidIfNeeded();
IndexRoutingTable.Builder indexRoutingTableBuilder = IndexRoutingTable.builder(indexMetadata.getIndex());

final ShardId shardId = new ShardId("test", "_na_", 0);
IndexShardRoutingTable.Builder indexShardRoutingBuilder = new IndexShardRoutingTable.Builder(shardId);
indexShardRoutingBuilder.addShard(shardRoutingA);
indexShardRoutingBuilder.addShard(shardRoutingB);
indexShardRoutingBuilder.addShard(shardRoutingC);

indexRoutingTableBuilder.addIndexShard(indexShardRoutingBuilder.build());
RoutingTable.Builder routingTableBuilder = RoutingTable.builder();
routingTableBuilder.add(indexRoutingTableBuilder.build());
clusterState = ClusterState.builder(clusterState).routingTable(routingTableBuilder.build()).build();

List<ShardRouting> shardRoutings = new ArrayList<>();
shardRoutings.add(shardRoutingA);
shardRoutings.add(shardRoutingB);
shardRoutings.add(shardRoutingC);

String clusterAlias = randomBoolean() ? null : randomAlphaOfLengthBetween(5, 10);
SearchShardIterator searchShardIterator = new SearchShardIterator(
clusterAlias,
shardId,
shardRoutings,
OriginalIndicesTests.randomOriginalIndices()
);

// fail open is not executed since fail open conditions don't met
SearchShardTarget next = FailAwareWeightedRouting.getInstance()
.findNext(searchShardIterator, clusterState, new OpenSearchRejectedExecutionException(), () -> shardSkipped.incrementAndGet());
assertNotNull(next);
next = FailAwareWeightedRouting.getInstance()
.findNext(searchShardIterator, clusterState, new OpenSearchRejectedExecutionException(), () -> shardSkipped.incrementAndGet());
assertNotNull(next);
next = FailAwareWeightedRouting.getInstance()
.findNext(searchShardIterator, clusterState, new OpenSearchRejectedExecutionException(), () -> shardSkipped.incrementAndGet());
assertNotNull(next);
next = FailAwareWeightedRouting.getInstance()
.findNext(searchShardIterator, clusterState, new OpenSearchRejectedExecutionException(), () -> shardSkipped.incrementAndGet());
assertNull(next);
assertEquals(0, shardSkipped.get());
}

public void testFindNextWithFailOpenDueTo5xx() throws IOException {

ClusterState clusterState = setUpCluster();
Expand Down

0 comments on commit 256ba08

Please sign in to comment.