init: Defer all prune executions until upgrade cycle is done
Otherwise we may drop columns too early, preventing later schema upgrade steps from reading their old values. Change-Id: Idf5f7b70ccaead5e5fc4cf6d4ec97bebb5515fff Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
@@ -28,6 +28,7 @@ import com.google.gerrit.pgm.util.Die;
|
|||||||
import com.google.gerrit.pgm.util.ErrorLogFile;
|
import com.google.gerrit.pgm.util.ErrorLogFile;
|
||||||
import com.google.gerrit.pgm.util.IoUtil;
|
import com.google.gerrit.pgm.util.IoUtil;
|
||||||
import com.google.gerrit.pgm.util.SiteProgram;
|
import com.google.gerrit.pgm.util.SiteProgram;
|
||||||
|
import com.google.gerrit.reviewdb.ReviewDb;
|
||||||
import com.google.gerrit.server.config.SitePath;
|
import com.google.gerrit.server.config.SitePath;
|
||||||
import com.google.gerrit.server.config.SitePaths;
|
import com.google.gerrit.server.config.SitePaths;
|
||||||
import com.google.gerrit.server.git.GitProjectImporter;
|
import com.google.gerrit.server.git.GitProjectImporter;
|
||||||
@@ -37,7 +38,10 @@ import com.google.gerrit.server.schema.SchemaUpdater;
|
|||||||
import com.google.gerrit.server.schema.UpdateUI;
|
import com.google.gerrit.server.schema.UpdateUI;
|
||||||
import com.google.gerrit.server.util.HostPlatform;
|
import com.google.gerrit.server.util.HostPlatform;
|
||||||
import com.google.gwtorm.client.OrmException;
|
import com.google.gwtorm.client.OrmException;
|
||||||
|
import com.google.gwtorm.client.SchemaFactory;
|
||||||
import com.google.gwtorm.client.StatementExecutor;
|
import com.google.gwtorm.client.StatementExecutor;
|
||||||
|
import com.google.gwtorm.jdbc.JdbcExecutor;
|
||||||
|
import com.google.gwtorm.jdbc.JdbcSchema;
|
||||||
import com.google.inject.AbstractModule;
|
import com.google.inject.AbstractModule;
|
||||||
import com.google.inject.CreationException;
|
import com.google.inject.CreationException;
|
||||||
import com.google.inject.Guice;
|
import com.google.inject.Guice;
|
||||||
@@ -160,6 +164,7 @@ public class Init extends SiteProgram {
|
|||||||
final SitePaths site;
|
final SitePaths site;
|
||||||
final InitFlags flags;
|
final InitFlags flags;
|
||||||
final SchemaUpdater schemaUpdater;
|
final SchemaUpdater schemaUpdater;
|
||||||
|
final SchemaFactory<ReviewDb> schema;
|
||||||
final GitRepositoryManager repositoryManager;
|
final GitRepositoryManager repositoryManager;
|
||||||
final GitProjectImporter gitProjectImporter;
|
final GitProjectImporter gitProjectImporter;
|
||||||
final Browser browser;
|
final Browser browser;
|
||||||
@@ -167,18 +172,21 @@ public class Init extends SiteProgram {
|
|||||||
@Inject
|
@Inject
|
||||||
SiteRun(final ConsoleUI ui, final SitePaths site, final InitFlags flags,
|
SiteRun(final ConsoleUI ui, final SitePaths site, final InitFlags flags,
|
||||||
final SchemaUpdater schemaUpdater,
|
final SchemaUpdater schemaUpdater,
|
||||||
|
final SchemaFactory<ReviewDb> schema,
|
||||||
final GitRepositoryManager repositoryManager,
|
final GitRepositoryManager repositoryManager,
|
||||||
final GitProjectImporter gitProjectImporter, final Browser browser) {
|
final GitProjectImporter gitProjectImporter, final Browser browser) {
|
||||||
this.ui = ui;
|
this.ui = ui;
|
||||||
this.site = site;
|
this.site = site;
|
||||||
this.flags = flags;
|
this.flags = flags;
|
||||||
this.schemaUpdater = schemaUpdater;
|
this.schemaUpdater = schemaUpdater;
|
||||||
|
this.schema = schema;
|
||||||
this.repositoryManager = repositoryManager;
|
this.repositoryManager = repositoryManager;
|
||||||
this.gitProjectImporter = gitProjectImporter;
|
this.gitProjectImporter = gitProjectImporter;
|
||||||
this.browser = browser;
|
this.browser = browser;
|
||||||
}
|
}
|
||||||
|
|
||||||
void upgradeSchema() throws OrmException {
|
void upgradeSchema() throws OrmException {
|
||||||
|
final List<String> pruneList = new ArrayList<String>();
|
||||||
schemaUpdater.update(new UpdateUI() {
|
schemaUpdater.update(new UpdateUI() {
|
||||||
@Override
|
@Override
|
||||||
public void message(String msg) {
|
public void message(String msg) {
|
||||||
@@ -187,8 +195,16 @@ public class Init extends SiteProgram {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void pruneSchema(StatementExecutor e, List<String> pruneList)
|
public void pruneSchema(StatementExecutor e, List<String> prune) {
|
||||||
throws OrmException {
|
for (String p : prune) {
|
||||||
|
if (!pruneList.contains(p)) {
|
||||||
|
pruneList.add(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!pruneList.isEmpty()) {
|
||||||
StringBuilder msg = new StringBuilder();
|
StringBuilder msg = new StringBuilder();
|
||||||
msg.append("Execute the following SQL to drop unused objects:\n");
|
msg.append("Execute the following SQL to drop unused objects:\n");
|
||||||
msg.append("\n");
|
msg.append("\n");
|
||||||
@@ -203,12 +219,21 @@ public class Init extends SiteProgram {
|
|||||||
System.err.flush();
|
System.err.flush();
|
||||||
|
|
||||||
} else if (ui.yesno(true, "%s\nExecute now", msg)) {
|
} else if (ui.yesno(true, "%s\nExecute now", msg)) {
|
||||||
|
final JdbcSchema db = (JdbcSchema) schema.open();
|
||||||
|
try {
|
||||||
|
final JdbcExecutor e = new JdbcExecutor(db);
|
||||||
|
try {
|
||||||
for (String sql : pruneList) {
|
for (String sql : pruneList) {
|
||||||
e.execute(sql);
|
e.execute(sql);
|
||||||
}
|
}
|
||||||
|
} finally {
|
||||||
|
e.close();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void importGit() throws OrmException, IOException {
|
void importGit() throws OrmException, IOException {
|
||||||
|
|||||||
Reference in New Issue
Block a user