From 18a6df34bdde0e7c34da628b0471d647bb5d0f46 Mon Sep 17 00:00:00 2001 From: Chris Eager Date: Fri, 3 Sep 2021 14:35:08 -0700 Subject: [PATCH] Add timers to `processChunk` and `deleteRecentlyDeletedUuids` --- .../storage/AccountDatabaseCrawler.java | 68 ++++++++++--------- .../storage/AccountsDynamoDb.java | 15 ++-- 2 files changed, 47 insertions(+), 36 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawler.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawler.java index d6b5bdd7f..7102b1551 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawler.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawler.java @@ -23,18 +23,20 @@ import org.whispersystems.textsecuregcm.util.Util; @SuppressWarnings("OptionalUsedAsFieldOrParameterType") public class AccountDatabaseCrawler implements Managed, Runnable { - private static final Logger logger = LoggerFactory.getLogger(AccountDatabaseCrawler.class); + private static final Logger logger = LoggerFactory.getLogger(AccountDatabaseCrawler.class); private static final MetricRegistry metricRegistry = SharedMetricRegistries.getOrCreate(Constants.METRICS_NAME); - private static final Timer readChunkTimer = metricRegistry.timer(name(AccountDatabaseCrawler.class, "readChunk")); + private static final Timer readChunkTimer = metricRegistry.timer(name(AccountDatabaseCrawler.class, "readChunk")); + private static final Timer processChunkTimer = metricRegistry.timer( + name(AccountDatabaseCrawler.class, "processChunk")); - private static final long WORKER_TTL_MS = 120_000L; - private static final long ACCELERATED_CHUNK_INTERVAL = 10L; + private static final long WORKER_TTL_MS = 120_000L; + private static final long ACCELERATED_CHUNK_INTERVAL = 10L; - private final AccountsManager accounts; - private final int chunkSize; - private final long chunkIntervalMs; - private final String workerId; - private final AccountDatabaseCrawlerCache cache; + private final AccountsManager accounts; + private final int chunkSize; + private final long chunkIntervalMs; + private final String workerId; + private final AccountDatabaseCrawlerCache cache; private final List listeners; private final DynamicConfigurationManager dynamicConfigurationManager; @@ -118,34 +120,38 @@ public class AccountDatabaseCrawler implements Managed, Runnable { } private void processChunk() { - final boolean useDynamo = dynamicConfigurationManager.getConfiguration() - .getAccountsDynamoDbMigrationConfiguration() - .isDynamoCrawlerEnabled(); - final Optional fromUuid = getLastUuid(useDynamo); + try (Timer.Context timer = processChunkTimer.time()) { - if (fromUuid.isEmpty()) { - logger.info("Started crawl"); - listeners.forEach(AccountDatabaseCrawlerListener::onCrawlStart); - } + final boolean useDynamo = dynamicConfigurationManager.getConfiguration() + .getAccountsDynamoDbMigrationConfiguration() + .isDynamoCrawlerEnabled(); - final AccountCrawlChunk chunkAccounts = readChunk(fromUuid, chunkSize, useDynamo); + final Optional fromUuid = getLastUuid(useDynamo); - if (chunkAccounts.getAccounts().isEmpty()) { - logger.info("Finished crawl"); - listeners.forEach(listener -> listener.onCrawlEnd(fromUuid)); - cacheLastUuid(Optional.empty(), useDynamo); - cache.setAccelerated(false); - } else { - logger.info("Processing chunk"); - try { - for (AccountDatabaseCrawlerListener listener : listeners) { - listener.timeAndProcessCrawlChunk(fromUuid, chunkAccounts.getAccounts()); - } - cacheLastUuid(chunkAccounts.getLastUuid(), useDynamo); - } catch (AccountDatabaseCrawlerRestartException e) { + if (fromUuid.isEmpty()) { + logger.info("Started crawl"); + listeners.forEach(AccountDatabaseCrawlerListener::onCrawlStart); + } + + final AccountCrawlChunk chunkAccounts = readChunk(fromUuid, chunkSize, useDynamo); + + if (chunkAccounts.getAccounts().isEmpty()) { + logger.info("Finished crawl"); + listeners.forEach(listener -> listener.onCrawlEnd(fromUuid)); cacheLastUuid(Optional.empty(), useDynamo); cache.setAccelerated(false); + } else { + logger.info("Processing chunk"); + try { + for (AccountDatabaseCrawlerListener listener : listeners) { + listener.timeAndProcessCrawlChunk(fromUuid, chunkAccounts.getAccounts()); + } + cacheLastUuid(chunkAccounts.getLastUuid(), useDynamo); + } catch (AccountDatabaseCrawlerRestartException e) { + cacheLastUuid(Optional.empty(), useDynamo); + cache.setAccelerated(false); + } } } } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsDynamoDb.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsDynamoDb.java index 000636470..fee196cca 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsDynamoDb.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsDynamoDb.java @@ -74,6 +74,8 @@ public class AccountsDynamoDb extends AbstractDynamoDbStore implements AccountSt private static final Timer GET_ALL_FROM_START_TIMER = Metrics.timer(name(AccountsDynamoDb.class, "getAllFrom")); private static final Timer GET_ALL_FROM_OFFSET_TIMER = Metrics.timer(name(AccountsDynamoDb.class, "getAllFromOffset")); private static final Timer DELETE_TIMER = Metrics.timer(name(AccountsDynamoDb.class, "delete")); + private static final Timer DELETE_RECENTLY_DELETED_UUIDS_TIMER = Metrics.timer( + name(AccountsDynamoDb.class, "deleteRecentlyDeletedUuids")); private final Logger logger = LoggerFactory.getLogger(AccountsDynamoDb.class); @@ -361,13 +363,16 @@ public class AccountsDynamoDb extends AbstractDynamoDbStore implements AccountSt public void deleteRecentlyDeletedUuids() { - final List recentlyDeletedUuids = migrationDeletedAccounts.getRecentlyDeletedUuids(); + DELETE_RECENTLY_DELETED_UUIDS_TIMER.record(() -> { - for (UUID recentlyDeletedUuid : recentlyDeletedUuids) { - delete(recentlyDeletedUuid, false); - } + final List recentlyDeletedUuids = migrationDeletedAccounts.getRecentlyDeletedUuids(); - migrationDeletedAccounts.delete(recentlyDeletedUuids); + for (UUID recentlyDeletedUuid : recentlyDeletedUuids) { + delete(recentlyDeletedUuid, false); + } + + migrationDeletedAccounts.delete(recentlyDeletedUuids); + }); } public CompletableFuture migrate(Account account) {