5757import org .opengrok .indexer .search .DirectoryEntry ;
5858import org .opengrok .indexer .util .ForbiddenSymlinkException ;
5959import org .opengrok .indexer .util .PathUtils ;
60+ import org .opengrok .indexer .util .Progress ;
6061import org .opengrok .indexer .util .Statistics ;
6162
6263/**
@@ -761,9 +762,11 @@ public boolean getLastHistoryEntries(File directory, List<DirectoryEntry> entrie
761762 * @param allowedNesting number of levels of nested repos to allow
762763 * @param depth maximum scanning depth
763764 * @param isNested a value indicating if a parent {@link Repository} was already found above the {@code files}
765+ * @param progress {@link org.opengrok.indexer.util.Progress} instance
764766 * @return collection of added repositories
765767 */
766- private Collection <RepositoryInfo > addRepositories (File [] files , int allowedNesting , int depth , boolean isNested ) {
768+ private Collection <RepositoryInfo > addRepositories (File [] files , int allowedNesting , int depth , boolean isNested ,
769+ Progress progress ) {
767770
768771 if (depth < 0 ) {
769772 throw new IllegalArgumentException ("depth is negative" );
@@ -814,7 +817,7 @@ private Collection<RepositoryInfo> addRepositories(File[] files, int allowedNest
814817 } else {
815818 // Recursive call to scan next depth
816819 repoList .addAll (addRepositories (subFiles ,
817- allowedNesting , depth - 1 , isNested ));
820+ allowedNesting , depth - 1 , isNested , progress ));
818821 }
819822 }
820823 } else {
@@ -832,7 +835,7 @@ private Collection<RepositoryInfo> addRepositories(File[] files, int allowedNest
832835 file .getAbsolutePath ());
833836 } else if (depth > 0 ) {
834837 repoList .addAll (addRepositories (subFiles ,
835- allowedNesting - 1 , depth - 1 , true ));
838+ allowedNesting - 1 , depth - 1 , true , progress ));
836839 }
837840 }
838841 }
@@ -841,6 +844,8 @@ private Collection<RepositoryInfo> addRepositories(File[] files, int allowedNest
841844 "Failed to get canonical path for ''{0}'': {1}" ,
842845 new Object []{file .getAbsolutePath (), exp .getMessage ()});
843846 LOGGER .log (Level .WARNING , "Repository will be ignored..." , exp );
847+ } finally {
848+ progress .increment ();
844849 }
845850 }
846851
@@ -858,34 +863,36 @@ public Collection<RepositoryInfo> addRepositories(File[] files) {
858863 List <Future <Collection <RepositoryInfo >>> futures = new ArrayList <>();
859864 List <RepositoryInfo > repoList = new ArrayList <>();
860865
861- for (File file : files ) {
862- /*
863- * Adjust scan depth based on source root path. Some directories can be symbolic links pointing
864- * outside source root so avoid constructing canonical paths for the computation to work.
865- */
866- int levelsBelowSourceRoot ;
867- try {
868- String relativePath = env .getPathRelativeToSourceRoot (file );
869- levelsBelowSourceRoot = Path .of (relativePath ).getNameCount ();
870- } catch (IOException | ForbiddenSymlinkException e ) {
871- LOGGER .log (Level .WARNING , "cannot get path relative to source root for ''{0}'', " +
872- "skipping repository scan for this directory" , file );
873- continue ;
866+ try (Progress progress = new Progress (LOGGER , "directories processed for repository scan" )) {
867+ for (File file : files ) {
868+ /*
869+ * Adjust scan depth based on source root path. Some directories can be symbolic links pointing
870+ * outside source root so avoid constructing canonical paths for the computation to work.
871+ */
872+ int levelsBelowSourceRoot ;
873+ try {
874+ String relativePath = env .getPathRelativeToSourceRoot (file );
875+ levelsBelowSourceRoot = Path .of (relativePath ).getNameCount ();
876+ } catch (IOException | ForbiddenSymlinkException e ) {
877+ LOGGER .log (Level .WARNING , "cannot get path relative to source root for ''{0}'', " +
878+ "skipping repository scan for this directory" , file );
879+ continue ;
880+ }
881+ final int scanDepth = env .getScanningDepth () - levelsBelowSourceRoot ;
882+
883+ futures .add (executor .submit (() -> addRepositories (new File []{file },
884+ env .getNestingMaximum (), scanDepth , false , progress )));
874885 }
875- final int scanDepth = env .getScanningDepth () - levelsBelowSourceRoot ;
876886
877- futures .add (executor .submit (() -> addRepositories (new File []{file },
878- env .getNestingMaximum (), scanDepth , false )));
887+ futures .forEach (future -> {
888+ try {
889+ repoList .addAll (future .get ());
890+ } catch (Exception e ) {
891+ LOGGER .log (Level .WARNING , "failed to get results of repository scan" , e );
892+ }
893+ });
879894 }
880895
881- futures .forEach (future -> {
882- try {
883- repoList .addAll (future .get ());
884- } catch (Exception e ) {
885- LOGGER .log (Level .WARNING , "failed to get results of repository scan" , e );
886- }
887- });
888-
889896 LOGGER .log (Level .FINER , "Discovered repositories: {0}" , repoList );
890897
891898 return repoList ;
@@ -1280,34 +1287,37 @@ public void invalidateRepositories(Collection<? extends RepositoryInfo> repos, C
12801287 final ExecutorService executor = Executors .newFixedThreadPool (parallelismLevel ,
12811288 new OpenGrokThreadFactory ("invalidate-repos-" ));
12821289
1283- for (RepositoryInfo repositoryInfo : repos ) {
1284- executor .submit (() -> {
1285- try {
1286- Repository r = RepositoryFactory .getRepository (repositoryInfo , cmdType );
1287- if (r == null ) {
1288- LOGGER .log (Level .WARNING ,
1289- "Failed to instantiate internal repository data for {0} in ''{1}''" ,
1290- new Object []{repositoryInfo .getType (), repositoryInfo .getDirectoryName ()});
1291- } else {
1292- repositoryMap .put (r .getDirectoryName (), r );
1290+ try (Progress progress = new Progress (LOGGER , "repository invalidation" , repos .size ())) {
1291+ for (RepositoryInfo repositoryInfo : repos ) {
1292+ executor .submit (() -> {
1293+ try {
1294+ Repository r = RepositoryFactory .getRepository (repositoryInfo , cmdType );
1295+ if (r == null ) {
1296+ LOGGER .log (Level .WARNING ,
1297+ "Failed to instantiate internal repository data for {0} in ''{1}''" ,
1298+ new Object []{repositoryInfo .getType (), repositoryInfo .getDirectoryName ()});
1299+ } else {
1300+ repositoryMap .put (r .getDirectoryName (), r );
1301+ }
1302+ } catch (Exception ex ) {
1303+ // We want to catch any exception since we are in thread.
1304+ LOGGER .log (Level .WARNING , "Could not create " + repositoryInfo .getType ()
1305+ + " repository object for '" + repositoryInfo .getDirectoryName () + "'" , ex );
1306+ } finally {
1307+ latch .countDown ();
1308+ progress .increment ();
12931309 }
1294- } catch (Exception ex ) {
1295- // We want to catch any exception since we are in thread.
1296- LOGGER .log (Level .WARNING , "Could not create " + repositoryInfo .getType ()
1297- + " repository object for '" + repositoryInfo .getDirectoryName () + "'" , ex );
1298- } finally {
1299- latch .countDown ();
1300- }
1301- });
1302- }
1310+ });
1311+ }
13031312
1304- // Wait until all repositories are validated.
1305- try {
1306- latch .await ();
1307- } catch (InterruptedException ex ) {
1308- LOGGER .log (Level .SEVERE , "latch exception" , ex );
1313+ // Wait until all repositories are validated.
1314+ try {
1315+ latch .await ();
1316+ } catch (InterruptedException ex ) {
1317+ LOGGER .log (Level .SEVERE , "latch exception" , ex );
1318+ }
1319+ executor .shutdown ();
13091320 }
1310- executor .shutdown ();
13111321
13121322 clear ();
13131323 repositoryMap .forEach ((key , repo ) -> putRepository (repo ));
0 commit comments