Skip to content

Commit 6e5be8b

Browse files
authored
Optimize IndexLifecycleMetadata#getPolicies (#116988) (#117028)
1 parent ed824a8 commit 6e5be8b

File tree

2 files changed

+18
-9
lines changed

2 files changed

+18
-9
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/IndexLifecycleMetadata.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,22 @@ public class IndexLifecycleMetadata implements Metadata.Custom {
5858

5959
private final Map<String, LifecyclePolicyMetadata> policyMetadatas;
6060
private final OperationMode operationMode;
61+
// a slightly different view of the policyMetadatas -- it's hot in a couple of places so we pre-calculate it
62+
private final Map<String, LifecyclePolicy> policies;
63+
64+
private static Map<String, LifecyclePolicy> policiesMap(final Map<String, LifecyclePolicyMetadata> policyMetadatas) {
65+
final Map<String, LifecyclePolicy> policies = new HashMap<>(policyMetadatas.size());
66+
for (LifecyclePolicyMetadata policyMetadata : policyMetadatas.values()) {
67+
LifecyclePolicy policy = policyMetadata.getPolicy();
68+
policies.put(policy.getName(), policy);
69+
}
70+
return Collections.unmodifiableMap(policies);
71+
}
6172

6273
public IndexLifecycleMetadata(Map<String, LifecyclePolicyMetadata> policies, OperationMode operationMode) {
6374
this.policyMetadatas = Collections.unmodifiableMap(policies);
6475
this.operationMode = operationMode;
76+
this.policies = policiesMap(policyMetadatas);
6577
}
6678

6779
public IndexLifecycleMetadata(StreamInput in) throws IOException {
@@ -72,6 +84,7 @@ public IndexLifecycleMetadata(StreamInput in) throws IOException {
7284
}
7385
this.policyMetadatas = policies;
7486
this.operationMode = in.readEnum(OperationMode.class);
87+
this.policies = policiesMap(policyMetadatas);
7588
}
7689

7790
@Override
@@ -93,13 +106,7 @@ public OperationMode getOperationMode() {
93106
}
94107

95108
public Map<String, LifecyclePolicy> getPolicies() {
96-
// note: this loop is unrolled rather than streaming-style because it's hot enough to show up in a flamegraph
97-
Map<String, LifecyclePolicy> policies = new HashMap<>(policyMetadatas.size());
98-
for (LifecyclePolicyMetadata policyMetadata : policyMetadatas.values()) {
99-
LifecyclePolicy policy = policyMetadata.getPolicy();
100-
policies.put(policy.getName(), policy);
101-
}
102-
return Collections.unmodifiableMap(policies);
109+
return policies;
103110
}
104111

105112
@Override

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/template/IndexTemplateRegistry.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -579,14 +579,16 @@ private void addIndexLifecyclePoliciesIfMissing(ClusterState state) {
579579
logger.trace("running in data stream lifecycle only mode. skipping the installation of ILM policies.");
580580
return;
581581
}
582-
IndexLifecycleMetadata metadata = state.metadata().custom(IndexLifecycleMetadata.TYPE);
582+
final IndexLifecycleMetadata metadata = state.metadata().custom(IndexLifecycleMetadata.TYPE);
583+
final Map<String, LifecyclePolicy> policies = metadata != null ? metadata.getPolicies() : Map.of();
584+
583585
for (LifecyclePolicy policy : getLifecyclePolicies()) {
584586
final AtomicBoolean creationCheck = policyCreationsInProgress.computeIfAbsent(
585587
policy.getName(),
586588
key -> new AtomicBoolean(false)
587589
);
588590
if (creationCheck.compareAndSet(false, true)) {
589-
final LifecyclePolicy currentPolicy = metadata != null ? metadata.getPolicies().get(policy.getName()) : null;
591+
final LifecyclePolicy currentPolicy = policies.get(policy.getName());
590592
if (Objects.isNull(currentPolicy)) {
591593
logger.debug("adding lifecycle policy [{}] for [{}], because it doesn't exist", policy.getName(), getOrigin());
592594
putPolicy(policy, creationCheck);

0 commit comments

Comments
 (0)