57
57
import org .opengrok .indexer .search .DirectoryEntry ;
58
58
import org .opengrok .indexer .util .ForbiddenSymlinkException ;
59
59
import org .opengrok .indexer .util .PathUtils ;
60
+ import org .opengrok .indexer .util .Progress ;
60
61
import org .opengrok .indexer .util .Statistics ;
61
62
62
63
/**
@@ -761,9 +762,11 @@ public boolean getLastHistoryEntries(File directory, List<DirectoryEntry> entrie
761
762
* @param allowedNesting number of levels of nested repos to allow
762
763
* @param depth maximum scanning depth
763
764
* @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
764
766
* @return collection of added repositories
765
767
*/
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 ) {
767
770
768
771
if (depth < 0 ) {
769
772
throw new IllegalArgumentException ("depth is negative" );
@@ -814,7 +817,7 @@ private Collection<RepositoryInfo> addRepositories(File[] files, int allowedNest
814
817
} else {
815
818
// Recursive call to scan next depth
816
819
repoList .addAll (addRepositories (subFiles ,
817
- allowedNesting , depth - 1 , isNested ));
820
+ allowedNesting , depth - 1 , isNested , progress ));
818
821
}
819
822
}
820
823
} else {
@@ -832,7 +835,7 @@ private Collection<RepositoryInfo> addRepositories(File[] files, int allowedNest
832
835
file .getAbsolutePath ());
833
836
} else if (depth > 0 ) {
834
837
repoList .addAll (addRepositories (subFiles ,
835
- allowedNesting - 1 , depth - 1 , true ));
838
+ allowedNesting - 1 , depth - 1 , true , progress ));
836
839
}
837
840
}
838
841
}
@@ -841,6 +844,8 @@ private Collection<RepositoryInfo> addRepositories(File[] files, int allowedNest
841
844
"Failed to get canonical path for ''{0}'': {1}" ,
842
845
new Object []{file .getAbsolutePath (), exp .getMessage ()});
843
846
LOGGER .log (Level .WARNING , "Repository will be ignored..." , exp );
847
+ } finally {
848
+ progress .increment ();
844
849
}
845
850
}
846
851
@@ -858,34 +863,36 @@ public Collection<RepositoryInfo> addRepositories(File[] files) {
858
863
List <Future <Collection <RepositoryInfo >>> futures = new ArrayList <>();
859
864
List <RepositoryInfo > repoList = new ArrayList <>();
860
865
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 )));
874
885
}
875
- final int scanDepth = env .getScanningDepth () - levelsBelowSourceRoot ;
876
886
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
+ });
879
894
}
880
895
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
-
889
896
LOGGER .log (Level .FINER , "Discovered repositories: {0}" , repoList );
890
897
891
898
return repoList ;
@@ -1280,34 +1287,37 @@ public void invalidateRepositories(Collection<? extends RepositoryInfo> repos, C
1280
1287
final ExecutorService executor = Executors .newFixedThreadPool (parallelismLevel ,
1281
1288
new OpenGrokThreadFactory ("invalidate-repos-" ));
1282
1289
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 ();
1293
1309
}
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
+ }
1303
1312
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 ();
1309
1320
}
1310
- executor .shutdown ();
1311
1321
1312
1322
clear ();
1313
1323
repositoryMap .forEach ((key , repo ) -> putRepository (repo ));
0 commit comments