Merge branch 'stable-2.16' into stable-3.0

* stable-2.16:
  BaseInit: Don't fail if unable to upgrade schema for slave

Change-Id: Iece0143fc2caefdb18f5b6f5d16c58d0dbecbb97
diff --git a/java/com/google/gerrit/pgm/init/BaseInit.java b/java/com/google/gerrit/pgm/init/BaseInit.java
index 9c158b7..9e496db 100644
--- a/java/com/google/gerrit/pgm/init/BaseInit.java
+++ b/java/com/google/gerrit/pgm/init/BaseInit.java
@@ -22,6 +22,7 @@
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.common.Die;
 import com.google.gerrit.common.IoUtil;
+import com.google.gerrit.exceptions.StorageException;
 import com.google.gerrit.metrics.DisabledMetricMaker;
 import com.google.gerrit.metrics.MetricMaker;
 import com.google.gerrit.pgm.init.api.ConsoleUI;
@@ -33,6 +34,7 @@
 import com.google.gerrit.pgm.init.index.elasticsearch.ElasticIndexModuleOnInit;
 import com.google.gerrit.pgm.init.index.lucene.LuceneIndexModuleOnInit;
 import com.google.gerrit.pgm.util.SiteProgram;
+import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.config.GerritServerConfigModule;
 import com.google.gerrit.server.config.SitePath;
 import com.google.gerrit.server.config.SitePaths;
@@ -49,6 +51,7 @@
 import com.google.inject.Guice;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
+import com.google.inject.Key;
 import com.google.inject.Module;
 import com.google.inject.TypeLiteral;
 import com.google.inject.spi.Message;
@@ -65,6 +68,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
+import org.eclipse.jgit.lib.Config;
 
 /** Initialize a new Gerrit installation. */
 public class BaseInit extends SiteProgram {
@@ -75,6 +79,7 @@
   private final List<String> pluginsToInstall;
 
   private Injector sysInjector;
+  private Config config;
 
   protected BaseInit(PluginsDistribution pluginsDistribution, List<String> pluginsToInstall) {
     this.standalone = true;
@@ -116,7 +121,16 @@
       try {
         indexManager.start();
         run = createSiteRun(init);
-        run.upgradeSchema();
+        try {
+          run.upgradeSchema();
+        } catch (StorageException e) {
+          if (config.getBoolean("container", "slave", false)) {
+            throw e;
+          }
+          String msg = "Couldn't upgrade schema. Expected if slave and read-only database";
+          System.err.println(msg);
+          logger.atWarning().withCause(e).log(msg);
+        }
 
         init.initializer.postRun(sysInjector);
       } finally {
@@ -404,6 +418,8 @@
             }
           });
       Injector dbInjector = createDbInjector();
+      config = dbInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
+
       switch (IndexModule.getIndexType(dbInjector)) {
         case LUCENE:
           modules.add(new LuceneIndexModuleOnInit());