Revert "Delete any leftover usernames in the accounts db"
This reverts commit a44c18e9b7.
Old username cleanup is finished.
			
			
This commit is contained in:
		
							parent
							
								
									a84a7dbc3d
								
							
						
					
					
						commit
						953cd2ae0c
					
				| 
						 | 
					@ -185,7 +185,6 @@ import org.whispersystems.textsecuregcm.storage.MessagesCache;
 | 
				
			||||||
import org.whispersystems.textsecuregcm.storage.MessagesDynamoDb;
 | 
					import org.whispersystems.textsecuregcm.storage.MessagesDynamoDb;
 | 
				
			||||||
import org.whispersystems.textsecuregcm.storage.MessagesManager;
 | 
					import org.whispersystems.textsecuregcm.storage.MessagesManager;
 | 
				
			||||||
import org.whispersystems.textsecuregcm.storage.NonNormalizedAccountCrawlerListener;
 | 
					import org.whispersystems.textsecuregcm.storage.NonNormalizedAccountCrawlerListener;
 | 
				
			||||||
import org.whispersystems.textsecuregcm.storage.UsernameCleaner;
 | 
					 | 
				
			||||||
import org.whispersystems.textsecuregcm.storage.PhoneNumberIdentifiers;
 | 
					import org.whispersystems.textsecuregcm.storage.PhoneNumberIdentifiers;
 | 
				
			||||||
import org.whispersystems.textsecuregcm.storage.Profiles;
 | 
					import org.whispersystems.textsecuregcm.storage.Profiles;
 | 
				
			||||||
import org.whispersystems.textsecuregcm.storage.ProfilesManager;
 | 
					import org.whispersystems.textsecuregcm.storage.ProfilesManager;
 | 
				
			||||||
| 
						 | 
					@ -535,17 +534,6 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
 | 
				
			||||||
        config.getAccountDatabaseCrawlerConfiguration().getChunkIntervalMs()
 | 
					        config.getAccountDatabaseCrawlerConfiguration().getChunkIntervalMs()
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    AccountDatabaseCrawlerCache usernameCleanerAccountDatabaseCrawlerCache =
 | 
					 | 
				
			||||||
        new AccountDatabaseCrawlerCache(cacheCluster, AccountDatabaseCrawlerCache.USERNAME_CLEANER_PREFIX);
 | 
					 | 
				
			||||||
    AccountDatabaseCrawler usernameCleanerAccountDatabaseCrawler = new AccountDatabaseCrawler("username cleaner crawler",
 | 
					 | 
				
			||||||
        accountsManager,
 | 
					 | 
				
			||||||
        usernameCleanerAccountDatabaseCrawlerCache,
 | 
					 | 
				
			||||||
        List.of(new UsernameCleaner(accountsManager)),
 | 
					 | 
				
			||||||
        config.getAccountDatabaseCrawlerConfiguration().getChunkSize(),
 | 
					 | 
				
			||||||
        config.getAccountDatabaseCrawlerConfiguration().getChunkIntervalMs()
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 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
 | 
					    // 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<AccountDatabaseCrawlerListener> accountDatabaseCrawlerListeners = List.of(
 | 
					    final List<AccountDatabaseCrawlerListener> accountDatabaseCrawlerListeners = List.of(
 | 
				
			||||||
        new NonNormalizedAccountCrawlerListener(accountsManager, metricsCluster),
 | 
					        new NonNormalizedAccountCrawlerListener(accountsManager, metricsCluster),
 | 
				
			||||||
| 
						 | 
					@ -575,7 +563,6 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
 | 
				
			||||||
    environment.lifecycle().manage(accountDatabaseCrawler);
 | 
					    environment.lifecycle().manage(accountDatabaseCrawler);
 | 
				
			||||||
    environment.lifecycle().manage(directoryReconciliationAccountDatabaseCrawler);
 | 
					    environment.lifecycle().manage(directoryReconciliationAccountDatabaseCrawler);
 | 
				
			||||||
    environment.lifecycle().manage(accountCleanerAccountDatabaseCrawler);
 | 
					    environment.lifecycle().manage(accountCleanerAccountDatabaseCrawler);
 | 
				
			||||||
    environment.lifecycle().manage(usernameCleanerAccountDatabaseCrawler);
 | 
					 | 
				
			||||||
    environment.lifecycle().manage(deletedAccountsTableCrawler);
 | 
					    environment.lifecycle().manage(deletedAccountsTableCrawler);
 | 
				
			||||||
    environment.lifecycle().manage(messagesCache);
 | 
					    environment.lifecycle().manage(messagesCache);
 | 
				
			||||||
    environment.lifecycle().manage(messagePersister);
 | 
					    environment.lifecycle().manage(messagePersister);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,6 @@ public class AccountDatabaseCrawlerCache {
 | 
				
			||||||
  public static final String GENERAL_PURPOSE_PREFIX = "";
 | 
					  public static final String GENERAL_PURPOSE_PREFIX = "";
 | 
				
			||||||
  public static final String DIRECTORY_RECONCILER_PREFIX = "directory-reconciler";
 | 
					  public static final String DIRECTORY_RECONCILER_PREFIX = "directory-reconciler";
 | 
				
			||||||
  public static final String ACCOUNT_CLEANER_PREFIX = "account-cleaner";
 | 
					  public static final String ACCOUNT_CLEANER_PREFIX = "account-cleaner";
 | 
				
			||||||
  public static final String USERNAME_CLEANER_PREFIX = "username-cleaner";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private static final String ACTIVE_WORKER_KEY = "account_database_crawler_cache_active_worker";
 | 
					  private static final String ACTIVE_WORKER_KEY = "account_database_crawler_cache_active_worker";
 | 
				
			||||||
  private static final String LAST_UUID_KEY = "account_database_crawler_cache_last_uuid";
 | 
					  private static final String LAST_UUID_KEY = "account_database_crawler_cache_last_uuid";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,52 +0,0 @@
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Copyright 2022 Signal Messenger, LLC
 | 
					 | 
				
			||||||
 * SPDX-License-Identifier: AGPL-3.0-only
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package org.whispersystems.textsecuregcm.storage;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import io.micrometer.core.instrument.Metrics;
 | 
					 | 
				
			||||||
import io.micrometer.core.instrument.Tags;
 | 
					 | 
				
			||||||
import org.slf4j.Logger;
 | 
					 | 
				
			||||||
import org.slf4j.LoggerFactory;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import java.util.Optional;
 | 
					 | 
				
			||||||
import java.util.UUID;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import static org.whispersystems.textsecuregcm.metrics.MetricsUtil.name;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class UsernameCleaner extends AccountDatabaseCrawlerListener {
 | 
					 | 
				
			||||||
  private static final String DELETED_USERNAME_COUNTER = name(UsernameCleaner.class, "deletedUsernames");
 | 
					 | 
				
			||||||
  private static final Logger logger = LoggerFactory.getLogger(UsernameCleaner.class);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  private final AccountsManager accountsManager;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  public UsernameCleaner(AccountsManager accountsManager) {
 | 
					 | 
				
			||||||
    this.accountsManager = accountsManager;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @Override
 | 
					 | 
				
			||||||
  public void onCrawlStart() {
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @Override
 | 
					 | 
				
			||||||
  protected void onCrawlChunk(final Optional<UUID> fromUuid, final List<Account> chunkAccounts) {
 | 
					 | 
				
			||||||
    for (Account account : chunkAccounts) {
 | 
					 | 
				
			||||||
      if (account.getUsername().isPresent()) {
 | 
					 | 
				
			||||||
        logger.info("Deleting username present for account {}", account.getUuid());
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
          this.accountsManager.clearUsername(account);
 | 
					 | 
				
			||||||
          Metrics.counter(DELETED_USERNAME_COUNTER, Tags.of("outcome", "success")).increment();
 | 
					 | 
				
			||||||
        } catch (Exception e) {
 | 
					 | 
				
			||||||
          logger.warn("Failed to clear username on account {}", account.getUuid(), e);
 | 
					 | 
				
			||||||
          Metrics.counter(DELETED_USERNAME_COUNTER, Tags.of("outcome", "error")).increment();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @Override
 | 
					 | 
				
			||||||
  public void onCrawlEnd(final Optional<UUID> fromUuid) {
 | 
					 | 
				
			||||||
    logger.info("Username cleaner crawl completed");
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,35 +0,0 @@
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Copyright 2022 Signal Messenger, LLC
 | 
					 | 
				
			||||||
 * SPDX-License-Identifier: AGPL-3.0-only
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
package org.whispersystems.textsecuregcm.storage;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.junit.jupiter.api.BeforeEach;
 | 
					 | 
				
			||||||
import org.junit.jupiter.api.Test;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.util.*;
 | 
					 | 
				
			||||||
import static org.mockito.Mockito.*;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class UsernameCleanerTest {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  private final AccountsManager accountsManager = mock(AccountsManager.class);
 | 
					 | 
				
			||||||
  private final Account hasUsername = mock(Account.class);
 | 
					 | 
				
			||||||
  private final Account noUsername = mock(Account.class);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @BeforeEach
 | 
					 | 
				
			||||||
  void setup() {
 | 
					 | 
				
			||||||
    when(hasUsername.getUsername()).thenReturn(Optional.of("n00bkiller"));
 | 
					 | 
				
			||||||
    when(noUsername.getUsername()).thenReturn(Optional.empty());
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @Test
 | 
					 | 
				
			||||||
  void testAccounts() throws AccountDatabaseCrawlerRestartException {
 | 
					 | 
				
			||||||
    UsernameCleaner accountCleaner = new UsernameCleaner(accountsManager);
 | 
					 | 
				
			||||||
    accountCleaner.onCrawlStart();
 | 
					 | 
				
			||||||
    accountCleaner.timeAndProcessCrawlChunk(Optional.empty(), Arrays.asList(hasUsername, noUsername));
 | 
					 | 
				
			||||||
    accountCleaner.onCrawlEnd(Optional.empty());
 | 
					 | 
				
			||||||
    verify(accountsManager).clearUsername(hasUsername);
 | 
					 | 
				
			||||||
    verify(accountsManager, never()).clearUsername(noUsername);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in New Issue