Merge branch 'stable-3.5' into stable-3.6

* stable-3.5:
  Set version to 3.4.8.4
  Configure the set of refs prefixes to be ignored by the global-refdb
  Bump the global-refdb version to 3.4.8.3
  Make SharedRefDatabaseWrapper a singleton
  Add warning when the GlobalRefDatabase is not injected
  Bump the global-refdb version to 3.4.8.2
  Add default implementation for the global-refdb logger

Change-Id: I03935585c462511c59e2e5ab3db435365a97f640
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java
index 3086c26..c86a346 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java
@@ -158,7 +158,8 @@
   }
 
   private Boolean isRefToBeIgnored(String refName) {
-    Boolean isRefToBeIgnored = ignoredRefs.contains(refName);
+    Boolean isRefToBeIgnored =
+        ignoredRefs.stream().anyMatch(ignoredRefPrefix -> refName.startsWith(ignoredRefPrefix));
     logger.atFine().log("Is project version update? %s", isRefToBeIgnored);
     return isRefToBeIgnored;
   }
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDatabaseWrapper.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDatabaseWrapper.java
index 4349193..c3b41e8 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDatabaseWrapper.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDatabaseWrapper.java
@@ -19,10 +19,12 @@
 import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.NoopSharedRefDatabase;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.entities.Project;
 import com.google.gerrit.extensions.registration.DynamicItem;
 import com.google.gerrit.metrics.Timer0.Context;
 import com.google.inject.Inject;
+import com.google.inject.Singleton;
 import java.util.Optional;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Ref;
@@ -32,7 +34,9 @@
  * binding. Such instance is bound optionally and, in case no explicit binding is registered a
  * {@link NoopSharedRefDatabase} instance is wrapped instead.
  */
+@Singleton
 public class SharedRefDatabaseWrapper implements GlobalRefDatabase {
+  private static final FluentLogger log = FluentLogger.forEnclosingClass();
   private static final GlobalRefDatabase NOOP_REFDB = new NoopSharedRefDatabase();
 
   @Inject(optional = true)
@@ -131,6 +135,16 @@
   }
 
   private GlobalRefDatabase sharedRefDb() {
-    return Optional.ofNullable(sharedRefDbDynamicItem).map(di -> di.get()).orElse(NOOP_REFDB);
+    if (sharedRefDbDynamicItem == null) {
+      log.atWarning().log("DynamicItem<GlobalRefDatabase> has not been injected");
+    }
+
+    return Optional.ofNullable(sharedRefDbDynamicItem)
+        .map(di -> di.get())
+        .orElseGet(
+            () -> {
+              log.atWarning().log("Using NOOP_REFDB");
+              return NOOP_REFDB;
+            });
   }
 }
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbConfiguration.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbConfiguration.java
index a607cdc..986175a 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbConfiguration.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbConfiguration.java
@@ -21,6 +21,7 @@
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.SharedRefEnforcement.EnforcePolicy;
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.MultimapBuilder;
 import java.io.IOException;
@@ -102,9 +103,11 @@
     public static final String SECTION = "ref-database";
     public static final String ENABLE_KEY = "enabled";
     public static final String SUBSECTION_ENFORCEMENT_RULES = "enforcementRules";
+    public static final String IGNORED_REFS_PREFIXES = "ignoredRefsPrefixes";
 
     private final boolean enabled;
     private final Multimap<EnforcePolicy, String> enforcementRules;
+    private final ImmutableSet<String> ignoredRefsPrefixes;
 
     private SharedRefDatabase(Supplier<Config> cfg) {
       enabled = getBoolean(cfg, SECTION, null, ENABLE_KEY, false);
@@ -113,6 +116,8 @@
         enforcementRules.putAll(
             policy, getList(cfg, SECTION, SUBSECTION_ENFORCEMENT_RULES, policy.name()));
       }
+
+      ignoredRefsPrefixes = ImmutableSet.copyOf(getList(cfg, SECTION, null, IGNORED_REFS_PREFIXES));
     }
 
     /**
@@ -146,6 +151,16 @@
       return enforcementRules;
     }
 
+    /**
+     * Returns the set of refs prefixes that are ignored during the validation and enforcement of
+     * the global refdb.
+     *
+     * @return Set of ignored prefixes of ignored refs
+     */
+    public ImmutableSet<String> getIgnoredRefsPrefixes() {
+      return ignoredRefsPrefixes;
+    }
+
     private List<String> getList(
         Supplier<Config> cfg, String section, String subsection, String name) {
       return ImmutableList.copyOf(cfg.get().getStringList(section, subsection, name));
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefLogger.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefLogger.java
index d2b1822..858ba18 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefLogger.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefLogger.java
@@ -14,9 +14,11 @@
 
 package com.gerritforge.gerrit.globalrefdb.validation;
 
+import com.google.inject.ImplementedBy;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Ref;
 
+@ImplementedBy(Log4jSharedRefLogger.class)
 public interface SharedRefLogger {
 
   /**