Merge changes I2ff06eba,I252b7071 into stable-2.15
* changes:
Change log messages of noteDb case to match reviewDb case
Add error handling if rename was not successful
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameRevertException.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameRevertException.java
new file mode 100644
index 0000000..fcb6021
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameRevertException.java
@@ -0,0 +1,25 @@
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.googlesource.gerrit.plugins.renameproject;
+
+import com.google.gwtorm.server.OrmException;
+
+/** Add cause for exception during revert operation */
+public class RenameRevertException extends OrmException {
+ public RenameRevertException(Throwable revertException, Throwable cause) {
+ super(
+ "Failed to revert after failed rename. Revert cause: " + cause.getMessage(),
+ revertException.initCause(cause));
+ }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/DatabaseRenameHandler.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/DatabaseRenameHandler.java
index 2d123a5..671dc27 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/DatabaseRenameHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/DatabaseRenameHandler.java
@@ -34,6 +34,7 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
+import com.googlesource.gerrit.plugins.renameproject.RenameRevertException;
import com.googlesource.gerrit.plugins.renameproject.monitor.ProgressMonitor;
import java.io.IOException;
import java.sql.Connection;
@@ -99,7 +100,7 @@
changeIds.add(changeId);
}
log.debug(
- "Number of changes in reviewDb related to the project {} are {}",
+ "Number of changes in reviewDb related to project {} are {}",
oldProjectKey.get(),
changeIds.size());
return changeIds;
@@ -119,7 +120,7 @@
changeIds.add(change.id());
}
log.debug(
- "Number of changes in noteDb related to the project {} are {}",
+ "Number of changes in noteDb related to project {} are {}",
oldProjectKey.get(),
changeIds.size());
return changeIds;
@@ -134,7 +135,7 @@
Project.NameKey oldProjectKey,
Project.NameKey newProjectKey,
ProgressMonitor pm)
- throws OrmException, IOException {
+ throws OrmException, RenameRevertException {
pm.beginTask("Updating changes in the database");
ReviewDb db = schemaFactory.open();
return (isNoteDb())
@@ -152,34 +153,56 @@
try (Statement stmt = conn.createStatement()) {
conn.setAutoCommit(false);
try {
- log.debug("Updating the changes in reviewDb related to project {}", oldProjectKey.get());
- for (Change.Id cd : changes) {
- stmt.addBatch(
- "update changes set dest_project_name='"
- + newProjectKey.get()
- + "' where change_id ="
- + cd.id
- + ";");
+ try {
+ log.debug("Updating the changes in reviewDb related to project {}", oldProjectKey.get());
+ for (Change.Id cd : changes) {
+ stmt.addBatch(
+ "update changes set dest_project_name='"
+ + newProjectKey.get()
+ + "' where change_id ="
+ + cd.id
+ + ";");
+ }
+ stmt.executeBatch();
+ conn.commit();
+ } catch (SQLException e) {
+ throw new OrmException(e);
}
- stmt.executeBatch();
updateWatchEntries(oldProjectKey, newProjectKey);
- conn.commit();
log.debug(
"Successfully updated the changes in reviewDb related to project {}",
oldProjectKey.get());
return changes;
+ } catch (OrmException e) {
+ try {
+ log.error(
+ "Failed to update changes in reviewDb for project {}, exception caught: {}. Rolling back the operation.",
+ oldProjectKey.get(),
+ e.toString());
+ conn.rollback();
+ } catch (SQLException revertEx) {
+ log.error(
+ "Failed to rollback changes in reviewDb from project {} to project {}, exception caught: {}",
+ newProjectKey.get(),
+ oldProjectKey.get(),
+ revertEx.toString());
+ throw new RenameRevertException(revertEx, e);
+ }
+ try {
+ updateWatchEntries(newProjectKey, oldProjectKey);
+ } catch (OrmException revertEx) {
+ log.error(
+ "Failed to update watched changes in reviewDb from project {} to project {}, exception caught: {}",
+ newProjectKey.get(),
+ oldProjectKey.get(),
+ revertEx.toString());
+ throw new RenameRevertException(revertEx, e);
+ }
+ throw e;
} finally {
conn.setAutoCommit(true);
}
} catch (SQLException e) {
- try {
- log.error(
- "Failed to update changes in reviewDb for the project {}, rolling back the operation.",
- oldProjectKey.get());
- conn.rollback();
- } catch (SQLException ex) {
- throw new OrmException(ex);
- }
throw new OrmException(e);
}
}
@@ -192,13 +215,18 @@
updateWatchEntries(oldProjectKey, newProjectKey);
} catch (OrmException e) {
log.error(
- "Failed to update changes in noteDb for the project {}, rolling back the operation.",
- oldProjectKey.get());
+ "Failed to update changes in noteDb for project {}, exception caught: {}. Rolling back the operation.",
+ oldProjectKey.get(),
+ e.toString());
try {
updateWatchEntries(newProjectKey, oldProjectKey);
- } catch (OrmException ex) {
- log.error("Failed to revert watched projects after catching {}", e.getMessage());
- throw ex;
+ } catch (OrmException revertEx) {
+ log.error(
+ "Failed to rollback changes in noteDb from project {} to project {}, exception caught: {}",
+ newProjectKey.get(),
+ oldProjectKey.get(),
+ revertEx.toString());
+ throw new RenameRevertException(revertEx, e);
}
throw e;
}
@@ -232,12 +260,14 @@
a.getUserName(),
newProjectKey.get(),
e);
+ throw new OrmException(e);
} catch (IOException e) {
log.error(
"Updating watch entry for user {} in project {} failed.",
a.getUserName(),
newProjectKey.get(),
e);
+ throw new OrmException(e);
}
}
}