@@ -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