From 5e43e77ab5353bd6e0fea8cf734b9034dbceb4af Mon Sep 17 00:00:00 2001 From: Edwin Kempin Date: Fri, 25 May 2012 14:00:11 +0200 Subject: [PATCH] Fix schema migration that creates index for submodule subscriptions Commit b0d373c272b814ffc4b43552b1d6a58fb8ec875a added a schema migration that creates an index for submodule subscriptions. This migration fails if the index already exists. This can be if the site was newly created after the submodule subscription feature (d15704079c2f820995ee70e7403dfa7ebcb3d791) was introduced or if the missing index was created manually. This change fixes the migration by catching any SQLException when trying to create the index and asking the user whether this exception should be ignored. An automatic decision is not possible since specific SQL error codes for this case are not available for all supported databases. Change-Id: I7ecb3f0ed050f22753d268dcac01ca3bdb2d84b3 Signed-off-by: Edwin Kempin --- .../main/java/com/google/gerrit/pgm/Init.java | 5 +++++ .../google/gerrit/server/schema/Schema_68.java | 18 ++++++++++++++++++ .../google/gerrit/server/schema/UpdateUI.java | 2 ++ .../server/schema/SchemaUpdaterTest.java | 5 +++++ 4 files changed, 30 insertions(+) diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java index f06946fd87..2d564535b4 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java @@ -190,6 +190,11 @@ public class Init extends SiteProgram { return ui.yesno(def, msg); } + @Override + public boolean isBatch() { + return ui.isBatch(); + } + @Override public void pruneSchema(StatementExecutor e, List prune) { for (String p : prune) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_68.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_68.java index 10b2906fd5..4dc2b6e4ba 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_68.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_68.java @@ -35,6 +35,24 @@ public class Schema_68 extends SchemaVersion { try { stmt.execute("CREATE INDEX submodule_subscription_access_bySubscription" + " ON submodule_subscriptions (submodule_project_name, submodule_branch_name)"); + } catch (SQLException e) { + // the index creation might have failed because the index exists already, + // in this case the exception can be safely ignored, + // but there are also other possible reasons for an exception here that + // should not be ignored, + // -> ask the user whether to ignore this exception or not + ui.message("warning: Cannot create index for submodule subscriptions"); + ui.message(e.getMessage()); + + if (ui.isBatch()) { + ui.message("you may ignore this warning when running in interactive mode"); + throw e; + } else { + final boolean answer = ui.yesno(false, "Ignore warning and proceed with schema upgrade"); + if (!answer) { + throw e; + } + } } finally { stmt.close(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/UpdateUI.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/UpdateUI.java index 64b3afaf60..eff55754fa 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/UpdateUI.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/UpdateUI.java @@ -24,6 +24,8 @@ public interface UpdateUI { boolean yesno(boolean def, String msg); + boolean isBatch(); + void pruneSchema(StatementExecutor e, List pruneList) throws OrmException; } diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java index 34f7430bdc..cc8d47dc07 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java @@ -107,6 +107,11 @@ public class SchemaUpdaterTest extends TestCase { return def; } + @Override + public boolean isBatch() { + return true; + } + @Override public void pruneSchema(StatementExecutor e, List pruneList) throws OrmException {