Avoid NPE when trying to delete changes for a project
After I5babf38b0, trying to delete a project fails in some occasions
with a NPE when trying to open a connection to ReviewDb [1].
Using the ReviewDb provider to get an instance fixes the issue.
[1] https://pastebin.com/9qf9Sntn
Change-Id: I33d4cb86742df536f73c22ee67d0a2c6505d69f3
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java
index b7b09c4..4c2c116 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java
@@ -66,7 +66,7 @@
public class DatabaseDeleteHandler {
private static final Logger log = LoggerFactory.getLogger(DatabaseDeleteHandler.class);
- private final ReviewDb db;
+ private final Provider<ReviewDb> dbProvider;
private final Provider<InternalChangeQuery> queryProvider;
private final GitRepositoryManager repoManager;
private final SubmoduleOp.Factory subOpFactory;
@@ -79,7 +79,7 @@
@Inject
public DatabaseDeleteHandler(
- ReviewDb db,
+ Provider<ReviewDb> dbProvider,
Provider<InternalChangeQuery> queryProvider,
GitRepositoryManager repoManager,
SubmoduleOp.Factory subOpFactory,
@@ -91,7 +91,7 @@
Provider<WatchConfig.Accessor> watchConfig) {
this.accountQueryProvider = accountQueryProvider;
this.watchConfig = watchConfig;
- this.db = ReviewDbUtil.unwrapDb(db);
+ this.dbProvider = dbProvider;
this.queryProvider = queryProvider;
this.repoManager = repoManager;
this.subOpFactory = subOpFactory;
@@ -116,6 +116,7 @@
public void delete(Project project) throws OrmException {
// TODO(davido): Why not to use 1.7 features?
// http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.3.2
+ ReviewDb db = ReviewDbUtil.unwrapDb(dbProvider.get());
Connection conn = ((JdbcSchema) db).getConnection();
try {
conn.setAutoCommit(false);
@@ -128,7 +129,7 @@
while (resultSet.next()) {
changeIds.add(new Change.Id(resultSet.getInt(1)));
}
- atomicDelete(project, changeIds);
+ atomicDelete(db, project, changeIds);
conn.commit();
} finally {
conn.setAutoCommit(true);
@@ -143,7 +144,7 @@
}
}
- private final void deleteChanges(Project.NameKey project, List<Change.Id> changeIds)
+ private final void deleteChanges(ReviewDb db, Project.NameKey project, List<Change.Id> changeIds)
throws OrmException {
for (Change.Id id : changeIds) {
@@ -152,10 +153,9 @@
} catch (NoSuchChangeException e) {
// we can ignore the exception during delete
}
- ResultSet<PatchSet> patchSets = null;
- patchSets = db.patchSets().byChange(id);
+ ResultSet<PatchSet> patchSets = db.patchSets().byChange(id);
if (patchSets != null) {
- deleteFromPatchSets(patchSets);
+ deleteFromPatchSets(db, patchSets);
}
// In the future, use schemaVersion to decide what to delete.
@@ -174,7 +174,8 @@
}
}
- private final void deleteFromPatchSets(final ResultSet<PatchSet> patchSets) throws OrmException {
+ private final void deleteFromPatchSets(ReviewDb db, final ResultSet<PatchSet> patchSets)
+ throws OrmException {
for (PatchSet patchSet : patchSets) {
accountPatchReviewStore.get().clearReviewed(patchSet.getId());
db.patchSets().delete(Collections.singleton(patchSet));
@@ -204,9 +205,10 @@
}
}
- public void atomicDelete(Project project, List<Change.Id> changeIds) throws OrmException {
+ public void atomicDelete(ReviewDb db, Project project, List<Change.Id> changeIds)
+ throws OrmException {
- deleteChanges(project.getNameKey(), changeIds);
+ deleteChanges(db, project.getNameKey(), changeIds);
for (AccountState a : accountQueryProvider.get().byWatchedProject(project.getNameKey())) {
Account.Id accountId = a.getAccount().getId();