Skip to content

Commit d98a16e

Browse files
Speed up Routing Nodes Priority Comparator (#78609) (#78615)
This one shows up very hot if sorting a long list of shards because of the cost of looking up the settings over and over.
1 parent 3c5e896 commit d98a16e

File tree

3 files changed

+27
-30
lines changed

3 files changed

+27
-30
lines changed

server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,10 @@ public static APIBlock readFrom(StreamInput input) throws IOException {
392392

393393
private final IndexLongFieldRange timestampRange;
394394

395+
private final int priority;
396+
397+
private final long creationDate;
398+
395399
private IndexMetadata(
396400
final Index index,
397401
final long version,
@@ -417,7 +421,9 @@ private IndexMetadata(
417421
final ActiveShardCount waitForActiveShards,
418422
final ImmutableOpenMap<String, RolloverInfo> rolloverInfos,
419423
final boolean isSystem,
420-
final IndexLongFieldRange timestampRange) {
424+
final IndexLongFieldRange timestampRange,
425+
final int priority,
426+
final long creationDate) {
421427

422428
this.index = index;
423429
this.version = version;
@@ -450,6 +456,8 @@ private IndexMetadata(
450456
this.rolloverInfos = rolloverInfos;
451457
this.isSystem = isSystem;
452458
this.timestampRange = timestampRange;
459+
this.priority = priority;
460+
this.creationDate = creationDate;
453461
assert numberOfShards * routingFactor == routingNumShards : routingNumShards + " must be a multiple of " + numberOfShards;
454462
}
455463

@@ -509,7 +517,7 @@ public Version getCreationVersion() {
509517
}
510518

511519
public long getCreationDate() {
512-
return settings.getAsLong(SETTING_CREATION_DATE, -1L);
520+
return creationDate;
513521
}
514522

515523
public State getState() {
@@ -1007,6 +1015,10 @@ public boolean isSystem() {
10071015
return isSystem;
10081016
}
10091017

1018+
public int priority() {
1019+
return priority;
1020+
}
1021+
10101022
public static Builder builder(String index) {
10111023
return new Builder(index);
10121024
}
@@ -1279,9 +1291,6 @@ public IndexLongFieldRange getTimestampRange() {
12791291
}
12801292

12811293
public IndexMetadata build() {
1282-
ImmutableOpenMap.Builder<String, AliasMetadata> tmpAliases = aliases;
1283-
Settings tmpSettings = settings;
1284-
12851294
// update default mapping on the MappingMetadata
12861295
if (mappings.containsKey(MapperService.DEFAULT_MAPPING)) {
12871296
MappingMetadata defaultMapping = mappings.get(MapperService.DEFAULT_MAPPING);
@@ -1375,9 +1384,9 @@ public IndexMetadata build() {
13751384
state,
13761385
numberOfShards,
13771386
numberOfReplicas,
1378-
tmpSettings,
1387+
settings,
13791388
mappings.build(),
1380-
tmpAliases.build(),
1389+
aliases.build(),
13811390
customMetadata.build(),
13821391
filledInSyncAllocationIds.build(),
13831392
requireFilters,
@@ -1390,7 +1399,10 @@ public IndexMetadata build() {
13901399
waitForActiveShards,
13911400
rolloverInfos.build(),
13921401
isSystem,
1393-
timestampRange);
1402+
timestampRange,
1403+
IndexMetadata.INDEX_PRIORITY_SETTING.get(settings),
1404+
settings.getAsLong(SETTING_CREATION_DATE, -1L)
1405+
);
13941406
}
13951407

13961408
@SuppressWarnings("unchecked")

server/src/main/java/org/elasticsearch/cluster/routing/RoutingNodes.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import org.elasticsearch.cluster.ClusterState;
1717
import org.elasticsearch.cluster.metadata.IndexMetadata;
1818
import org.elasticsearch.cluster.metadata.Metadata;
19-
import org.elasticsearch.cluster.metadata.SingleNodeShutdownMetadata;
2019
import org.elasticsearch.cluster.node.DiscoveryNode;
2120
import org.elasticsearch.cluster.routing.UnassignedInfo.AllocationStatus;
2221
import org.elasticsearch.cluster.routing.allocation.ExistingShardsAllocator;
@@ -67,8 +66,6 @@ public class RoutingNodes implements Iterable<RoutingNode> {
6766

6867
private final Map<ShardId, List<ShardRouting>> assignedShards = new HashMap<>();
6968

70-
private final Map<String, SingleNodeShutdownMetadata> nodeShutdowns;
71-
7269
private final boolean readOnly;
7370

7471
private int inactivePrimaryCount = 0;
@@ -87,7 +84,6 @@ public RoutingNodes(ClusterState clusterState) {
8784
public RoutingNodes(ClusterState clusterState, boolean readOnly) {
8885
this.readOnly = readOnly;
8986
final RoutingTable routingTable = clusterState.routingTable();
90-
nodeShutdowns = clusterState.metadata().nodeShutdowns();
9187

9288
Map<String, LinkedHashMap<ShardId, ShardRouting>> nodesToShards = new HashMap<>();
9389
// fill in the nodeToShards with the "live" nodes

server/src/main/java/org/elasticsearch/gateway/PriorityComparator.java

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import org.elasticsearch.cluster.metadata.IndexMetadata;
1212
import org.elasticsearch.cluster.routing.ShardRouting;
1313
import org.elasticsearch.cluster.routing.allocation.RoutingAllocation;
14-
import org.elasticsearch.common.settings.Settings;
1514
import org.elasticsearch.index.Index;
1615

1716
import java.util.Comparator;
@@ -32,38 +31,28 @@ public abstract class PriorityComparator implements Comparator<ShardRouting> {
3231

3332
@Override
3433
public final int compare(ShardRouting o1, ShardRouting o2) {
35-
final String o1Index = o1.getIndexName();
36-
final String o2Index = o2.getIndexName();
34+
final Index o1Index = o1.index();
35+
final Index o2Index = o2.index();
3736
int cmp = 0;
3837
if (o1Index.equals(o2Index) == false) {
39-
final IndexMetadata metadata01 = getMetadata(o1.index());
40-
final IndexMetadata metadata02 = getMetadata(o2.index());
38+
final IndexMetadata metadata01 = getMetadata(o1Index);
39+
final IndexMetadata metadata02 = getMetadata(o2Index);
4140
cmp = Boolean.compare(metadata02.isSystem(), metadata01.isSystem());
4241

4342
if (cmp == 0) {
44-
final Settings settingsO1 = metadata01.getSettings();
45-
final Settings settingsO2 = metadata02.getSettings();
46-
cmp = Long.compare(priority(settingsO2), priority(settingsO1));
43+
cmp = Long.compare(metadata02.priority(), metadata01.priority());
4744

4845
if (cmp == 0) {
49-
cmp = Long.compare(timeCreated(settingsO2), timeCreated(settingsO1));
46+
cmp = Long.compare(metadata02.getCreationDate(), metadata01.getCreationDate());
5047
if (cmp == 0) {
51-
cmp = o2Index.compareTo(o1Index);
48+
cmp = o2Index.getName().compareTo(o1Index.getName());
5249
}
5350
}
5451
}
5552
}
5653
return cmp;
5754
}
5855

59-
private static int priority(Settings settings) {
60-
return IndexMetadata.INDEX_PRIORITY_SETTING.get(settings);
61-
}
62-
63-
private static long timeCreated(Settings settings) {
64-
return settings.getAsLong(IndexMetadata.SETTING_CREATION_DATE, -1L);
65-
}
66-
6756
protected abstract IndexMetadata getMetadata(Index index);
6857

6958
/**

0 commit comments

Comments
 (0)