From f8e4f6727abfafd3027e5836eb841d9b344fb92a Mon Sep 17 00:00:00 2001 From: Chris Eager Date: Tue, 10 Aug 2021 22:21:33 -0500 Subject: [PATCH] Reorder crawler listeners so updates happen after read-only processing --- .../textsecuregcm/WhisperServerService.java | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java index c521fe308..7cbe14ceb 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java @@ -483,19 +483,30 @@ public class WhisperServerService extends Application deletedAccountsDirectoryReconcilers = new ArrayList<>(); + // TODO listeners must be ordered so that ones that directly update accounts come last, so that read-only ones are not working with stale data final List accountDatabaseCrawlerListeners = new ArrayList<>(); - accountDatabaseCrawlerListeners.add(new PushFeedbackProcessor(accountsManager)); - for (DirectoryServerConfiguration directoryServerConfiguration : config.getDirectoryConfiguration().getDirectoryServerConfiguration()) { - final DirectoryReconciliationClient directoryReconciliationClient = new DirectoryReconciliationClient(directoryServerConfiguration); - final DirectoryReconciler directoryReconciler = new DirectoryReconciler(directoryServerConfiguration.getReplicationName(), directoryReconciliationClient); + + // the migrator is read-only + accountDatabaseCrawlerListeners.add(new AccountsDynamoDbMigrator(accountsDynamoDb, dynamicConfigurationManager)); + + final List deletedAccountsDirectoryReconcilers = new ArrayList<>(); + for (DirectoryServerConfiguration directoryServerConfiguration : config.getDirectoryConfiguration() + .getDirectoryServerConfiguration()) { + final DirectoryReconciliationClient directoryReconciliationClient = new DirectoryReconciliationClient( + directoryServerConfiguration); + final DirectoryReconciler directoryReconciler = new DirectoryReconciler( + directoryServerConfiguration.getReplicationName(), directoryReconciliationClient); + // reconcilers are read-only accountDatabaseCrawlerListeners.add(directoryReconciler); - final DeletedAccountsDirectoryReconciler deletedAccountsDirectoryReconciler = new DeletedAccountsDirectoryReconciler(directoryServerConfiguration.getReplicationName(), directoryReconciliationClient); + final DeletedAccountsDirectoryReconciler deletedAccountsDirectoryReconciler = new DeletedAccountsDirectoryReconciler( + directoryServerConfiguration.getReplicationName(), directoryReconciliationClient); deletedAccountsDirectoryReconcilers.add(deletedAccountsDirectoryReconciler); } + // PushFeedbackProcessor may update device properties + accountDatabaseCrawlerListeners.add(new PushFeedbackProcessor(accountsManager)); + // delete accounts last accountDatabaseCrawlerListeners.add(new AccountCleaner(accountsManager)); - accountDatabaseCrawlerListeners.add(new AccountsDynamoDbMigrator(accountsDynamoDb, dynamicConfigurationManager)); HttpClient currencyClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_2).connectTimeout(Duration.ofSeconds(10)).build(); FixerClient fixerClient = new FixerClient(currencyClient, config.getPaymentsServiceConfiguration().getFixerApiKey());