mirror of
https://github.com/signalapp/Signal-Server
synced 2026-04-22 02:48:01 +01:00
Workaround lack of internal retry on transaction rollback
The get endpoint for key fetching can fail if the transaction cannot complete because of simultaneous modification. Clients currently receive 500 from this and retry if it happens, but this test case runs into it without retrying and then complains that not all the threads completed successfully. This workaround adds some retry attempts.
This commit is contained in:
@@ -3,16 +3,16 @@ package org.whispersystems.textsecuregcm.tests.storage;
|
||||
import com.opentable.db.postgres.embedded.LiquibasePreparer;
|
||||
import com.opentable.db.postgres.junit.EmbeddedPostgresRules;
|
||||
import com.opentable.db.postgres.junit.PreparedDbRule;
|
||||
import org.jdbi.v3.core.HandleCallback;
|
||||
import io.github.resilience4j.circuitbreaker.CircuitBreakerOpenException;
|
||||
import org.jdbi.v3.core.HandleConsumer;
|
||||
import org.jdbi.v3.core.Jdbi;
|
||||
import org.jdbi.v3.core.statement.UnableToExecuteStatementException;
|
||||
import org.jdbi.v3.core.transaction.SerializableTransactionRunner;
|
||||
import org.jdbi.v3.core.transaction.TransactionException;
|
||||
import org.jdbi.v3.core.transaction.TransactionIsolationLevel;
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.postgresql.util.PSQLException;
|
||||
import org.whispersystems.textsecuregcm.configuration.CircuitBreakerConfiguration;
|
||||
import org.whispersystems.textsecuregcm.entities.PreKey;
|
||||
import org.whispersystems.textsecuregcm.storage.FaultTolerantDatabase;
|
||||
@@ -25,7 +25,6 @@ import java.sql.SQLException;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import io.github.resilience4j.circuitbreaker.CircuitBreakerOpenException;
|
||||
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.doThrow;
|
||||
@@ -246,7 +245,18 @@ public class KeysTest {
|
||||
|
||||
for (int i=0;i<20;i++) {
|
||||
Thread thread = new Thread(() -> {
|
||||
List<KeyRecord> results = keys.get("+14152222222");
|
||||
List<KeyRecord> results = null;
|
||||
final int MAX_RETRIES = 5;
|
||||
for (int retryAttempt = 0; results == null && retryAttempt < MAX_RETRIES; ++retryAttempt) {
|
||||
try {
|
||||
results = keys.get("+14152222222");
|
||||
} catch (UnableToExecuteStatementException e) {
|
||||
if (retryAttempt == MAX_RETRIES - 1) {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
assertThat(results).isNotNull();
|
||||
assertThat(results.size()).isEqualTo(2);
|
||||
});
|
||||
thread.start();
|
||||
|
||||
Reference in New Issue
Block a user