Check length of cancellation reason list before getting reason codes
This commit is contained in:
parent
bae0196bcf
commit
1e1394560d
|
@ -387,7 +387,7 @@ public class Accounts extends AbstractDynamoDbStore {
|
||||||
|
|
||||||
} catch (final TransactionCanceledException e) {
|
} catch (final TransactionCanceledException e) {
|
||||||
|
|
||||||
if ("ConditionalCheckFailed".equals(e.cancellationReasons().get(1).code())) {
|
if (e.cancellationReasons().size() > 1 && "ConditionalCheckFailed".equals(e.cancellationReasons().get(1).code())) {
|
||||||
log.error("Conflicting phone number mapping exists for account {}, PNI {}", account.getUuid(), account.getPhoneNumberIdentifier());
|
log.error("Conflicting phone number mapping exists for account {}, PNI {}", account.getUuid(), account.getPhoneNumberIdentifier());
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@ import org.whispersystems.textsecuregcm.util.SystemMapper;
|
||||||
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
|
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
|
||||||
import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition;
|
import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition;
|
||||||
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
|
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
|
||||||
|
import software.amazon.awssdk.services.dynamodb.model.CancellationReason;
|
||||||
import software.amazon.awssdk.services.dynamodb.model.CreateTableRequest;
|
import software.amazon.awssdk.services.dynamodb.model.CreateTableRequest;
|
||||||
import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;
|
import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;
|
||||||
import software.amazon.awssdk.services.dynamodb.model.GetItemResponse;
|
import software.amazon.awssdk.services.dynamodb.model.GetItemResponse;
|
||||||
|
@ -366,6 +367,29 @@ class AccountsTest {
|
||||||
assertThatThrownBy(() -> accounts.update(account)).isInstanceOfAny(ContestedOptimisticLockException.class);
|
assertThatThrownBy(() -> accounts.update(account)).isInstanceOfAny(ContestedOptimisticLockException.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
// TODO Remove after initial migration is complete
|
||||||
|
void testUpdateWithMockTransactionCancellationException() {
|
||||||
|
|
||||||
|
final DynamoDbClient dynamoDbClient = mock(DynamoDbClient.class);
|
||||||
|
accounts = new Accounts(dynamoDbClient,
|
||||||
|
dynamoDbExtension.getTableName(), NUMBER_CONSTRAINT_TABLE_NAME, PNI_CONSTRAINT_TABLE_NAME, SCAN_PAGE_SIZE);
|
||||||
|
|
||||||
|
when(dynamoDbClient.transactWriteItems(any(TransactWriteItemsRequest.class)))
|
||||||
|
.thenThrow(TransactionCanceledException.builder()
|
||||||
|
.cancellationReasons(CancellationReason.builder()
|
||||||
|
.code("Test")
|
||||||
|
.build())
|
||||||
|
.build());
|
||||||
|
|
||||||
|
when(dynamoDbClient.getItem(any(GetItemRequest.class))).thenReturn(GetItemResponse.builder().build());
|
||||||
|
|
||||||
|
Device device = generateDevice(1);
|
||||||
|
Account account = generateAccount("+14151112222", UUID.randomUUID(), UUID.randomUUID(), Collections.singleton(device));
|
||||||
|
|
||||||
|
assertThatThrownBy(() -> accounts.update(account)).isInstanceOfAny(TransactionCanceledException.class);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testRetrieveFrom() {
|
void testRetrieveFrom() {
|
||||||
List<Account> users = new ArrayList<>();
|
List<Account> users = new ArrayList<>();
|
||||||
|
|
Loading…
Reference in New Issue