Skip to content

Commit

Permalink
Make legacy template noop updates not change cluster state (elastic#6…
Browse files Browse the repository at this point in the history
…4493)

When a legacy template does not change, there is no need to create and publish a new cluster state,
rather the update should be a noop.

Relates to elastic#57851
Resolves elastic#57662
  • Loading branch information
dakrone committed Nov 2, 2020
1 parent 058b6cf commit 5539260
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,8 @@ public boolean equals(Object o) {
if (!settings.equals(that.settings)) return false;
if (!patterns.equals(that.patterns)) return false;

return Objects.equals(version, that.version);
return Objects.equals(aliases, that.aliases) &&
Objects.equals(version, that.version);
}

@Override
Expand All @@ -187,6 +188,7 @@ public int hashCode() {
result = 31 * result + patterns.hashCode();
result = 31 * result + settings.hashCode();
result = 31 * result + mappings.hashCode();
result = 31 * result + aliases.hashCode();
return result;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -780,6 +780,11 @@ static ClusterState innerPutTemplate(final ClusterState currentState, PutRequest
templateBuilder.putAlias(aliasMetadata);
}
IndexTemplateMetadata template = templateBuilder.build();
IndexTemplateMetadata existingTemplate = currentState.metadata().templates().get(request.name);
if (template.equals(existingTemplate)) {
// The template is unchanged, therefore there is no need for a cluster state update
return currentState;
}

Metadata.Builder builder = Metadata.builder(currentState.metadata()).put(template);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,28 @@ protected Collection<Class<? extends Plugin>> getPlugins() {
return Collections.singletonList(DummyPlugin.class);
}

public void testLegacyNoopUpdate() {
ClusterState state = ClusterState.EMPTY_STATE;
PutRequest pr = new PutRequest("api", "id");
pr.patterns(Arrays.asList("foo", "bar"));
if (randomBoolean()) {
pr.settings(Settings.builder()
.put(IndexMetadata.SETTING_NUMBER_OF_SHARDS, 3).build());
}
if (randomBoolean()) {
pr.mappings("{}");
}
if (randomBoolean()) {
pr.aliases(Collections.singleton(new Alias("alias")));
}
pr.order(randomIntBetween(0, 10));
state = MetadataIndexTemplateService.innerPutTemplate(state, pr, new IndexTemplateMetadata.Builder("id"));

assertNotNull(state.metadata().templates().get("id"));

assertThat(MetadataIndexTemplateService.innerPutTemplate(state, pr, new IndexTemplateMetadata.Builder("id")), equalTo(state));
}

public void testIndexTemplateInvalidNumberOfShards() {
PutRequest request = new PutRequest("test", "test_shards");
request.patterns(singletonList("test_shards*"));
Expand Down Expand Up @@ -730,7 +752,6 @@ public void testFindV2InvalidGlobalTemplate() {
}
}

@AwaitsFix(bugUrl = "https:/elastic/elasticsearch/pull/57393")
public void testResolveConflictingMappings() throws Exception {
final MetadataIndexTemplateService service = getMetadataIndexTemplateService();
ClusterState state = ClusterState.EMPTY_STATE;
Expand Down

0 comments on commit 5539260

Please sign in to comment.