Merge "Merge branch 'stable-3.2'"
diff --git a/WORKSPACE b/WORKSPACE
index 5870db4..104e727 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -766,7 +766,7 @@
sha1 = "f7be08ec23c21485b9b5a1cf1654c2ec8c58168d",
)
-GITILES_VERS = "0.3-7"
+GITILES_VERS = "0.4"
GITILES_REPO = GERRIT
@@ -775,14 +775,14 @@
artifact = "com.google.gitiles:blame-cache:" + GITILES_VERS,
attach_source = False,
repository = GITILES_REPO,
- sha1 = "af6212a62363906c63d367f8276ae1645f83bf93",
+ sha1 = "567198123898aa86bd854d3fcb044dc7a1845741",
)
maven_jar(
name = "gitiles-servlet",
artifact = "com.google.gitiles:gitiles-servlet:" + GITILES_VERS,
repository = GITILES_REPO,
- sha1 = "6a53f722f8572a2f1bcb7d86e5692168844bab76",
+ sha1 = "0dd832a6df108af0c75ae29b752fda64ccbd6886",
)
# prettify must match the version used in Gitiles
diff --git a/java/com/google/gerrit/pgm/Init.java b/java/com/google/gerrit/pgm/Init.java
index 799377c..3593d8a 100644
--- a/java/com/google/gerrit/pgm/Init.java
+++ b/java/com/google/gerrit/pgm/Init.java
@@ -30,6 +30,7 @@
import com.google.gerrit.pgm.util.ErrorLogFile;
import com.google.gerrit.server.config.GerritServerConfigModule;
import com.google.gerrit.server.config.SitePath;
+import com.google.gerrit.server.index.GerritIndexStatus;
import com.google.gerrit.server.ioutil.HostPlatform;
import com.google.gerrit.server.securestore.SecureStoreClassName;
import com.google.gerrit.server.util.ReplicaUtil;
@@ -60,9 +61,6 @@
@Option(name = "--no-auto-start", usage = "Don't automatically start daemon after init")
private boolean noAutoStart;
- @Option(name = "--no-reindex", usage = "Don't automatically reindex any entities")
- private boolean noReindex;
-
@Option(name = "--skip-plugins", usage = "Don't install plugins")
private boolean skipPlugins;
@@ -91,6 +89,8 @@
@Inject Browser browser;
+ private boolean projectsIndexExists;
+
public Init() {
super(new WarDistribution(), null);
}
@@ -103,6 +103,7 @@
@Override
protected boolean beforeInit(SiteInit init) throws Exception {
+ projectsIndexExists = new GerritIndexStatus(init.site).exists(ProjectSchemaDefinitions.NAME);
ErrorLogFile.errorOnlyConsole();
if (!skipPlugins) {
@@ -145,7 +146,7 @@
});
modules.add(new GerritServerConfigModule());
Guice.createInjector(modules).injectMembers(this);
- if (!ReplicaUtil.isReplica(run.flags.cfg)) {
+ if (!ReplicaUtil.isReplica(run.flags.cfg) && !projectsIndexExists) {
reindexProjects();
}
start(run);
@@ -260,9 +261,6 @@
}
private void reindexProjects() throws Exception {
- if (noReindex) {
- return;
- }
// Reindex all projects, so that we bootstrap the project index for new installations
List<String> reindexArgs =
ImmutableList.of(
diff --git a/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java b/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
index 8bd3e7e..2177485 100644
--- a/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
+++ b/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
@@ -360,12 +360,12 @@
// pre-receive hooks
return ReceiveCommitsResult.empty();
}
-
+ String currentThreadName = Thread.currentThread().getName();
MultiProgressMonitor monitor = newMultiProgressMonitor(receiveCommits.getMessageSender());
Callable<ReceiveCommitsResult> callable =
() -> {
String oldName = Thread.currentThread().getName();
- Thread.currentThread().setName(oldName + "-for-" + Thread.currentThread().getName());
+ Thread.currentThread().setName(oldName + "-for-" + currentThreadName);
try {
return receiveCommits.processCommands(commands, monitor);
} finally {
diff --git a/java/com/google/gerrit/server/index/GerritIndexStatus.java b/java/com/google/gerrit/server/index/GerritIndexStatus.java
index 6d59100..9f0622e 100644
--- a/java/com/google/gerrit/server/index/GerritIndexStatus.java
+++ b/java/com/google/gerrit/server/index/GerritIndexStatus.java
@@ -48,6 +48,10 @@
return cfg.getBoolean(SECTION, indexDirName(indexName, version), KEY_READY, false);
}
+ public boolean exists(String indexName) {
+ return cfg.getSubsections(SECTION).stream().anyMatch(n -> n.startsWith(indexName));
+ }
+
public void save() throws IOException {
cfg.save();
}
diff --git a/java/com/google/gerrit/server/util/AttentionSetUtil.java b/java/com/google/gerrit/server/util/AttentionSetUtil.java
index 1cd398f..ad2c98c 100644
--- a/java/com/google/gerrit/server/util/AttentionSetUtil.java
+++ b/java/com/google/gerrit/server/util/AttentionSetUtil.java
@@ -1,3 +1,17 @@
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
package com.google.gerrit.server.util;
import com.google.common.collect.ImmutableSet;
diff --git a/javatests/com/google/gerrit/acceptance/pgm/InitIT.java b/javatests/com/google/gerrit/acceptance/pgm/InitIT.java
index e48088e..4caee64 100644
--- a/javatests/com/google/gerrit/acceptance/pgm/InitIT.java
+++ b/javatests/com/google/gerrit/acceptance/pgm/InitIT.java
@@ -26,7 +26,16 @@
import com.google.gerrit.index.project.ProjectIndexCollection;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.AllUsersName;
+import java.io.IOException;
+import java.nio.file.FileVisitOption;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.time.Instant;
+import java.util.Comparator;
import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import org.eclipse.jgit.util.FS;
import org.junit.Test;
@NoHttpd
@@ -34,7 +43,7 @@
@Test
public void indexesAllProjectsAndAllUsers() throws Exception {
- runGerrit("init", "-d", sitePaths.site_path.toString(), "--show-stack-trace");
+ initSite();
try (ServerContext ctx = startServer()) {
ProjectIndexCollection projectIndex =
ctx.getInjector().getInstance(ProjectIndexCollection.class);
@@ -48,4 +57,52 @@
assertThat(allUsersData).isPresent();
}
}
+
+ @Test
+ public void initDoesNotReindexProjectsOnExistingSites() throws Exception {
+ initSite();
+
+ // Simulate a projects indexes files modified in the past by 3 seconds
+ Optional<Instant> projectsLastModified =
+ getProjectsIndexLastModified(sitePaths.index_dir).map(t -> t.minusSeconds(3));
+ assertThat(projectsLastModified).isPresent();
+ setProjectsIndexLastModifiedInThePast(sitePaths.index_dir, projectsLastModified.get());
+
+ initSite();
+ Optional<Instant> projectsLastModifiedAfterInit =
+ getProjectsIndexLastModified(sitePaths.index_dir);
+
+ // Verify that projects index files haven't been updated
+ assertThat(projectsLastModified).isEqualTo(projectsLastModifiedAfterInit);
+ }
+
+ private void initSite() throws Exception {
+ runGerrit("init", "-d", sitePaths.site_path.toString(), "--show-stack-trace");
+ }
+
+ private void setProjectsIndexLastModifiedInThePast(Path indexDir, Instant time)
+ throws IOException {
+ for (Path path : getAllProjectsIndexFiles(indexDir).collect(Collectors.toList())) {
+ FS.DETECTED.setLastModified(path, time);
+ }
+ }
+
+ private Optional<Instant> getProjectsIndexLastModified(Path indexDir) throws IOException {
+ return getAllProjectsIndexFiles(indexDir)
+ .map(FS.DETECTED::lastModifiedInstant)
+ .max(Comparator.comparingLong(Instant::toEpochMilli));
+ }
+
+ private Stream<Path> getAllProjectsIndexFiles(Path indexDir) throws IOException {
+ Optional<Path> projectsPath =
+ Files.walk(indexDir, 1)
+ .filter(Files::isDirectory)
+ .filter(p -> p.getFileName().toString().startsWith("projects_"))
+ .findFirst();
+ if (!projectsPath.isPresent()) {
+ return Stream.empty();
+ }
+
+ return Files.walk(projectsPath.get(), 1, FileVisitOption.FOLLOW_LINKS);
+ }
}