From a8834264029c399118441fd744411aae81653be0 Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Thu, 1 Dec 2022 18:42:30 -0500 Subject: [PATCH] Simplify account cleaner --- .../textsecuregcm/storage/AccountCleaner.java | 35 +++++-------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountCleaner.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountCleaner.java index 051f73c24..7e5340236 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountCleaner.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountCleaner.java @@ -6,8 +6,8 @@ package org.whispersystems.textsecuregcm.storage; import static org.whispersystems.textsecuregcm.metrics.MetricsUtil.name; +import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.Metrics; -import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -17,14 +17,12 @@ import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.whispersystems.textsecuregcm.util.Util; public class AccountCleaner extends AccountDatabaseCrawlerListener { private static final Logger log = LoggerFactory.getLogger(AccountCleaner.class); - private static final String DELETED_ACCOUNT_COUNTER_NAME = name(AccountCleaner.class, "deletedAccounts"); - private static final String DELETION_REASON_TAG_NAME = "reason"; + private static final Counter DELETED_ACCOUNT_COUNTER = Metrics.counter(name(AccountCleaner.class, "deletedAccounts")); private final AccountsManager accountsManager; private final Executor deletionExecutor; @@ -44,13 +42,9 @@ public class AccountCleaner extends AccountDatabaseCrawlerListener { @Override protected void onCrawlChunk(Optional fromUuid, List chunkAccounts) { - final List> deletionFutures = new ArrayList<>(); - - for (Account account : chunkAccounts) { - if (isExpired(account) || needsExplicitRemoval(account)) { - final String deletionReason = needsExplicitRemoval(account) ? "newlyExpired" : "previouslyExpired"; - - deletionFutures.add(CompletableFuture.runAsync(() -> { + final List> deletionFutures = chunkAccounts.stream() + .filter(AccountCleaner::isExpired) + .map(account -> CompletableFuture.runAsync(() -> { try { accountsManager.delete(account, AccountsManager.DeletionReason.EXPIRED); } catch (final InterruptedException e) { @@ -61,11 +55,10 @@ public class AccountCleaner extends AccountDatabaseCrawlerListener { if (throwable != null) { log.warn("Failed to delete account {}", account.getUuid(), throwable); } else { - Metrics.counter(DELETED_ACCOUNT_COUNTER_NAME, DELETION_REASON_TAG_NAME, deletionReason).increment(); + DELETED_ACCOUNT_COUNTER.increment(); } - })); - } - } + })) + .toList(); try { CompletableFuture.allOf(deletionFutures.toArray(new CompletableFuture[0])).join(); @@ -74,17 +67,7 @@ public class AccountCleaner extends AccountDatabaseCrawlerListener { } } - private boolean needsExplicitRemoval(Account account) { - return account.getMasterDevice().isPresent() && - hasPushToken(account.getMasterDevice().get()) && - isExpired(account); - } - - private boolean hasPushToken(Device device) { - return !Util.isEmpty(device.getGcmId()) || !Util.isEmpty(device.getApnId()) || !Util.isEmpty(device.getVoipApnId()) || device.getFetchesMessages(); - } - - private boolean isExpired(Account account) { + private static boolean isExpired(Account account) { return account.getLastSeen() + TimeUnit.DAYS.toMillis(365) < System.currentTimeMillis(); }