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 a703e2052..739636084 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsDynamoDb.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsDynamoDb.java @@ -177,11 +177,13 @@ public class AccountsDynamoDb extends AbstractDynamoDbStore implements AccountSt updateItemRequest = new UpdateItemRequest() .withTableName(accountsTable.getTableName()) .withKey(Map.of(KEY_ACCOUNT_UUID, new AttributeValue().withB(UUIDUtil.toByteBuffer(account.getUuid())))) - .withUpdateExpression("SET #data=:data") + .withUpdateExpression("SET #data = :data, #version = :version") .withConditionExpression("attribute_exists(#number)") .withExpressionAttributeNames(Map.of("#number", ATTR_ACCOUNT_E164, - "#data", ATTR_ACCOUNT_DATA)) - .withExpressionAttributeValues(Map.of(":data", new AttributeValue().withB(ByteBuffer.wrap(SystemMapper.getMapper().writeValueAsBytes(account))))); + "#data", ATTR_ACCOUNT_DATA, + "#version", ATTR_MIGRATION_VERSION)) + .withExpressionAttributeValues(Map.of(":data", new AttributeValue().withB(ByteBuffer.wrap(SystemMapper.getMapper().writeValueAsBytes(account))), + ":version", new AttributeValue().withN(String.valueOf(account.getDynamoDbMigrationVersion())))); } catch (JsonProcessingException e) { throw new IllegalArgumentException(e); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsDynamoDbTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsDynamoDbTest.java index 48d08d28c..c6947fc81 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsDynamoDbTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsDynamoDbTest.java @@ -208,12 +208,18 @@ class AccountsDynamoDbTest { retrieved = accountsDynamoDb.get(account.getUuid()); assertThat(retrieved.isPresent()).isTrue(); - verifyStoredState("+14151112222", account.getUuid(), retrieved.get(), account); + verifyStoredState("+14151112222", account.getUuid(), account); device = generateDevice(1); Account unknownAccount = generateAccount("+14151113333", UUID.randomUUID(), Collections.singleton(device)); assertThatThrownBy(() -> accountsDynamoDb.update(unknownAccount)).isInstanceOfAny(ConditionalCheckFailedException.class); + + account.setDynamoDbMigrationVersion(5); + + accountsDynamoDb.update(account); + + verifyStoredState("+14151112222", account.getUuid(), account); } @Test @@ -403,6 +409,9 @@ class AccountsDynamoDbTest { String data = new String(item.getBinary(AccountsDynamoDb.ATTR_ACCOUNT_DATA), StandardCharsets.UTF_8); assertThat(data).isNotEmpty(); + assertThat(item.getNumber(AccountsDynamoDb.ATTR_MIGRATION_VERSION).intValue()) + .isEqualTo(expecting.getDynamoDbMigrationVersion()); + Account result = AccountsDynamoDb.fromItem(item); verifyStoredState(number, uuid, result, expecting); } else {