From 30b2c2b5adbd61d266c01aea4589f00464da2ebc Mon Sep 17 00:00:00 2001 From: Chris Eager Date: Mon, 17 May 2021 11:26:28 -0500 Subject: [PATCH] Fix observed mismatches by swapping in original UUID --- .../storage/AccountsManager.java | 49 +++++++++++++------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java index 9f4d6605a..c376821b7 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java @@ -118,24 +118,43 @@ public class AccountsManager { public boolean create(Account account) { try (Timer.Context ignored = createTimer.time()) { + final UUID originalUuid = account.getUuid(); boolean freshUser = databaseCreate(account); + + // databaseCreate() sometimes updates the UUID, if there was a number conflict. + // for metrics, we want dynamo to run with the same original UUID + final UUID actualUuid = account.getUuid(); + + try { + if (dynamoWriteEnabled()) { + + account.setUuid(originalUuid); + + runSafelyAndRecordMetrics(() -> dynamoCreate(account), Optional.of(account.getUuid()), freshUser, + (databaseResult, dynamoResult) -> { + + if (!account.getUuid().equals(actualUuid)) { + logger.warn("dynamoCreate() did not return correct UUID"); + } + + if (databaseResult.equals(dynamoResult)) { + return Optional.empty(); + } + + if (dynamoResult) { + return Optional.of("dynamoFreshUser"); + } + + return Optional.of("dbFreshUser"); + }, + "create"); + } + } finally { + account.setUuid(actualUuid); + } + redisSet(account); - if (dynamoWriteEnabled()) { - runSafelyAndRecordMetrics(() -> dynamoCreate(account), Optional.of(account.getUuid()), freshUser, - (databaseResult, dynamoResult) -> { - if (databaseResult.equals(dynamoResult)) { - return Optional.empty(); - } - - if (dynamoResult) { - return Optional.of("dynamoFreshUser"); - } - - return Optional.of("dbFreshUser"); - }, - "create"); - } return freshUser; } }