summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Draebing <thomas.draebing@sap.com>2023-01-04 14:44:15 +0100
committerLuca Milanesio <luca.milanesio@gmail.com>2023-10-26 21:12:14 +0000
commitfafafb91b0f9749bcded5ee8fa6afc5c166358bf (patch)
tree830c66fa3d19424fcb276da653731b8128a0037b
parent21851e5cdd60e5db91be46aed5507b74552f87c4 (diff)
Allow to configure projects to be skipped during reindexing
Some projects may cause reindexing to be very slow, but might not be immediately important, e.g. because they are archived/read-only. To have a mostly ready index faster, this change allows to configure a list of projects that will be skipped during reindexing. These projects can then separately be reindexed later using the 'gerrit index changes-in-project' command. Release-Notes: Option to skip projects during change reindexing Change-Id: I3ed63244607cb02c16571dd898f3cc6fa97c9166 (cherry picked from commit 0030ff41100604287d0fdb28fd2abd57fdece6f9)
-rw-r--r--Documentation/config-gerrit.txt9
-rw-r--r--java/com/google/gerrit/server/index/change/AllChangesIndexer.java17
2 files changed, 23 insertions, 3 deletions
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt
index 7f2550900f..f795defe15 100644
--- a/Documentation/config-gerrit.txt
+++ b/Documentation/config-gerrit.txt
@@ -3420,6 +3420,15 @@ advantage of new search features without restarting the server.
+
Defaults to true.
+[[index.excludeProjectFromChangeReindex]]index.excludeProjectFromChangeReindex::
++
+A list of projects that will be excluded from reindexing. This can be used
+to exclude projects which are expensive to reindex to prioritize the other
+projects.
++
+Excluded projects can later be reindexed by for example using the
+link:cmd-index-changes-in-project.html[index changes in project command].
+
[[index.paginationType]]index.paginationType::
+
The pagination type to use when index queries are repeated to
diff --git a/java/com/google/gerrit/server/index/change/AllChangesIndexer.java b/java/com/google/gerrit/server/index/change/AllChangesIndexer.java
index 4f411a2ff7..86326dc715 100644
--- a/java/com/google/gerrit/server/index/change/AllChangesIndexer.java
+++ b/java/com/google/gerrit/server/index/change/AllChangesIndexer.java
@@ -22,7 +22,7 @@ import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
import com.google.auto.value.AutoValue;
import com.google.common.base.Stopwatch;
import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Sets;
import com.google.common.flogger.FluentLogger;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
@@ -31,6 +31,7 @@ import com.google.gerrit.common.Nullable;
import com.google.gerrit.entities.Change;
import com.google.gerrit.entities.Project;
import com.google.gerrit.index.SiteIndexer;
+import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.MultiProgressMonitor;
import com.google.gerrit.server.git.MultiProgressMonitor.Task;
@@ -46,10 +47,13 @@ import com.google.inject.Inject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ProgressMonitor;
import org.eclipse.jgit.lib.Repository;
@@ -82,6 +86,7 @@ public class AllChangesIndexer extends SiteIndexer<Change.Id, ChangeData, Change
private final ChangeIndexer.Factory indexerFactory;
private final ChangeNotes.Factory notesFactory;
private final ProjectCache projectCache;
+ private final Set<Project.NameKey> projectsToSkip;
@Inject
AllChangesIndexer(
@@ -91,7 +96,8 @@ public class AllChangesIndexer extends SiteIndexer<Change.Id, ChangeData, Change
@IndexExecutor(BATCH) ListeningExecutorService executor,
ChangeIndexer.Factory indexerFactory,
ChangeNotes.Factory notesFactory,
- ProjectCache projectCache) {
+ ProjectCache projectCache,
+ @GerritServerConfig Config config) {
this.multiProgressMonitorFactory = multiProgressMonitorFactory;
this.changeDataFactory = changeDataFactory;
this.repoManager = repoManager;
@@ -99,6 +105,11 @@ public class AllChangesIndexer extends SiteIndexer<Change.Id, ChangeData, Change
this.indexerFactory = indexerFactory;
this.notesFactory = notesFactory;
this.projectCache = projectCache;
+ this.projectsToSkip =
+ Sets.newHashSet(config.getStringList("index", null, "excludeProjectFromChangeReindex"))
+ .stream()
+ .map(p -> Project.NameKey.parse(p))
+ .collect(Collectors.toSet());
}
@AutoValue
@@ -302,7 +313,7 @@ public class AllChangesIndexer extends SiteIndexer<Change.Id, ChangeData, Change
}
private List<ListenableFuture<?>> schedule() throws ProjectsCollectionFailure {
- ImmutableSortedSet<Project.NameKey> projects = projectCache.all();
+ Set<Project.NameKey> projects = Sets.difference(projectCache.all(), projectsToSkip);
int projectCount = projects.size();
slicingProjects = mpm.beginSubTask("Slicing projects", projectCount);
for (Project.NameKey name : projects) {