Skip to content

Commit 9233dc2

Browse files
Optimize IndicesSegmentResponse#getIndices (#80064)
Replaces a double-nested loop over all segments and indices with a map construction. Also tidies up some related code in `IndexSegments`. Co-authored-by: David Turner <[email protected]>
1 parent b4f5b70 commit 9233dc2

File tree

3 files changed

+53
-23
lines changed

3 files changed

+53
-23
lines changed

rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/indices.segments/10_basic.yml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,50 @@
4040
- match: { indices.index1.shards.0.0.routing.primary: true}
4141
- match: { indices.index1.shards.0.0.segments._0.num_docs: 1}
4242

43+
---
44+
"segments from multiple indices":
45+
46+
- do:
47+
indices.create:
48+
index: index1
49+
body:
50+
settings:
51+
number_of_shards: "1"
52+
number_of_replicas: "0"
53+
54+
- do:
55+
indices.create:
56+
index: index2
57+
body:
58+
settings:
59+
number_of_shards: "1"
60+
number_of_replicas: "0"
61+
62+
- do:
63+
index:
64+
index: index1
65+
body: { foo: bar }
66+
refresh: true
67+
68+
- do:
69+
index:
70+
index: index2
71+
body: { foo: bar }
72+
refresh: true
73+
74+
- do:
75+
cluster.health:
76+
wait_for_status: green
77+
78+
- do:
79+
indices.segments: {}
80+
81+
- gte: { _shards.total: 2 }
82+
- match: { indices.index1.shards.0.0.routing.primary: true}
83+
- match: { indices.index1.shards.0.0.segments._0.num_docs: 1}
84+
- match: { indices.index2.shards.0.0.routing.primary: true}
85+
- match: { indices.index2.shards.0.0.segments._0.num_docs: 1}
86+
4387
---
4488
"closed segments test":
4589
- skip:

server/src/main/java/org/elasticsearch/action/admin/indices/segments/IndexSegments.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,15 @@ public class IndexSegments implements Iterable<IndexShardSegments> {
2020

2121
private final Map<Integer, IndexShardSegments> indexShards;
2222

23-
IndexSegments(String index, ShardSegments[] shards) {
23+
IndexSegments(String index, List<ShardSegments> shards) {
2424
this.index = index;
2525

26-
Map<Integer, List<ShardSegments>> tmpIndexShards = new HashMap<>();
26+
final Map<Integer, List<ShardSegments>> segmentsByShardId = new HashMap<>();
2727
for (ShardSegments shard : shards) {
28-
List<ShardSegments> lst = tmpIndexShards.get(shard.getShardRouting().id());
29-
if (lst == null) {
30-
lst = new ArrayList<>();
31-
tmpIndexShards.put(shard.getShardRouting().id(), lst);
32-
}
33-
lst.add(shard);
28+
segmentsByShardId.computeIfAbsent(shard.getShardRouting().id(), k -> new ArrayList<>()).add(shard);
3429
}
3530
indexShards = new HashMap<>();
36-
for (Map.Entry<Integer, List<ShardSegments>> entry : tmpIndexShards.entrySet()) {
31+
for (Map.Entry<Integer, List<ShardSegments>> entry : segmentsByShardId.entrySet()) {
3732
indexShards.put(
3833
entry.getKey(),
3934
new IndexShardSegments(

server/src/main/java/org/elasticsearch/action/admin/indices/segments/IndicesSegmentResponse.java

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,15 @@
2727
import java.util.ArrayList;
2828
import java.util.Collection;
2929
import java.util.HashMap;
30-
import java.util.HashSet;
3130
import java.util.List;
3231
import java.util.Locale;
3332
import java.util.Map;
34-
import java.util.Set;
3533

3634
public class IndicesSegmentResponse extends BroadcastResponse {
3735

3836
private final ShardSegments[] shards;
3937

40-
private Map<String, IndexSegments> indicesSegments;
38+
private volatile Map<String, IndexSegments> indicesSegments;
4139

4240
IndicesSegmentResponse(StreamInput in) throws IOException {
4341
super(in);
@@ -61,19 +59,12 @@ public Map<String, IndexSegments> getIndices() {
6159
}
6260
Map<String, IndexSegments> indicesSegments = new HashMap<>();
6361

64-
Set<String> indices = new HashSet<>();
62+
final Map<String, List<ShardSegments>> segmentsByIndex = new HashMap<>();
6563
for (ShardSegments shard : shards) {
66-
indices.add(shard.getShardRouting().getIndexName());
64+
segmentsByIndex.computeIfAbsent(shard.getShardRouting().getIndexName(), k -> new ArrayList<>()).add(shard);
6765
}
68-
69-
for (String indexName : indices) {
70-
List<ShardSegments> shards = new ArrayList<>();
71-
for (ShardSegments shard : this.shards) {
72-
if (shard.getShardRouting().getIndexName().equals(indexName)) {
73-
shards.add(shard);
74-
}
75-
}
76-
indicesSegments.put(indexName, new IndexSegments(indexName, shards.toArray(new ShardSegments[shards.size()])));
66+
for (Map.Entry<String, List<ShardSegments>> entry : segmentsByIndex.entrySet()) {
67+
indicesSegments.put(entry.getKey(), new IndexSegments(entry.getKey(), entry.getValue()));
7768
}
7869
this.indicesSegments = indicesSegments;
7970
return indicesSegments;

0 commit comments

Comments
 (0)