Skip to content

Commit f62e3fe

Browse files
committed
refactor
1 parent bf1b67d commit f62e3fe

File tree

1 file changed

+51
-31
lines changed

1 file changed

+51
-31
lines changed

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

Lines changed: 51 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -661,19 +661,23 @@ public void applyClusterState(ClusterChangedEvent event) {
661661
final ClusterState previousState = event.previousState();
662662

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

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

671671
// existing projects
672672
final var common = event.projectDelta().added().isEmpty()
673673
? state.metadata().projects().keySet()
674674
: Sets.difference(state.metadata().projects().keySet(), event.projectDelta().added());
675675
for (var projectId : common) {
676-
applyProjectState(state.version(), state.projectState(projectId), previousState.projectState(projectId));
676+
applyProjectStateForAddedOrExistingProject(
677+
state.version(),
678+
state.projectState(projectId),
679+
previousState.projectState(projectId)
680+
);
677681
}
678682
} catch (Exception ex) {
679683
assert false : new AssertionError(ex);
@@ -682,30 +686,41 @@ public void applyClusterState(ClusterChangedEvent event) {
682686
}
683687

684688
/**
685-
* Apply changes for one project. The project can be either newly added, removed or an existing one.
689+
* Apply changes for one removed project.
686690
*
687691
* @param version The cluster state version of the change.
688-
* @param state The current project state, or {@code null} if the project was removed.
689-
* @param previousState the previous project state, or {@code null} if the project was newly added.
692+
* @param previousState The previous project state for the removed project.
690693
*/
691-
private void applyProjectState(long version, @Nullable ProjectState state, @Nullable ProjectState previousState) {
692-
assert state != null || previousState != null : "state and previousState cannot both be null";
693-
assert state == null || assertReadonlyRepositoriesNotInUseForWrites(state);
694+
private void applyProjectStateForRemovedProject(long version, ProjectState previousState) {
695+
final var projectId = previousState.projectId();
696+
assert ProjectId.DEFAULT.equals(projectId) == false : "default project cannot be removed";
697+
final var survivors = closeRemovedRepositories(version, projectId, getProjectRepositories(projectId), RepositoriesMetadata.EMPTY);
698+
assert survivors.isEmpty() : "expect no repositories for removed project [" + projectId + "], but got " + survivors.keySet();
699+
repositories.remove(projectId);
700+
}
694701

695-
final var projectId = state != null ? state.projectId() : previousState.projectId();
696-
assert ProjectId.DEFAULT.equals(projectId) == false || (state != null && previousState != null)
697-
: "default project cannot be added or removed";
702+
/**
703+
* Apply changes for one project. The project can be either newly added or an existing one.
704+
*
705+
* @param version The cluster state version of the change.
706+
* @param state The current project state
707+
* @param previousState The previous project state, or {@code null} if the project was newly added.
708+
*/
709+
private void applyProjectStateForAddedOrExistingProject(long version, ProjectState state, @Nullable ProjectState previousState) {
710+
assert assertReadonlyRepositoriesNotInUseForWrites(state);
711+
final var projectId = state.projectId();
712+
assert ProjectId.DEFAULT.equals(projectId) == false || previousState != null : "default project cannot be added";
698713
assert previousState == null || projectId.equals(previousState.projectId())
699714
: "current and previous states must refer to the same project, but got " + projectId + " != " + previousState.projectId();
700715

701-
final RepositoriesMetadata newMetadata = state == null ? RepositoriesMetadata.EMPTY : RepositoriesMetadata.get(state.metadata());
716+
final RepositoriesMetadata newMetadata = RepositoriesMetadata.get(state.metadata());
702717
final RepositoriesMetadata oldMetadata = previousState == null
703718
? RepositoriesMetadata.EMPTY
704719
: RepositoriesMetadata.get(previousState.metadata());
705720

706721
final Map<String, Repository> projectRepositories = getProjectRepositories(projectId);
707722
// Check if repositories got changed
708-
if (state != null && oldMetadata.equalsIgnoreGenerations(newMetadata)) {
723+
if (oldMetadata.equalsIgnoreGenerations(newMetadata)) {
709724
for (Repository repo : projectRepositories.values()) {
710725
repo.updateState(state.cluster());
711726
}
@@ -714,24 +729,8 @@ private void applyProjectState(long version, @Nullable ProjectState state, @Null
714729

715730
logger.trace("processing new index repositories for project [{}] and state version [{}]", projectId, version);
716731

717-
Map<String, Repository> survivors = new HashMap<>();
718732
// First, remove repositories that are no longer there
719-
for (Map.Entry<String, Repository> entry : projectRepositories.entrySet()) {
720-
if (newMetadata.repository(entry.getKey()) == null) {
721-
logger.debug("unregistering repository {}", projectRepoString(projectId, entry.getKey()));
722-
Repository repository = entry.getValue();
723-
closeRepository(repository);
724-
archiveRepositoryStats(repository, version);
725-
} else {
726-
survivors.put(entry.getKey(), entry.getValue());
727-
}
728-
}
729-
730-
if (state == null) { // removed project
731-
assert survivors.isEmpty() : "expect no repositories for removed project [" + projectId + "], but got " + survivors.keySet();
732-
repositories.remove(projectId);
733-
return;
734-
}
733+
final var survivors = closeRemovedRepositories(version, projectId, projectRepositories, newMetadata);
735734

736735
Map<String, Repository> builder = new HashMap<>();
737736

@@ -787,6 +786,26 @@ private void applyProjectState(long version, @Nullable ProjectState state, @Null
787786
}
788787
}
789788

789+
private Map<String, Repository> closeRemovedRepositories(
790+
long version,
791+
ProjectId projectId,
792+
Map<String, Repository> projectRepositories,
793+
RepositoriesMetadata newMetadata
794+
) {
795+
Map<String, Repository> survivors = new HashMap<>();
796+
for (Map.Entry<String, Repository> entry : projectRepositories.entrySet()) {
797+
if (newMetadata.repository(entry.getKey()) == null) {
798+
logger.debug("unregistering repository {}", projectRepoString(projectId, entry.getKey()));
799+
Repository repository = entry.getValue();
800+
closeRepository(repository);
801+
archiveRepositoryStats(repository, version);
802+
} else {
803+
survivors.put(entry.getKey(), entry.getValue());
804+
}
805+
}
806+
return survivors;
807+
}
808+
790809
private static boolean canUpdateInPlace(RepositoryMetadata updatedMetadata, Repository repository) {
791810
assert updatedMetadata.name().equals(repository.getMetadata().name());
792811
return repository.getMetadata().type().equals(updatedMetadata.type())
@@ -1118,6 +1137,7 @@ public static boolean isReadOnly(Settings repositorySettings) {
11181137
* Test-only check for the invariant that read-only repositories never have any write activities.
11191138
*/
11201139
private static boolean assertReadonlyRepositoriesNotInUseForWrites(ProjectState projectState) {
1140+
assert projectState != null;
11211141
for (final var repositoryMetadata : RepositoriesMetadata.get(projectState.metadata()).repositories()) {
11221142
if (isReadOnly(repositoryMetadata.settings())) {
11231143
try {

0 commit comments

Comments
 (0)