Add handling of multi-base local disk repositories
Multi-site plugin always used LocalDiskRepositoryManager as its backbone
for repository access. However it should depend on the site configuration
(resulting in MultiBaseLocalDiskRepositoryManager being used when
configured).
Change-Id: Idb07d32e651d409eb40d9a806b6f36fa10f6ee11
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/GitModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/GitModule.java
index 4f7205d..e79e7dd 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/GitModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/GitModule.java
@@ -14,22 +14,30 @@
package com.googlesource.gerrit.plugins.multisite;
+import com.google.gerrit.server.ModuleImpl;
+import com.google.gerrit.server.config.RepositoryConfig;
+import com.google.gerrit.server.git.GitRepositoryManagerModule;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.multisite.validation.ValidationModule;
+@ModuleImpl(name = GitRepositoryManagerModule.MANAGER_MODULE)
public class GitModule extends AbstractModule {
private final Configuration config;
+ private final RepositoryConfig repoConfig;
@Inject
- public GitModule(Configuration config) {
+ public GitModule(Configuration config, RepositoryConfig repoConfig) {
this.config = config;
+ this.repoConfig = repoConfig;
}
@Override
protected void configure() {
if (config.getSharedRefDb().isEnabled()) {
- install(new ValidationModule(config));
+ install(new ValidationModule(config, repoConfig));
+ } else {
+ install(new GitRepositoryManagerModule(repoConfig));
}
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/RepositoryManagerModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/RepositoryManagerModule.java
new file mode 100644
index 0000000..9b4d1a5
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/RepositoryManagerModule.java
@@ -0,0 +1,40 @@
+// Copyright (C) 2022 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.googlesource.gerrit.plugins.multisite.validation;
+
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.config.RepositoryConfig;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.LocalDiskRepositoryManager;
+import com.google.gerrit.server.git.MultiBaseLocalDiskRepositoryManager;
+
+class RepositoryManagerModule extends LifecycleModule {
+ private final RepositoryConfig cfg;
+
+ RepositoryManagerModule(RepositoryConfig cfg) {
+ this.cfg = cfg;
+ }
+
+ @Override
+ protected void configure() {
+ bind(GitRepositoryManager.class).to(MultiSiteGitRepositoryManager.class);
+
+ // part responsible for physical repositories handling
+ listener().to(LocalDiskRepositoryManager.Lifecycle.class);
+ if (!cfg.getAllBasePaths().isEmpty()) {
+ bind(LocalDiskRepositoryManager.class).to(MultiBaseLocalDiskRepositoryManager.class);
+ }
+ }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ValidationModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ValidationModule.java
index 4a34b7a..dc29fb0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ValidationModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ValidationModule.java
@@ -16,7 +16,7 @@
import com.google.gerrit.extensions.config.FactoryModule;
import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.config.RepositoryConfig;
import com.google.inject.Scopes;
import com.googlesource.gerrit.plugins.multisite.Configuration;
import com.googlesource.gerrit.plugins.multisite.LockWrapper;
@@ -33,9 +33,11 @@
public class ValidationModule extends FactoryModule {
private final Configuration cfg;
+ private final RepositoryConfig repoConfig;
- public ValidationModule(Configuration cfg) {
+ public ValidationModule(Configuration cfg, RepositoryConfig repoConfig) {
this.cfg = cfg;
+ this.repoConfig = repoConfig;
}
@Override
@@ -54,7 +56,8 @@
factory(RefUpdateValidator.Factory.class);
factory(BatchRefUpdateValidator.Factory.class);
- bind(GitRepositoryManager.class).to(MultiSiteGitRepositoryManager.class);
+ install(new RepositoryManagerModule(repoConfig));
+
DynamicItem.bind(binder(), ReplicationPushFilter.class)
.to(MultisiteReplicationPushFilter.class);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/GitModuleTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/GitModuleTest.java
new file mode 100644
index 0000000..eb50991
--- /dev/null
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/GitModuleTest.java
@@ -0,0 +1,67 @@
+// Copyright (C) 2022 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.googlesource.gerrit.plugins.multisite;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.UseLocalDisk;
+import com.google.gerrit.acceptance.config.GerritConfig;
+import com.google.gerrit.acceptance.config.GlobalPluginConfig;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.LocalDiskRepositoryManager;
+import com.google.gerrit.server.git.MultiBaseLocalDiskRepositoryManager;
+import com.google.inject.Inject;
+import com.googlesource.gerrit.plugins.multisite.validation.MultiSiteGitRepositoryManager;
+import org.junit.Test;
+
+@UseLocalDisk
+@NoHttpd
+public class GitModuleTest extends AbstractDaemonTest {
+ @Inject private GitRepositoryManager gitRepoManager;
+ @Inject private LocalDiskRepositoryManager wrapped;
+
+ @Test
+ @GerritConfig(
+ name = "gerrit.installDbModule",
+ value = "com.googlesource.gerrit.plugins.multisite.GitModule")
+ public void shouldUseLocalDiskRepositoryManagerByDefault() {
+ assertThat(gitRepoManager).isInstanceOf(MultiSiteGitRepositoryManager.class);
+ assertThat(wrapped).isNotInstanceOf(MultiBaseLocalDiskRepositoryManager.class);
+ }
+
+ @Test
+ @GerritConfig(
+ name = "gerrit.installDbModule",
+ value = "com.googlesource.gerrit.plugins.multisite.GitModule")
+ @GerritConfig(name = "repository.r1.basePath", value = "/tmp/git1")
+ public void shouldUseMultiBaseLocalDiskRepositoryManagerWhenItIsConfigured() {
+ assertThat(gitRepoManager).isInstanceOf(MultiSiteGitRepositoryManager.class);
+ assertThat(wrapped).isInstanceOf(MultiBaseLocalDiskRepositoryManager.class);
+ }
+
+ @Test
+ @GerritConfig(
+ name = "gerrit.installDbModule",
+ value = "com.googlesource.gerrit.plugins.multisite.GitModule")
+ @GlobalPluginConfig(
+ pluginName = Configuration.PLUGIN_NAME,
+ name = "ref-database.enabled",
+ value = "false")
+ public void shouldInstallDefaultGerritGitManagerWhenRefDbIsDisabled() {
+ assertThat(gitRepoManager).isInstanceOf(LocalDiskRepositoryManager.class);
+ }
+}