Skip to content

Commit cae787d

Browse files
authored
report progress when adding/invalidating repositories (#4298)
1 parent 016192f commit cae787d

File tree

1 file changed

+62
-52
lines changed

1 file changed

+62
-52
lines changed

opengrok-indexer/src/main/java/org/opengrok/indexer/history/HistoryGuru.java

Lines changed: 62 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import org.opengrok.indexer.search.DirectoryEntry;
5858
import org.opengrok.indexer.util.ForbiddenSymlinkException;
5959
import org.opengrok.indexer.util.PathUtils;
60+
import org.opengrok.indexer.util.Progress;
6061
import 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

Comments
 (0)