From 32c0712715988c5aa82af1639d82f4e4fe742e49 Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Sat, 3 Jan 2015 19:43:19 -0800 Subject: [PATCH] Chunk local directory update queries. // FREEBIE --- .../storage/DirectoryManager.java | 3 ++ .../workers/DirectoryUpdater.java | 32 +++++++++++-------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryManager.java b/src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryManager.java index 1c0c2f950..78c7e96a1 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryManager.java +++ b/src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryManager.java @@ -171,12 +171,15 @@ public class DirectoryManager { } private static class TokenValue { + @JsonProperty(value = "r") private String relay; @JsonProperty(value = "s") private boolean supportsSms; + public TokenValue() {} + public TokenValue(String relay, boolean supportsSms) { this.relay = relay; this.supportsSms = supportsSms; diff --git a/src/main/java/org/whispersystems/textsecuregcm/workers/DirectoryUpdater.java b/src/main/java/org/whispersystems/textsecuregcm/workers/DirectoryUpdater.java index 2348e0500..d27b0e059 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/workers/DirectoryUpdater.java +++ b/src/main/java/org/whispersystems/textsecuregcm/workers/DirectoryUpdater.java @@ -38,6 +38,8 @@ import static org.whispersystems.textsecuregcm.storage.DirectoryManager.PendingC public class DirectoryUpdater { + private static final int CHUNK_SIZE = 10000; + private final Logger logger = LoggerFactory.getLogger(DirectoryUpdater.class); private final AccountsManager accountsManager; @@ -60,24 +62,28 @@ public class DirectoryUpdater { try { logger.info("Updating from local DB."); - Iterator accounts = accountsManager.getAll(); + int offset = 0; - if (accounts == null) - return; + for (;;) { + List accounts = accountsManager.getAll(offset, CHUNK_SIZE); - while (accounts.hasNext()) { - Account account = accounts.next(); + if (accounts == null || accounts.isEmpty()) break; + else offset += accounts.size(); - if (account.isActive()) { - byte[] token = Util.getContactToken(account.getNumber()); - ClientContact clientContact = new ClientContact(token, null, account.getSupportsSms()); + for (Account account : accounts) { + if (account.isActive()) { + byte[] token = Util.getContactToken(account.getNumber()); + ClientContact clientContact = new ClientContact(token, null, account.getSupportsSms()); - directory.add(batchOperation, clientContact); - contactsAdded++; - } else { - directory.remove(batchOperation, account.getNumber()); - contactsRemoved++; + directory.add(batchOperation, clientContact); + contactsAdded++; + } else { + directory.remove(batchOperation, account.getNumber()); + contactsRemoved++; + } } + + logger.info("Processed " + CHUNK_SIZE + " local accounts..."); } } finally { directory.stopBatchOperation(batchOperation);