AllAccountsIndexer: Don't load all accounts, but get IDs from user branches Instead of loading all accounts from ReviewDb AllAccountsIndexer can just scan the user branches in All-Users to get the list of all account IDs. Since change I81491a253 it is ensured that we have a user branch for each account. This is a preparation step for migrating the accounts from ReviewDb to NoteDb. Change-Id: I9b371442240da2f26691552255267d9d170ed146 Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Accounts.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Accounts.java index 24b47ec..ce30903 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Accounts.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/Accounts.java
@@ -16,6 +16,7 @@ import static java.util.Comparator.comparing; import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toSet; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.RefNames; @@ -26,6 +27,7 @@ import java.io.IOException; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.stream.Stream; import org.eclipse.jgit.lib.Repository; @@ -42,6 +44,15 @@ } /** + * Returns all account IDs. + * + * @return all account IDs + */ + public Set<Account.Id> allIds() throws IOException { + return readUserRefs().collect(toSet()); + } + + /** * Returns the first n account IDs. * * @param n the number of account IDs that should be returned
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AllAccountsIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AllAccountsIndexer.java index 36a409a..47a8cad 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AllAccountsIndexer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AllAccountsIndexer.java
@@ -21,15 +21,14 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.gerrit.reviewdb.client.Account; -import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.account.AccountCache; import com.google.gerrit.server.account.AccountState; +import com.google.gerrit.server.account.Accounts; import com.google.gerrit.server.index.IndexExecutor; import com.google.gerrit.server.index.SiteIndexer; -import com.google.gwtorm.server.OrmException; -import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Singleton; +import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; @@ -45,17 +44,17 @@ public class AllAccountsIndexer extends SiteIndexer<Account.Id, AccountState, AccountIndex> { private static final Logger log = LoggerFactory.getLogger(AllAccountsIndexer.class); - private final SchemaFactory<ReviewDb> schemaFactory; private final ListeningExecutorService executor; + private final Accounts accounts; private final AccountCache accountCache; @Inject AllAccountsIndexer( - SchemaFactory<ReviewDb> schemaFactory, @IndexExecutor(BATCH) ListeningExecutorService executor, + Accounts accounts, AccountCache accountCache) { - this.schemaFactory = schemaFactory; this.executor = executor; + this.accounts = accounts; this.accountCache = accountCache; } @@ -67,7 +66,7 @@ List<Account.Id> ids; try { ids = collectAccounts(progress); - } catch (OrmException e) { + } catch (IOException e) { log.error("Error collecting accounts", e); return new SiteIndexer.Result(sw, false, 0, 0); } @@ -113,13 +112,12 @@ return new SiteIndexer.Result(sw, ok.get(), done.get(), failed.get()); } - private List<Account.Id> collectAccounts(ProgressMonitor progress) throws OrmException { + private List<Account.Id> collectAccounts(ProgressMonitor progress) throws IOException { progress.beginTask("Collecting accounts", ProgressMonitor.UNKNOWN); List<Account.Id> ids = new ArrayList<>(); - try (ReviewDb db = schemaFactory.open()) { - for (Account account : db.accounts().all()) { - ids.add(account.getId()); - } + for (Account.Id accountId : accounts.allIds()) { + ids.add(accountId); + progress.update(1); } progress.endTask(); return ids;