Remove usage of AccountAccess#all() from schema migrations
The schema migrations should continue to work when AccountAccess is
removed (because accounts are migrated to NoteDb), hence use SQL to
query accounts.
Change-Id: I5009d6de7e67553d0ff5ccf23dc18bf950fc0bcf
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AccountsOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AccountsOnInit.java
index ee939d6..9465a54 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AccountsOnInit.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AccountsOnInit.java
@@ -56,7 +56,8 @@
try (Repository repo = new FileRepository(path);
ObjectInserter oi = repo.newObjectInserter()) {
PersonIdent serverIdent = new GerritPersonIdentProvider(flags.cfg).get();
- AccountsUpdate.createUserBranch(repo, oi, serverIdent, serverIdent, account);
+ AccountsUpdate.createUserBranch(
+ repo, oi, serverIdent, serverIdent, account.getId(), account.getRegisteredOn());
}
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsUpdate.java
index 54e06de..f6ed598 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsUpdate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsUpdate.java
@@ -247,7 +247,8 @@
"User branch %s for newly created account %s already exists.",
refName, account.getId().get()));
}
- createUserBranch(repo, oi, committerIdent, authorIdent, account);
+ createUserBranch(
+ repo, oi, committerIdent, authorIdent, account.getId(), account.getRegisteredOn());
}
}
@@ -255,7 +256,8 @@
try (Repository repo = repoManager.openRepository(allUsersName);
ObjectInserter oi = repo.newObjectInserter()) {
if (repo.exactRef(RefNames.refsUsers(account.getId())) == null) {
- createUserBranch(repo, oi, committerIdent, authorIdent, account);
+ createUserBranch(
+ repo, oi, committerIdent, authorIdent, account.getId(), account.getRegisteredOn());
}
}
}
@@ -265,12 +267,12 @@
ObjectInserter oi,
PersonIdent committerIdent,
PersonIdent authorIdent,
- Account account)
+ Account.Id accountId,
+ Timestamp registeredOn)
throws IOException {
- ObjectId id =
- createInitialEmptyCommit(oi, committerIdent, authorIdent, account.getRegisteredOn());
+ ObjectId id = createInitialEmptyCommit(oi, committerIdent, authorIdent, registeredOn);
- String refName = RefNames.refsUsers(account.getId());
+ String refName = RefNames.refsUsers(accountId);
RefUpdate ru = repo.updateRef(refName);
ru.setExpectedOldObjectId(ObjectId.zeroId());
ru.setNewObjectId(id);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_146.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_146.java
index dd11396..4896f3a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_146.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_146.java
@@ -25,8 +25,12 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
import java.io.IOException;
+import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.Statement;
import java.sql.Timestamp;
+import java.util.HashMap;
+import java.util.Map;
import org.eclipse.jgit.lib.CommitBuilder;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
@@ -77,13 +81,14 @@
ObjectInserter oi = repo.newObjectInserter()) {
ObjectId emptyTree = emptyTree(oi);
- for (Account account : db.accounts().all()) {
- String refName = RefNames.refsUsers(account.getId());
+ for (Map.Entry<Account.Id, Timestamp> e : scanAccounts(db).entrySet()) {
+ String refName = RefNames.refsUsers(e.getKey());
Ref ref = repo.exactRef(refName);
if (ref != null) {
- rewriteUserBranch(repo, rw, oi, emptyTree, ref, account);
+ rewriteUserBranch(repo, rw, oi, emptyTree, ref, e.getValue());
} else {
- AccountsUpdate.createUserBranch(repo, oi, serverIdent, serverIdent, account);
+ AccountsUpdate.createUserBranch(
+ repo, oi, serverIdent, serverIdent, e.getKey(), e.getValue());
}
}
} catch (IOException e) {
@@ -92,9 +97,14 @@
}
private void rewriteUserBranch(
- Repository repo, RevWalk rw, ObjectInserter oi, ObjectId emptyTree, Ref ref, Account account)
+ Repository repo,
+ RevWalk rw,
+ ObjectInserter oi,
+ ObjectId emptyTree,
+ Ref ref,
+ Timestamp registeredOn)
throws IOException {
- ObjectId current = createInitialEmptyCommit(oi, emptyTree, account.getRegisteredOn());
+ ObjectId current = createInitialEmptyCommit(oi, emptyTree, registeredOn);
rw.reset();
rw.sort(RevSort.TOPO);
@@ -153,4 +163,15 @@
private static ObjectId emptyTree(ObjectInserter oi) throws IOException {
return oi.insert(Constants.OBJ_TREE, new byte[] {});
}
+
+ private Map<Account.Id, Timestamp> scanAccounts(ReviewDb db) throws SQLException {
+ try (Statement stmt = newStatement(db);
+ ResultSet rs = stmt.executeQuery("SELECT account_id, registered_on FROM accounts")) {
+ HashMap<Account.Id, Timestamp> m = new HashMap<>();
+ while (rs.next()) {
+ m.put(new Account.Id(rs.getInt(1)), rs.getTimestamp(2));
+ }
+ return m;
+ }
+ }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_147.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_147.java
index 8585988..48d1e7e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_147.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_147.java
@@ -27,7 +27,10 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
import java.io.IOException;
+import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import org.eclipse.jgit.lib.PersonIdent;
@@ -54,8 +57,7 @@
@Override
protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
try (Repository repo = repoManager.openRepository(allUsersName)) {
- Set<Account.Id> accountIdsFromReviewDb =
- db.accounts().all().toList().stream().map(a -> a.getId()).collect(toSet());
+ Set<Account.Id> accountIdsFromReviewDb = scanAccounts(db);
Set<Account.Id> accountIdsFromUserBranches =
repo.getRefDatabase()
.getRefs(RefNames.REFS_USERS)
@@ -72,4 +74,15 @@
throw new OrmException("Failed to delete user branches for non-existing accounts.", e);
}
}
+
+ private Set<Account.Id> scanAccounts(ReviewDb db) throws SQLException {
+ try (Statement stmt = newStatement(db);
+ ResultSet rs = stmt.executeQuery("SELECT account_id FROM accounts")) {
+ Set<Account.Id> ids = new HashSet<>();
+ while (rs.next()) {
+ ids.add(new Account.Id(rs.getInt(1)));
+ }
+ return ids;
+ }
+ }
}