Skip to content

Commit 272266d

Browse files
committed
tweak
1 parent 2e32d6c commit 272266d

File tree

3 files changed

+61
-29
lines changed

3 files changed

+61
-29
lines changed

server/src/main/java/org/elasticsearch/cluster/ClusterChangedEvent.java

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.elasticsearch.cluster.node.DiscoveryNodes;
1919
import org.elasticsearch.cluster.routing.IndexRoutingTable;
2020
import org.elasticsearch.common.util.set.Sets;
21+
import org.elasticsearch.core.Nullable;
2122
import org.elasticsearch.gateway.GatewayService;
2223
import org.elasticsearch.index.Index;
2324

@@ -242,11 +243,16 @@ public boolean nodesChanged() {
242243
return nodesRemoved() || nodesAdded();
243244
}
244245

245-
/**
246-
* Returns the {@link ProjectsDelta} between the previous cluster state and the new cluster state.
247-
*/
248-
public ProjectsDelta projectDelta() {
249-
return projectsDelta;
246+
public Set<ProjectId> addedProjects() {
247+
return projectsDelta.added();
248+
}
249+
250+
public Set<ProjectId> removedProjects() {
251+
return projectsDelta.removed();
252+
}
253+
254+
public Set<ProjectId> commonProjects() {
255+
return projectsDelta.common(state);
250256
}
251257

252258
/**
@@ -354,7 +360,7 @@ private static ProjectsDelta calculateProjectDelta(Metadata previousMetadata, Me
354360
&& previousMetadata.hasProject(ProjectId.DEFAULT)
355361
&& currentMetadata.projects().size() == 1
356362
&& currentMetadata.hasProject(ProjectId.DEFAULT))) {
357-
return ProjectsDelta.NO_CHANGE_DEFAULT_PROJECT;
363+
return ProjectsDelta.NO_CHANGE;
358364
}
359365

360366
final Set<ProjectId> currentProjectIds = currentMetadata.projects().keySet();
@@ -376,7 +382,7 @@ private static ProjectsDelta calculateProjectDelta(Metadata previousMetadata, Me
376382
// assert removed.contains(ProjectId.DEFAULT) == false;
377383

378384
if (added.isEmpty() && removed.isEmpty()) {
379-
return new ProjectsDelta(Set.of(), Set.of(), currentProjectIds);
385+
return ProjectsDelta.NO_CHANGE;
380386
} else {
381387
return new ProjectsDelta(
382388
Collections.unmodifiableSet(added),
@@ -386,12 +392,30 @@ private static ProjectsDelta calculateProjectDelta(Metadata previousMetadata, Me
386392
}
387393
}
388394

389-
public record ProjectsDelta(Set<ProjectId> added, Set<ProjectId> removed, Set<ProjectId> common) {
395+
private record ProjectsDelta(
396+
Set<ProjectId> added,
397+
Set<ProjectId> removed,
398+
@Nullable Set<ProjectId> common // null if all projects are common
399+
) {
390400

391-
private static final ProjectsDelta NO_CHANGE_DEFAULT_PROJECT = new ProjectsDelta(Set.of(), Set.of(), Set.of(ProjectId.DEFAULT));
401+
private static final ProjectsDelta NO_CHANGE = new ProjectsDelta(Set.of(), Set.of(), null);
392402

393-
public boolean hasNoChange() {
403+
private boolean hasNoChange() {
394404
return added.isEmpty() && removed.isEmpty();
395405
}
406+
407+
@Override
408+
public Set<ProjectId> common() {
409+
throw new UnsupportedOperationException("Use common(ClusterState state) instead");
410+
}
411+
412+
Set<ProjectId> common(ClusterState state) {
413+
if (common == null) {
414+
assert hasNoChange() : this;
415+
return state.metadata().projects().keySet();
416+
} else {
417+
return common;
418+
}
419+
}
396420
}
397421
}

server/src/main/java/org/elasticsearch/repositories/RepositoriesService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -659,15 +659,15 @@ public void applyClusterState(ClusterChangedEvent event) {
659659
final ClusterState state = event.state();
660660
final ClusterState previousState = event.previousState();
661661

662-
for (var projectId : event.projectDelta().removed()) { // removed projects
662+
for (var projectId : event.removedProjects()) { // removed projects
663663
applyProjectState(state.version(), null, previousState.projectState(projectId));
664664
}
665665

666-
for (var projectId : event.projectDelta().added()) { // added projects
666+
for (var projectId : event.addedProjects()) { // added projects
667667
applyProjectState(state.version(), state.projectState(projectId), null);
668668
}
669669

670-
for (var projectId : event.projectDelta().common()) { // existing projects
670+
for (var projectId : event.commonProjects()) { // existing projects
671671
applyProjectState(state.version(), state.projectState(projectId), previousState.projectState(projectId));
672672
}
673673
} catch (Exception ex) {

server/src/test/java/org/elasticsearch/cluster/ClusterChangedEventTests.java

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -531,8 +531,9 @@ public void testProjectsDelta() {
531531
.metadata(Metadata.builder(state0.metadata()).put(ReservedStateMetadata.builder("test").build()))
532532
.build();
533533
ClusterChangedEvent event = new ClusterChangedEvent("test", state1, state0);
534-
assertTrue(event.projectDelta().hasNoChange());
535-
assertThat(event.projectDelta().common(), equalTo(Set.of(ProjectId.DEFAULT)));
534+
assertThat(event.addedProjects(), empty());
535+
assertThat(event.removedProjects(), empty());
536+
assertThat(event.commonProjects(), equalTo(Set.of(ProjectId.DEFAULT)));
536537

537538
// Add projects
538539
final List<ProjectId> projectIds = randomList(1, 5, ESTestCase::randomUniqueProjectId);
@@ -542,9 +543,9 @@ public void testProjectsDelta() {
542543
}
543544
final var state2 = ClusterState.builder(state1).metadata(metadataBuilder.build()).build();
544545
event = new ClusterChangedEvent("test", state2, state1);
545-
assertThat(event.projectDelta().added(), containsInAnyOrder(projectIds.toArray()));
546-
assertThat(event.projectDelta().removed(), empty());
547-
assertThat(event.projectDelta().common(), equalTo(Set.of(ProjectId.DEFAULT)));
546+
assertThat(event.addedProjects(), containsInAnyOrder(projectIds.toArray()));
547+
assertThat(event.removedProjects(), empty());
548+
assertThat(event.commonProjects(), equalTo(Set.of(ProjectId.DEFAULT)));
548549

549550
// Add more projects and delete one
550551
final var removedProjectIds = randomNonEmptySubsetOf(projectIds);
@@ -562,31 +563,38 @@ public void testProjectsDelta() {
562563
final var state3 = ClusterState.builder(state2).metadata(metadataBuilder.build()).routingTable(routingTableBuilder.build()).build();
563564

564565
event = new ClusterChangedEvent("test", state3, state2);
565-
assertThat(event.projectDelta().added(), containsInAnyOrder(moreProjectIds.toArray()));
566-
assertThat(event.projectDelta().removed(), containsInAnyOrder(removedProjectIds.toArray()));
566+
assertThat(event.addedProjects(), containsInAnyOrder(moreProjectIds.toArray()));
567+
assertThat(event.removedProjects(), containsInAnyOrder(removedProjectIds.toArray()));
567568
assertThat(
568-
event.projectDelta().common(),
569+
event.commonProjects(),
569570
equalTo(Sets.union(Sets.difference(Set.copyOf(projectIds), Set.copyOf(removedProjectIds)), Set.of(ProjectId.DEFAULT)))
570571
);
571572

573+
// An update without project membership changes
574+
final var state4 = ClusterState.builder(state3).version(state3.version() + 1).build();
575+
event = new ClusterChangedEvent("test", state4, state3);
576+
assertThat(event.addedProjects(), empty());
577+
assertThat(event.removedProjects(), empty());
578+
assertThat(event.commonProjects(), equalTo(state4.metadata().projects().keySet()));
579+
572580
// Remove all projects
573-
final List<ProjectId> remainingProjects = state3.metadata()
581+
final List<ProjectId> remainingProjects = state4.metadata()
574582
.projects()
575583
.keySet()
576584
.stream()
577585
.filter(projectId -> ProjectId.DEFAULT.equals(projectId) == false)
578586
.toList();
579-
metadataBuilder = Metadata.builder(state3.metadata());
580-
routingTableBuilder = GlobalRoutingTable.builder(state3.globalRoutingTable());
587+
metadataBuilder = Metadata.builder(state4.metadata());
588+
routingTableBuilder = GlobalRoutingTable.builder(state4.globalRoutingTable());
581589
for (ProjectId projectId : remainingProjects) {
582590
metadataBuilder.removeProject(projectId);
583591
routingTableBuilder.removeProject(projectId);
584592
}
585-
final var state4 = ClusterState.builder(state3).metadata(metadataBuilder.build()).routingTable(routingTableBuilder.build()).build();
586-
event = new ClusterChangedEvent("test", state4, state3);
587-
assertThat(event.projectDelta().added(), empty());
588-
assertThat(event.projectDelta().removed(), containsInAnyOrder(remainingProjects.toArray()));
589-
assertThat(event.projectDelta().common(), equalTo(Set.of(ProjectId.DEFAULT)));
593+
final var state5 = ClusterState.builder(state4).metadata(metadataBuilder.build()).routingTable(routingTableBuilder.build()).build();
594+
event = new ClusterChangedEvent("test", state5, state4);
595+
assertThat(event.addedProjects(), empty());
596+
assertThat(event.removedProjects(), containsInAnyOrder(remainingProjects.toArray()));
597+
assertThat(event.commonProjects(), equalTo(Set.of(ProjectId.DEFAULT)));
590598
}
591599

592600
private static class CustomClusterMetadata2 extends TestClusterCustomMetadata {

0 commit comments

Comments
 (0)