Merge branch 'stable-3.9' into stable-3.10 * stable-3.9: Update base OS to AlmaLinux 9.3 and Java 17 Get global-refdb.jar from Gerrit-CI Bump Gerrit to 3.9 Add missing syslog-sidecar in docker-compose.yaml Removing obsolete version attribute in docker-compose.yaml Change-Id: Idfb1f121413f7f93f7949af7af39bce8a939348e
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/Configuration.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/Configuration.java index 55f7375..b86df20 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/Configuration.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/Configuration.java
@@ -61,6 +61,7 @@ // common parameters to cache and index sections static final String THREAD_POOL_SIZE_KEY = "threadPoolSize"; + static final String INITIAL_DELAY = "initialDelay"; static final String BATCH_THREAD_POOL_SIZE_KEY = "batchThreadPoolSize"; static final int DEFAULT_THREAD_POOL_SIZE = 4; @@ -565,6 +566,7 @@ public static class Index extends Forwarding { static final int DEFAULT_MAX_TRIES = 2; static final Duration DEFAULT_RETRY_INTERVAL = Duration.ofSeconds(30); + static final Duration DEFAULT_INITIAL_DELAY = Duration.ofMillis(0); static final String INDEX_SECTION = "index"; static final String MAX_TRIES_KEY = "maxTries"; @@ -573,6 +575,7 @@ static final boolean DEFAULT_SYNCHRONIZE_FORCED = true; private final int threadPoolSize; + private final long initialDelayMsec; private final int batchThreadPoolSize; private final Duration retryInterval; private final int maxTries; @@ -581,6 +584,8 @@ private Index(Config cfg) { super(cfg, INDEX_SECTION); threadPoolSize = getInt(cfg, INDEX_SECTION, THREAD_POOL_SIZE_KEY, DEFAULT_THREAD_POOL_SIZE); + initialDelayMsec = + getDuration(cfg, INDEX_SECTION, INITIAL_DELAY, DEFAULT_INITIAL_DELAY).toMillis(); batchThreadPoolSize = getInt(cfg, INDEX_SECTION, BATCH_THREAD_POOL_SIZE_KEY, threadPoolSize); retryInterval = getDuration(cfg, INDEX_SECTION, RETRY_INTERVAL_KEY, DEFAULT_RETRY_INTERVAL); maxTries = getMaxTries(cfg, INDEX_SECTION, MAX_TRIES_KEY, DEFAULT_MAX_TRIES); @@ -592,6 +597,10 @@ return threadPoolSize; } + public long initialDelayMsec() { + return initialDelayMsec; + } + public int batchThreadPoolSize() { return batchThreadPoolSize; }
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/ExecutorProvider.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/ExecutorProvider.java index 3d3212b..d48df46 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/ExecutorProvider.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/ExecutorProvider.java
@@ -17,14 +17,25 @@ import com.google.gerrit.extensions.events.LifecycleListener; import com.google.gerrit.server.git.WorkQueue; import com.google.inject.Provider; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; public abstract class ExecutorProvider implements Provider<ScheduledExecutorService>, LifecycleListener { - private ScheduledExecutorService executor; + private ScheduledWithDelayExecutorService executor; - protected ExecutorProvider(WorkQueue workQueue, int threadPoolSize, String threadNamePrefix) { - executor = workQueue.createQueue(threadPoolSize, threadNamePrefix); + protected ExecutorProvider( + WorkQueue workQueue, int threadPoolSize, String threadNamePrefix, long scheduleDelayMsec) { + executor = + new ScheduledWithDelayExecutorService( + workQueue.createQueue(threadPoolSize, threadNamePrefix), scheduleDelayMsec); } @Override @@ -42,4 +53,109 @@ public ScheduledExecutorService get() { return executor; } + + private static class ScheduledWithDelayExecutorService implements ScheduledExecutorService { + private final ScheduledExecutorService executor; + private final long scheduleDelayMsec; + + ScheduledWithDelayExecutorService( + ScheduledExecutorService executorService, long scheduleDelayMsec) { + this.executor = executorService; + this.scheduleDelayMsec = scheduleDelayMsec; + } + + @Override + public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) { + return executor.schedule( + callable, unit.toMillis(delay) + scheduleDelayMsec, TimeUnit.MILLISECONDS); + } + + @Override + public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) { + return executor.schedule( + command, unit.toMillis(delay) + scheduleDelayMsec, TimeUnit.MILLISECONDS); + } + + @Override + public ScheduledFuture<?> scheduleAtFixedRate( + Runnable command, long initialDelay, long period, TimeUnit unit) { + return executor.scheduleAtFixedRate(command, initialDelay, period, unit); + } + + @Override + public ScheduledFuture<?> scheduleWithFixedDelay( + Runnable command, long initialDelay, long delay, TimeUnit unit) { + return executor.scheduleWithFixedDelay(command, initialDelay, delay, unit); + } + + @Override + public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException { + return executor.awaitTermination(timeout, unit); + } + + @Override + public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) + throws InterruptedException { + return executor.invokeAll(tasks); + } + + @Override + public <T> List<Future<T>> invokeAll( + Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) + throws InterruptedException { + return executor.invokeAll(tasks, timeout, unit); + } + + @Override + public <T> T invokeAny(Collection<? extends Callable<T>> tasks) + throws InterruptedException, ExecutionException { + return executor.invokeAny(tasks); + } + + @Override + public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) + throws InterruptedException, ExecutionException, TimeoutException { + return executor.invokeAny(tasks, timeout, unit); + } + + @Override + public boolean isShutdown() { + return executor.isShutdown(); + } + + @Override + public boolean isTerminated() { + return executor.isTerminated(); + } + + @Override + public void shutdown() { + executor.shutdown(); + } + + @Override + public List<Runnable> shutdownNow() { + return executor.shutdownNow(); + } + + @Override + public <T> Future<T> submit(Callable<T> task) { + return executor.submit(task); + } + + @Override + public Future<?> submit(Runnable task) { + return executor.submit(task); + } + + @Override + public <T> Future<T> submit(Runnable task, T result) { + return executor.submit(task, result); + } + + @Override + public void execute(Runnable command) { + executor.execute(command); + } + } }
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/HttpModule.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/HttpModule.java index 6fa743f..a328694 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/HttpModule.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/HttpModule.java
@@ -17,7 +17,10 @@ import com.ericsson.gerrit.plugins.highavailability.forwarder.rest.RestForwarderServletModule; import com.ericsson.gerrit.plugins.highavailability.health.HealthServletModule; import com.ericsson.gerrit.plugins.highavailability.websession.file.FileBasedWebsessionModule; +import com.google.gerrit.extensions.registration.DynamicSet; +import com.google.gerrit.httpd.AllRequestFilter; import com.google.inject.Inject; +import com.google.inject.Scopes; import com.google.inject.servlet.ServletModule; class HttpModule extends ServletModule { @@ -37,5 +40,8 @@ if (config.websession().synchronize()) { install(new FileBasedWebsessionModule()); } + DynamicSet.bind(binder(), AllRequestFilter.class) + .to(XGerritInstanceFilter.class) + .in(Scopes.SINGLETON); } }
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/ValidationModule.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/ValidationModule.java index 74db7d2..8f37d9c 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/ValidationModule.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/ValidationModule.java
@@ -15,7 +15,6 @@ package com.ericsson.gerrit.plugins.highavailability; import com.gerritforge.gerrit.globalrefdb.validation.BatchRefUpdateValidator; -import com.gerritforge.gerrit.globalrefdb.validation.LockWrapper; import com.gerritforge.gerrit.globalrefdb.validation.Log4jSharedRefLogger; import com.gerritforge.gerrit.globalrefdb.validation.RefUpdateValidator; import com.gerritforge.gerrit.globalrefdb.validation.SharedRefDatabaseWrapper; @@ -55,7 +54,6 @@ bind(SharedRefDatabaseWrapper.class).in(Scopes.SINGLETON); bind(SharedRefLogger.class).to(Log4jSharedRefLogger.class); - factory(LockWrapper.Factory.class); bind(GitRepositoryManager.class).to(SharedRefDbGitRepositoryManager.class);
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/XGerritInstanceFilter.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/XGerritInstanceFilter.java new file mode 100644 index 0000000..a268231 --- /dev/null +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/XGerritInstanceFilter.java
@@ -0,0 +1,53 @@ +// Copyright (C) 2024 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.ericsson.gerrit.plugins.highavailability; + +import static com.google.common.base.MoreObjects.firstNonNull; + +import com.google.gerrit.common.Nullable; +import com.google.gerrit.httpd.AllRequestFilter; +import com.google.gerrit.server.config.GerritInstanceId; +import com.google.gerrit.server.config.GerritInstanceName; +import com.google.inject.Inject; +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletResponse; + +public class XGerritInstanceFilter extends AllRequestFilter { + private static final String X_GERRIT_INSTANCE = "X-Gerrit-Instance"; + + private final String instanceId; + private final String instanceName; + + @Inject + XGerritInstanceFilter( + @Nullable @GerritInstanceId String instanceId, @GerritInstanceName String instanceName) { + this.instanceId = instanceId; + this.instanceName = instanceName; + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + if (response instanceof HttpServletResponse) { + ((HttpServletResponse) response) + .addHeader(X_GERRIT_INSTANCE, firstNonNull(instanceId, instanceName)); + } + chain.doFilter(request, response); + } +}
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandler.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandler.java index ac102ff..a787d3a 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandler.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandler.java
@@ -90,13 +90,13 @@ return true; } - log.atWarning().log( + log.atFine().log( "Change %s seems too old compared to the event timestamp (event-Ts=%s >> change-Ts=%s)", id, indexEvent, checker); return false; } - log.atWarning().log( + log.atFine().log( "Change %s not present yet in local Git repository (event=%s)", id, indexEvent); return false; @@ -113,7 +113,7 @@ private void reindex(ChangeNotes notes) { notes.reload(); - indexer.index(notes); + indexer.reindexIfStale(notes.getProjectName(), notes.getChangeId()); } @Override
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/ForwardedBatchIndexExecutorProvider.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/ForwardedBatchIndexExecutorProvider.java index a3a7e64..f82a42d 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/ForwardedBatchIndexExecutorProvider.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/ForwardedBatchIndexExecutorProvider.java
@@ -31,6 +31,9 @@ @Inject ForwardedBatchIndexExecutorProvider(WorkQueue workQueue, Configuration config) { super( - workQueue, config.index().batchThreadPoolSize(), FORWARDED_BATCH_INDEX_EVENT_THREAD_PREFIX); + workQueue, + config.index().batchThreadPoolSize(), + FORWARDED_BATCH_INDEX_EVENT_THREAD_PREFIX, + config.index().initialDelayMsec()); } }
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/ForwardedIndexExecutorProvider.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/ForwardedIndexExecutorProvider.java index da623df..d7dd40f 100644 --- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/ForwardedIndexExecutorProvider.java +++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/ForwardedIndexExecutorProvider.java
@@ -29,6 +29,10 @@ @Inject ForwardedIndexExecutorProvider(WorkQueue workQueue, Configuration config) { - super(workQueue, config.index().threadPoolSize(), FORWARDED_INDEX_EVENT_THREAD_PREFIX); + super( + workQueue, + config.index().threadPoolSize(), + FORWARDED_INDEX_EVENT_THREAD_PREFIX, + config.index().initialDelayMsec()); } }
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md index d89f7b3..8de1c96 100644 --- a/src/main/resources/Documentation/config.md +++ b/src/main/resources/Documentation/config.md
@@ -280,6 +280,15 @@ stale and needs to be investigated and manually reindexed. Defaults to 2. +```index.initialDelay``` +: The initial delay, internally converted in milliseconds, of triggering the + indexing operation after the indexing even has been received. + Typically needed when there is a well-known latency of propagation of the updates + across the nodes sharing the same NFS volume. + Value is expressed in Gerrit time values as in [websession.cleanupInterval](#websessioncleanupInterval). + Defaults to 0 milliseconds, meaning that indexing happens immediately when the indexing + event is received. + ```index.retryInterval``` : The interval of time in milliseconds between the subsequent auto-retries. Value is expressed in Gerrit time values as in [websession.cleanupInterval](#websessioncleanupInterval).
diff --git a/src/test/docker/docker-compose.yaml b/src/test/docker/docker-compose.yaml index 8524963..4e8a457 100644 --- a/src/test/docker/docker-compose.yaml +++ b/src/test/docker/docker-compose.yaml
@@ -7,6 +7,8 @@ container_name: nfs-server environment: NFS_LOG_LEVEL: DEBUG + NFS_DISABLE_VERSION_3: true + NFS_VERSION: 4.2 hostname: nfs-server healthcheck: test: ["CMD-SHELL", "sleep 10"] # required, otherwise the gerrit service will fail to start with a "connection refused" error @@ -16,27 +18,43 @@ ports: - 2049:2049 networks: - nfs-server-bridge: + gerrit-net: ipv4_address: 192.168.1.5 volumes: - - nfs-server-volume:/var/gerrit/git + - nfs-server-volume:/var/gerrit + + zookeeper-refdb: + image: zookeeper + ports: + - "2181:2181" + networks: + - gerrit-net + healthcheck: + test: ["CMD-SHELL", "./bin/zkServer.sh", "status"] # required, otherwise the gerrit service will fail to start with a "connection refused" error + interval: 1s + timeout: 1m + retries: 10 + gerrit-01: build: gerrit privileged: true depends_on: nfs-server: condition: service_healthy + zookeeper-refdb: + condition: service_healthy ports: - "8081:8080" - "29411:29418" networks: - nfs-server-bridge: null + - gerrit-net volumes: - /dev/urandom:/dev/random - - git-volume:/var/gerrit/git - shareddir:/var/gerrit/shareddir + - ./etc/jgit.config:/var/gerrit/etc/jgit.config.orig - ./etc/gerrit.config:/var/gerrit/etc/gerrit.config.orig - ./etc/high-availability.gerrit-01.config:/var/gerrit/etc/high-availability.config.orig + - ./etc/zookeeper-refdb.config:/var/gerrit/etc/zookeeper-refdb.config.orig environment: - HOSTNAME=localhost @@ -47,7 +65,7 @@ - "8082:8080" - "29412:29418" networks: - nfs-server-bridge: null + - gerrit-net depends_on: gerrit-01: condition: service_started @@ -55,10 +73,11 @@ condition: service_healthy volumes: - /dev/urandom:/dev/random - - git-volume:/var/gerrit/git - shareddir:/var/gerrit/shareddir + - ./etc/jgit.config:/var/gerrit/etc/jgit.config.orig - ./etc/gerrit.config:/var/gerrit/etc/gerrit.config.orig - ./etc/high-availability.gerrit-02.config:/var/gerrit/etc/high-availability.config.orig + - ./etc/zookeeper-refdb.config:/var/gerrit/etc/zookeeper-refdb.config.orig environment: - HOSTNAME=localhost - WAIT_FOR=gerrit-01:8080 @@ -68,10 +87,10 @@ ports: - "80:80" - "29418:29418" - networks: - nfs-server-bridge: null volumes: - syslog-sidecar:/syslog-sidecar + volumes_from: + - syslog-sidecar depends_on: - syslog-sidecar - gerrit-01 @@ -80,10 +99,10 @@ syslog-sidecar: build: docker-syslog-ng-stdout networks: - nfs-server-bridge: null + - gerrit-net networks: - nfs-server-bridge: + gerrit-net: ipam: driver: default config: @@ -93,9 +112,3 @@ shareddir: nfs-server-volume: syslog-sidecar: - git-volume: - driver: "local" - driver_opts: - type: nfs - o: "addr=192.168.1.5,rw" - device: ":/var/gerrit/git"
diff --git a/src/test/docker/etc/gerrit.config b/src/test/docker/etc/gerrit.config index 90a4057..2a08db6 100644 --- a/src/test/docker/etc/gerrit.config +++ b/src/test/docker/etc/gerrit.config
@@ -2,6 +2,8 @@ basePath = git canonicalWebUrl = http://gerrit:8080/ serverId = f7696647-8efd-41b1-bd60-d321bc071ea9 + installDbModule = com.ericsson.gerrit.plugins.highavailability.ValidationModule + installModule = com.gerritforge.gerrit.globalrefdb.validation.LibModule [index] type = LUCENE [auth]
diff --git a/src/test/docker/etc/high-availability.gerrit-01.config b/src/test/docker/etc/high-availability.gerrit-01.config index a21f05c..d8619c1 100644 --- a/src/test/docker/etc/high-availability.gerrit-01.config +++ b/src/test/docker/etc/high-availability.gerrit-01.config
@@ -6,3 +6,6 @@ [peerInfo "static"] url = http://gerrit-02:8080 + +[ref-database] + enabled = true
diff --git a/src/test/docker/etc/high-availability.gerrit-02.config b/src/test/docker/etc/high-availability.gerrit-02.config index d05c7ec..54cc1f2 100644 --- a/src/test/docker/etc/high-availability.gerrit-02.config +++ b/src/test/docker/etc/high-availability.gerrit-02.config
@@ -5,4 +5,7 @@ strategy = static [peerInfo "static"] - url = http://gerrit-01:8080 \ No newline at end of file + url = http://gerrit-01:8080 + +[ref-database] + enabled = true
diff --git a/src/test/docker/etc/jgit.config b/src/test/docker/etc/jgit.config new file mode 100644 index 0000000..6585556 --- /dev/null +++ b/src/test/docker/etc/jgit.config
@@ -0,0 +1,5 @@ +[core] + supportsAtomicFileCreation = false + trustFolderStat = false + trustLooseRefStat = after_open + trustPackedRefsStat = after_open
diff --git a/src/test/docker/etc/zookeeper-refdb.config b/src/test/docker/etc/zookeeper-refdb.config new file mode 100644 index 0000000..d3cdb80 --- /dev/null +++ b/src/test/docker/etc/zookeeper-refdb.config
@@ -0,0 +1,4 @@ +[ref-database "zookeeper"] + connectString = "zookeeper-refdb:2181" + rootNode = "gerrit/HA" + transactionLockTimeoutMs = 1000
diff --git a/src/test/docker/gerrit/Dockerfile b/src/test/docker/gerrit/Dockerfile index 060057d..c863c13 100644 --- a/src/test/docker/gerrit/Dockerfile +++ b/src/test/docker/gerrit/Dockerfile
@@ -8,9 +8,10 @@ sudo \ passwd \ gettext \ + nfs-utils \ && yum -y clean all -ENV GERRIT_VERSION=3.9 +ENV GERRIT_VERSION=3.10 # Add gerrit user RUN adduser -p -m --uid 1000 gerrit --home-dir /home/gerrit @@ -33,10 +34,17 @@ "https://gerrit-ci.gerritforge.com/job/plugin-high-availability-bazel-stable-$GERRIT_VERSION/lastSuccessfulBuild/artifact/bazel-bin/plugins/high-availability/high-availability.jar" \ /var/gerrit/plugins/high-availability.jar +RUN mkdir -p /var/gerrit/lib && \ + ln -sf /var/gerrit/plugins/high-availability.jar /var/gerrit/lib/high-availability.jar + ADD --chown=gerrit \ "https://gerrit-ci.gerritforge.com/job/module-global-refdb-bazel-stable-$GERRIT_VERSION/lastSuccessfulBuild/artifact/bazel-bin/plugins/global-refdb/global-refdb.jar" \ /var/gerrit/lib/global-refdb.jar +ADD --chown=gerrit \ + "https://gerrit-ci.gerritforge.com/job/plugin-zookeeper-refdb-bazel-stable-$GERRIT_VERSION/lastSuccessfulBuild/artifact/bazel-bin/plugins/zookeeper-refdb/zookeeper-refdb.jar" \ + /var/gerrit/plugins/zookeeper-refdb.jar + ADD --chown=gerrit:gerrit ./wait-for-it.sh /bin # Change user
diff --git a/src/test/docker/gerrit/entrypoint.sh b/src/test/docker/gerrit/entrypoint.sh index 2d4e387..77d9eac 100755 --- a/src/test/docker/gerrit/entrypoint.sh +++ b/src/test/docker/gerrit/entrypoint.sh
@@ -6,10 +6,16 @@ fi chown -R gerrit /var/gerrit/etc +sudo -u gerrit cp /var/gerrit/etc/jgit.config.orig /var/gerrit/etc/jgit.config sudo -u gerrit cp /var/gerrit/etc/gerrit.config.orig /var/gerrit/etc/gerrit.config sudo -u gerrit cp /var/gerrit/etc/high-availability.config.orig /var/gerrit/etc/high-availability.config +sudo -u gerrit cp /var/gerrit/etc/zookeeper-refdb.config.orig /var/gerrit/etc/zookeeper-refdb.config +echo "Mount NFS ..." +mkdir /var/gerrit/git && chown gerrit:gerrit /var/gerrit/git +mount -t nfs4 -o actimeo=120 nfs-server:/git /var/gerrit/git + echo "Init gerrit..." sudo -u gerrit java -jar /tmp/gerrit.war init -d /var/gerrit --batch --install-all-plugins chown -R gerrit: /var/gerrit/shareddir
diff --git a/src/test/docker/haproxy/haproxy.cfg b/src/test/docker/haproxy/haproxy.cfg index e86cdce..07a6746 100644 --- a/src/test/docker/haproxy/haproxy.cfg +++ b/src/test/docker/haproxy/haproxy.cfg
@@ -45,7 +45,7 @@ timeout connect 10s timeout server 5m server gerrit_ssh_01 gerrit-01:29418 check port 8080 inter 10s fall 3 rise 2 - server gerrit-ssh_02 gerrit-02:29418 check port 8080 inter 10s fall 3 rise 2 backup + server gerrit-ssh_02 gerrit-02:29418 check port 8080 inter 10s fall 3 rise 2 backend gerrit_http_nodes mode http @@ -55,7 +55,7 @@ option httpchk GET /config/server/version HTTP/1.0 http-check expect status 200 server gerrit_01 gerrit-01:8080 check - server gerrit_02 gerrit-02:8080 check backup + server gerrit_02 gerrit-02:8080 check backend gerrit_http_nodes_balanced mode http
diff --git a/src/test/docker/nfs/Dockerfile b/src/test/docker/nfs/Dockerfile index 19744f3..c24ee9f 100644 --- a/src/test/docker/nfs/Dockerfile +++ b/src/test/docker/nfs/Dockerfile
@@ -1,4 +1,4 @@ -FROM erichough/nfs-server +FROM gerritforge/docker-nfs-server:3.11.3 COPY exports.txt /etc/exports @@ -6,8 +6,8 @@ # server and the client, hence we are creating it explicitly in both. RUN adduser --disabled-password --gecos "" --uid 1000 gerrit -# /var/gerrit/git is the shared directory -RUN mkdir --parents /var/gerrit/git - RUN chown gerrit:gerrit /var/lib/nfs -RUN chown gerrit:gerrit /var/gerrit/git \ No newline at end of file + +COPY gerrit-git-mount-entrypoint.sh /usr/local/bin + +ENTRYPOINT /usr/local/bin/gerrit-git-mount-entrypoint.sh
diff --git a/src/test/docker/nfs/exports.txt b/src/test/docker/nfs/exports.txt index c31d586..3e56b08 100644 --- a/src/test/docker/nfs/exports.txt +++ b/src/test/docker/nfs/exports.txt
@@ -1 +1,2 @@ +/var/gerrit/ 192.168.1.0/24(rw,fsid=0,no_subtree_check,insecure) /var/gerrit/git 192.168.1.0/24(rw,no_subtree_check,insecure) \ No newline at end of file
diff --git a/src/test/docker/nfs/gerrit-git-mount-entrypoint.sh b/src/test/docker/nfs/gerrit-git-mount-entrypoint.sh new file mode 100755 index 0000000..ca7afcc --- /dev/null +++ b/src/test/docker/nfs/gerrit-git-mount-entrypoint.sh
@@ -0,0 +1,15 @@ +#!/bin/sh + +MOUNT_POINT=/var/gerrit/git + +echo "Creating mountpoint $MOUNT_POINT" + +mkdir --parents $MOUNT_POINT +chown gerrit:gerrit $MOUNT_POINT + +echo "ls -al $MOUNT_POINT ..." +ls -al $MOUNT_POINT + +echo "Running NFS server ... " +echo "=======================" +/usr/local/bin/entrypoint.sh \ No newline at end of file
diff --git a/src/test/java/com/ericsson/gerrit/plugins/highavailability/ConfigurationTest.java b/src/test/java/com/ericsson/gerrit/plugins/highavailability/ConfigurationTest.java index e158099..b51e1a0 100644 --- a/src/test/java/com/ericsson/gerrit/plugins/highavailability/ConfigurationTest.java +++ b/src/test/java/com/ericsson/gerrit/plugins/highavailability/ConfigurationTest.java
@@ -59,7 +59,6 @@ import static com.ericsson.gerrit.plugins.highavailability.Configuration.Websession.DEFAULT_CLEANUP_INTERVAL; import static com.ericsson.gerrit.plugins.highavailability.Configuration.Websession.WEBSESSION_SECTION; import static com.google.common.truth.Truth.assertThat; -import static com.google.common.truth.Truth8.assertThat; import static org.junit.Assert.assertEquals; import com.ericsson.gerrit.plugins.highavailability.Configuration.PeerInfoStrategy;
diff --git a/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandlerTest.java b/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandlerTest.java index 427985a..cc6939c 100644 --- a/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandlerTest.java +++ b/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandlerTest.java
@@ -32,6 +32,7 @@ import com.ericsson.gerrit.plugins.highavailability.index.ForwardedIndexExecutorProvider; import com.ericsson.gerrit.plugins.highavailability.index.ForwardedIndexFailsafeExecutorProvider; import com.google.gerrit.entities.Change; +import com.google.gerrit.entities.Project; import com.google.gerrit.server.index.change.ChangeIndexer; import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gerrit.server.util.OneOffRequestContext; @@ -61,6 +62,7 @@ @Mock private ChangeIndexer indexerMock; @Mock private ChangeNotes changeNotes; + @Mock private Project.NameKey projectName; @Mock(answer = RETURNS_DEEP_STUBS) private Configuration configMock; @@ -92,14 +94,15 @@ public void changeIsIndexedWhenUpToDate() throws Exception { setupChangeAccessRelatedMocks(CHANGE_EXISTS, CHANGE_UP_TO_DATE); handler.index(TEST_CHANGE_ID, Operation.INDEX, Optional.empty()).get(10, SECONDS); - verify(indexerMock, times(1)).index(any(ChangeNotes.class)); + verify(indexerMock, times(1)).reindexIfStale(any(Project.NameKey.class), any(Change.Id.class)); } @Test public void changeIsStillIndexedEvenWhenOutdated() throws Exception { setupChangeAccessRelatedMocks(CHANGE_EXISTS, CHANGE_OUTDATED); handler.index(TEST_CHANGE_ID, Operation.INDEX, Optional.of(new IndexEvent())).get(10, SECONDS); - verify(indexerMock, atLeast(1)).index(any(ChangeNotes.class)); + verify(indexerMock, atLeast(1)) + .reindexIfStale(any(Project.NameKey.class), any(Change.Id.class)); } @Test @@ -127,13 +130,13 @@ return null; }) .when(indexerMock) - .index(any(ChangeNotes.class)); + .reindexIfStale(any(Project.NameKey.class), any(Change.Id.class)); assertThat(Context.isForwardedEvent()).isFalse(); handler.index(TEST_CHANGE_ID, Operation.INDEX, Optional.empty()).get(10, SECONDS); assertThat(Context.isForwardedEvent()).isFalse(); - verify(indexerMock, times(1)).index(any(ChangeNotes.class)); + verify(indexerMock, times(1)).reindexIfStale(any(Project.NameKey.class), any(Change.Id.class)); } @Test @@ -146,7 +149,7 @@ throw new IOException("someMessage"); }) .when(indexerMock) - .index(any(ChangeNotes.class)); + .reindexIfStale(any(Project.NameKey.class), any(Change.Id.class)); assertThat(Context.isForwardedEvent()).isFalse(); ExecutionException thrown = @@ -157,7 +160,7 @@ assertThat(thrown.getCause()).hasMessageThat().isEqualTo("someMessage"); assertThat(Context.isForwardedEvent()).isFalse(); - verify(indexerMock, times(1)).index(any(ChangeNotes.class)); + verify(indexerMock, times(1)).reindexIfStale(any(Project.NameKey.class), any(Change.Id.class)); } private void setupChangeAccessRelatedMocks(boolean changeExists, boolean changeIsUpToDate) @@ -166,7 +169,8 @@ when(changeCheckerFactoryMock.create(TEST_CHANGE_ID)).thenReturn(changeCheckerPresentMock); when(changeCheckerPresentMock.getChangeNotes()).thenReturn(Optional.of(changeNotes)); } - + when(changeNotes.getChangeId()).thenReturn(id); + when(changeNotes.getProjectName()).thenReturn(projectName); when(changeCheckerPresentMock.isChangeUpToDate(any())).thenReturn(changeIsUpToDate); } }