|
17 | 17 |
|
18 | 18 | public class VirtualShardRoutingHelperTests extends OpenSearchTestCase { |
19 | 19 |
|
20 | | - public void testResolvePhysicalShardIdDefaultModulo() { |
| 20 | + public void testResolvePhysicalShardIdDefaultRangeBased() { |
21 | 21 | int numPhysicalShards = 5; |
22 | 22 | IndexMetadata metadata = IndexMetadata.builder("test") |
23 | | - .settings(Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT)) |
| 23 | + .settings( |
| 24 | + Settings.builder() |
| 25 | + .put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT) |
| 26 | + .put(IndexMetadata.SETTING_NUMBER_OF_VIRTUAL_SHARDS, 20) |
| 27 | + ) |
24 | 28 | .numberOfShards(numPhysicalShards) |
25 | 29 | .numberOfReplicas(1) |
26 | 30 | .build(); |
27 | 31 |
|
28 | 32 | assertEquals(0, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 0)); |
29 | | - assertEquals(2, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 7)); |
30 | | - assertEquals(4, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 4)); |
31 | | - assertEquals(0, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 5)); |
| 33 | + assertEquals(0, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 3)); |
| 34 | + assertEquals(1, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 4)); |
| 35 | + assertEquals(1, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 7)); |
| 36 | + assertEquals(4, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 19)); |
32 | 37 | } |
33 | 38 |
|
34 | 39 | public void testResolvePhysicalShardIdWithOverrides() { |
35 | 40 | int numPhysicalShards = 5; |
36 | 41 | Map<String, String> overrides = new HashMap<>(); |
37 | | - overrides.put("7", "1"); |
| 42 | + overrides.put("7", "1"); // mapped out of standard routing |
| 43 | + overrides.put("8", "2"); // mapped out of standard routing |
38 | 44 |
|
39 | 45 | IndexMetadata.Builder builder = IndexMetadata.builder("test") |
40 | | - .settings(Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT)) |
| 46 | + .settings( |
| 47 | + Settings.builder() |
| 48 | + .put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT) |
| 49 | + .put(IndexMetadata.SETTING_NUMBER_OF_VIRTUAL_SHARDS, 20) |
| 50 | + ) |
41 | 51 | .numberOfShards(numPhysicalShards) |
42 | 52 | .numberOfReplicas(1); |
43 | 53 | builder.putCustom(VirtualShardRoutingHelper.VIRTUAL_SHARDS_CUSTOM_METADATA_KEY, overrides); |
44 | 54 |
|
45 | 55 | IndexMetadata metadata = builder.build(); |
46 | 56 |
|
47 | 57 | assertEquals(1, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 7)); |
| 58 | + assertEquals(2, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 8)); |
48 | 59 |
|
| 60 | + // Default falls back to range-based formula (20 / 5 = 4 vshards per pshard) |
49 | 61 | assertEquals(0, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 0)); |
| 62 | + assertEquals(2, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 9)); |
50 | 63 | } |
51 | 64 |
|
52 | | - public void testInvalidOverridesFallBackToModulo() { |
| 65 | + public void testInvalidOverridesFallBackToRangeBased() { |
53 | 66 | int numPhysicalShards = 5; |
54 | 67 | Map<String, String> overrides = new HashMap<>(); |
55 | 68 | overrides.put("7", "not_a_number"); |
56 | 69 | overrides.put("8", "-1"); |
57 | | - overrides.put("9", "5"); |
| 70 | + overrides.put("19", "5"); |
58 | 71 |
|
59 | 72 | IndexMetadata.Builder builder = IndexMetadata.builder("test") |
60 | | - .settings(Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT)) |
| 73 | + .settings( |
| 74 | + Settings.builder() |
| 75 | + .put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT) |
| 76 | + .put(IndexMetadata.SETTING_NUMBER_OF_VIRTUAL_SHARDS, 20) |
| 77 | + ) |
61 | 78 | .numberOfShards(numPhysicalShards) |
62 | 79 | .numberOfReplicas(1); |
63 | 80 | builder.putCustom(VirtualShardRoutingHelper.VIRTUAL_SHARDS_CUSTOM_METADATA_KEY, overrides); |
64 | 81 |
|
65 | 82 | IndexMetadata metadata = builder.build(); |
66 | 83 |
|
67 | | - assertEquals(2, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 7)); |
68 | | - assertEquals(3, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 8)); |
69 | | - assertEquals(4, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 9)); |
| 84 | + // Standard range-based routing expects 4 vshards per physical shard |
| 85 | + // vShard 7 -> 7 / 4 = 1 |
| 86 | + assertEquals(1, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 7)); |
| 87 | + // vShard 8 -> 8 / 4 = 2 |
| 88 | + assertEquals(2, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 8)); |
| 89 | + // vShard 19 -> 19 / 4 = 4 |
| 90 | + assertEquals(4, VirtualShardRoutingHelper.resolvePhysicalShardId(metadata, 19)); |
70 | 91 | } |
71 | 92 | } |
0 commit comments