Improve DatabaseSchemaCreator Create locks and refs tables in one array of statements instead of issuing two separate updates. Change-Id: Ida11c6da8df15ef1f05a3b04470cac5b8be74851
diff --git a/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/DatabaseSchemaCreator.java b/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/DatabaseSchemaCreator.java index 7bed262..2990a1b 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/DatabaseSchemaCreator.java +++ b/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/DatabaseSchemaCreator.java
@@ -15,17 +15,13 @@ package com.googlesource.gerrit.plugins.spannerrefdb; import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError; -import com.google.api.gax.longrunning.OperationFuture; import com.google.cloud.spanner.DatabaseAdminClient; import com.google.cloud.spanner.DatabaseId; -import com.google.cloud.spanner.ErrorCode; -import com.google.cloud.spanner.SpannerException; import com.google.common.flogger.FluentLogger; import com.google.gerrit.extensions.events.LifecycleListener; import com.google.inject.Inject; import com.google.inject.Singleton; -import com.google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata; -import java.util.Arrays; +import java.util.List; @Singleton class DatabaseSchemaCreator implements LifecycleListener { @@ -42,47 +38,38 @@ @Override public void start() { - createTable( - "CREATE TABLE refs (" - + "project STRING(MAX) NOT NULL," - + "ref STRING(MAX) NOT NULL," - + "value STRING(MAX) NOT NULL" - + ") PRIMARY KEY (project, ref)"); - createTable( - "CREATE TABLE locks (" - + "project STRING(MAX) NOT NULL," - + "ref STRING(MAX) NOT NULL," - + "heartbeat TIMESTAMP OPTIONS (" - + " allow_commit_timestamp = true" - + ")," - + "token TIMESTAMP OPTIONS (" - + " allow_commit_timestamp = true" - + ")," - + "owner STRING(MAX) NOT NULL" - + ") PRIMARY KEY (project, ref)"); + + try { + dbAdminClient + .updateDatabaseDdl( + dbId.getInstanceId().getInstance(), + dbId.getDatabase(), + List.of( + "CREATE TABLE IF NOT EXISTS refs" + + "(" + + "project STRING(MAX) NOT NULL," + + "ref STRING(MAX) NOT NULL," + + "value STRING(MAX) NOT NULL" + + ")" + + "PRIMARY KEY (project, ref)", + "CREATE TABLE IF NOT EXISTS locks" + + "(" + + "project STRING(MAX) NOT NULL," + + "ref STRING(MAX) NOT NULL," + + "heartbeat TIMESTAMP OPTIONS (allow_commit_timestamp = true)," + + "token TIMESTAMP OPTIONS (allow_commit_timestamp = true)," + + "owner STRING(MAX) NOT NULL" + + ")" + + "PRIMARY KEY (project, ref)"), + null) + .get(); + } catch (Exception e) { + throw new GlobalRefDbSystemError( + String.format("Failed to create schema in database [%s]", dbId), e); + } + logger.atInfo().log("Created schema in database [%s]", dbId); } @Override public void stop() {} - - private void createTable(String statement) { - try { - OperationFuture<Void, UpdateDatabaseDdlMetadata> op = - dbAdminClient.updateDatabaseDdl( - dbId.getInstanceId().getInstance(), - dbId.getDatabase(), - Arrays.asList(statement), - null); - op.get(); - logger.atInfo().log("Created table in database [%s] with statement %s", dbId, statement); - } catch (Exception e) { - Throwable cause = e.getCause(); - if (cause instanceof SpannerException) { - ErrorCode code = ((SpannerException) cause).getErrorCode(); - if (code != ErrorCode.FAILED_PRECONDITION) { - throw new GlobalRefDbSystemError("Failed to create table", e); - } - } - } - } }