Merge branch 'stable-3.9' into stable-3.10

* stable-3.9:
  Verify high-availability formatting using GJF 1.7
  Check for existence of change's target SHA1 for reindexing
  Remove `@NoHttpd` from IT tests that interact with Gerrit Rest API

Change-Id: I3fdf1d89e4fed2f37c0adcf7861b2242d3209d4b
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/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/test/docker/docker-compose.yaml b/src/test/docker/docker-compose.yaml
index f744d2e..8524963 100644
--- a/src/test/docker/docker-compose.yaml
+++ b/src/test/docker/docker-compose.yaml
@@ -1,5 +1,3 @@
-version: '3'
-
 services:
 
   nfs-server:
@@ -94,6 +92,7 @@
 volumes:
   shareddir:
   nfs-server-volume:
+  syslog-sidecar:
   git-volume:
     driver: "local"
     driver_opts:
diff --git a/src/test/docker/gerrit/Dockerfile b/src/test/docker/gerrit/Dockerfile
index 33a7b5b..e70e0ea 100644
--- a/src/test/docker/gerrit/Dockerfile
+++ b/src/test/docker/gerrit/Dockerfile
@@ -1,17 +1,16 @@
-FROM almalinux:8.5
+FROM almalinux:9.3
 
 # Install dependencies
 RUN yum -y install \
     git \
-    java-11-openjdk \
+    java-17-openjdk \
     procps \
     sudo \
     passwd \
     gettext \
     && yum -y clean all
 
-ENV GERRIT_VERSION=3.6
-ENV JAVA_HOME /usr/lib/jvm/jre-11-openjdk
+ENV GERRIT_VERSION=3.10
 
 # Add gerrit user
 RUN adduser -p -m --uid 1000 gerrit --home-dir /home/gerrit
@@ -32,10 +31,9 @@
 ADD --chown=gerrit \
     "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
-
 ADD --chown=gerrit \
-    "https://repo1.maven.org/maven2/com/gerritforge/global-refdb/$GERRIT_VERSION.3.4/global-refdb-$GERRIT_VERSION.3.4.jar" \
-    /tmp
+    "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:gerrit ./wait-for-it.sh /bin
 
diff --git a/src/test/docker/gerrit/entrypoint.sh b/src/test/docker/gerrit/entrypoint.sh
index b382a3b..2d4e387 100755
--- a/src/test/docker/gerrit/entrypoint.sh
+++ b/src/test/docker/gerrit/entrypoint.sh
@@ -14,10 +14,6 @@
 sudo -u gerrit java -jar /tmp/gerrit.war init -d /var/gerrit --batch --install-all-plugins
 chown -R gerrit: /var/gerrit/shareddir
 
-# required until regression is fixed, see https://groups.google.com/g/repo-discuss/c/DH-ftHMiCyE/m/qF88c6KMAAAJ
-echo "Copying global ref db jar into lib"
-sudo -u gerrit cp /tmp/global-refdb-*.jar /var/gerrit/lib
-
 echo "Reindexing Gerrit..."
 cd /var/gerrit && sudo -u gerrit java -jar /var/gerrit/bin/gerrit.war reindex -d /var/gerrit
 sudo -u gerrit git config -f /var/gerrit/etc/gerrit.config gerrit.canonicalWebUrl http://$HOSTNAME/
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;