diff --git a/core/src/integration-test/java/com/scalar/db/transaction/jdbc/JdbcTransactionIntegrationTest.java b/core/src/integration-test/java/com/scalar/db/transaction/jdbc/JdbcTransactionIntegrationTest.java index fa67a2d870..37bebaf726 100644 --- a/core/src/integration-test/java/com/scalar/db/transaction/jdbc/JdbcTransactionIntegrationTest.java +++ b/core/src/integration-test/java/com/scalar/db/transaction/jdbc/JdbcTransactionIntegrationTest.java @@ -7,8 +7,6 @@ import java.util.Properties; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; public class JdbcTransactionIntegrationTest extends DistributedTransactionIntegrationTestBase { @@ -44,16 +42,4 @@ public void abort_forOngoingTransaction_ShouldAbortCorrectly() {} @Override @Test public void rollback_forOngoingTransaction_ShouldRollbackCorrectly() {} - - @Disabled("Implement later") - @Override - @Test - public void get_GetGivenForCommittedRecord_InReadOnlyMode_ShouldReturnRecord() {} - - @Disabled("Implement later") - @Override - @ParameterizedTest - @EnumSource(ScanType.class) - public void scanOrGetScanner_ScanGivenForCommittedRecord_InReadOnlyMode_ShouldReturnRecords( - ScanType scanType) {} } diff --git a/core/src/main/java/com/scalar/db/storage/jdbc/JdbcAdmin.java b/core/src/main/java/com/scalar/db/storage/jdbc/JdbcAdmin.java index e084b63ae2..a9e34787b7 100644 --- a/core/src/main/java/com/scalar/db/storage/jdbc/JdbcAdmin.java +++ b/core/src/main/java/com/scalar/db/storage/jdbc/JdbcAdmin.java @@ -438,7 +438,7 @@ public TableMetadata getTableMetadata(String namespace, String table) throws Exe boolean tableExists = false; try (Connection connection = dataSource.getConnection()) { - rdbEngine.setReadOnly(connection, true); + rdbEngine.setConnectionToReadOnly(connection, true); try (PreparedStatement preparedStatement = connection.prepareStatement(getSelectColumnsStatement())) { @@ -510,7 +510,7 @@ public TableMetadata getImportTableMetadata( } try (Connection connection = dataSource.getConnection()) { - rdbEngine.setReadOnly(connection, true); + rdbEngine.setConnectionToReadOnly(connection, true); String catalogName = rdbEngine.getCatalogName(namespace); String schemaName = rdbEngine.getSchemaName(namespace); @@ -608,7 +608,7 @@ public Set getNamespaceTableNames(String namespace) throws ExecutionExce + enclose(METADATA_COL_FULL_TABLE_NAME) + " LIKE ?"; try (Connection connection = dataSource.getConnection()) { - rdbEngine.setReadOnly(connection, true); + rdbEngine.setConnectionToReadOnly(connection, true); try (PreparedStatement preparedStatement = connection.prepareStatement(selectTablesOfNamespaceStatement)) { @@ -644,7 +644,7 @@ public boolean namespaceExists(String namespace) throws ExecutionException { + enclose(NAMESPACE_COL_NAMESPACE_NAME) + " = ?"; try (Connection connection = dataSource.getConnection()) { - rdbEngine.setReadOnly(connection, true); + rdbEngine.setConnectionToReadOnly(connection, true); try (PreparedStatement statement = connection.prepareStatement(selectQuery)) { statement.setString(1, namespace); @@ -992,7 +992,7 @@ private String encloseFullTableName(String schema, String table) { @Override public Set getNamespaceNames() throws ExecutionException { try (Connection connection = dataSource.getConnection()) { - rdbEngine.setReadOnly(connection, true); + rdbEngine.setConnectionToReadOnly(connection, true); String selectQuery = "SELECT * FROM " + encloseFullTableName(metadataSchema, NAMESPACES_TABLE); diff --git a/core/src/main/java/com/scalar/db/storage/jdbc/JdbcDatabase.java b/core/src/main/java/com/scalar/db/storage/jdbc/JdbcDatabase.java index 7a17ea1a34..c6c6af21d7 100644 --- a/core/src/main/java/com/scalar/db/storage/jdbc/JdbcDatabase.java +++ b/core/src/main/java/com/scalar/db/storage/jdbc/JdbcDatabase.java @@ -82,7 +82,7 @@ public Optional get(Get get) throws ExecutionException { Connection connection = null; try { connection = dataSource.getConnection(); - rdbEngine.setReadOnly(connection, true); + rdbEngine.setConnectionToReadOnly(connection, true); return jdbcService.get(get, connection); } catch (SQLException e) { throw new ExecutionException( @@ -98,7 +98,7 @@ public Scanner scan(Scan scan) throws ExecutionException { Connection connection = null; try { connection = dataSource.getConnection(); - rdbEngine.setReadOnly(connection, true); + rdbEngine.setConnectionToReadOnly(connection, true); return jdbcService.getScanner(scan, connection); } catch (SQLException e) { close(connection); diff --git a/core/src/main/java/com/scalar/db/storage/jdbc/RdbEngineSqlite.java b/core/src/main/java/com/scalar/db/storage/jdbc/RdbEngineSqlite.java index c2e39ec827..0501d9a22e 100644 --- a/core/src/main/java/com/scalar/db/storage/jdbc/RdbEngineSqlite.java +++ b/core/src/main/java/com/scalar/db/storage/jdbc/RdbEngineSqlite.java @@ -340,7 +340,7 @@ public RdbEngineTimeTypeStrategy getTimeTypeStrategy( } @Override - public void setReadOnly(Connection connection, boolean readOnly) { + public void setConnectionToReadOnly(Connection connection, boolean readOnly) { // Do nothing. SQLite does not support read-only mode. } } diff --git a/core/src/main/java/com/scalar/db/storage/jdbc/RdbEngineStrategy.java b/core/src/main/java/com/scalar/db/storage/jdbc/RdbEngineStrategy.java index 9195dd7975..583cf016ee 100644 --- a/core/src/main/java/com/scalar/db/storage/jdbc/RdbEngineStrategy.java +++ b/core/src/main/java/com/scalar/db/storage/jdbc/RdbEngineStrategy.java @@ -230,7 +230,8 @@ default void throwIfDuplicatedIndexWarning(SQLWarning warning) throws SQLExcepti // Do nothing } - default void setReadOnly(Connection connection, boolean readOnly) throws SQLException { + default void setConnectionToReadOnly(Connection connection, boolean readOnly) + throws SQLException { connection.setReadOnly(readOnly); } } diff --git a/core/src/main/java/com/scalar/db/transaction/jdbc/JdbcTransactionManager.java b/core/src/main/java/com/scalar/db/transaction/jdbc/JdbcTransactionManager.java index b38862f7ba..0f334227af 100644 --- a/core/src/main/java/com/scalar/db/transaction/jdbc/JdbcTransactionManager.java +++ b/core/src/main/java/com/scalar/db/transaction/jdbc/JdbcTransactionManager.java @@ -18,6 +18,7 @@ import com.scalar.db.api.Upsert; import com.scalar.db.common.AbstractDistributedTransactionManager; import com.scalar.db.common.AbstractTransactionManagerCrudOperableScanner; +import com.scalar.db.common.ReadOnlyDistributedTransaction; import com.scalar.db.common.TableMetadataManager; import com.scalar.db.common.checker.OperationChecker; import com.scalar.db.common.error.CoreError; @@ -36,6 +37,7 @@ import com.scalar.db.storage.jdbc.RdbEngineFactory; import com.scalar.db.storage.jdbc.RdbEngineStrategy; import com.scalar.db.util.ThrowableFunction; +import java.sql.Connection; import java.sql.SQLException; import java.util.List; import java.util.Optional; @@ -90,14 +92,39 @@ public JdbcTransactionManager(DatabaseConfig databaseConfig) { @Override public DistributedTransaction begin() throws TransactionException { String txId = UUID.randomUUID().toString(); - return begin(txId); + return begin(txId, false); } @Override public DistributedTransaction begin(String txId) throws TransactionException { + return begin(txId, false); + } + + @Override + public DistributedTransaction beginReadOnly() throws TransactionException { + String txId = UUID.randomUUID().toString(); + return begin(txId, true); + } + + @Override + public DistributedTransaction beginReadOnly(String txId) throws TransactionException { + return begin(txId, true); + } + + private DistributedTransaction begin(String txId, boolean readOnly) throws TransactionException { try { - JdbcTransaction transaction = - new JdbcTransaction(txId, jdbcService, dataSource.getConnection(), rdbEngine); + Connection connection = dataSource.getConnection(); + + DistributedTransaction transaction; + if (readOnly) { + rdbEngine.setConnectionToReadOnly(connection, true); + transaction = + new ReadOnlyDistributedTransaction( + new JdbcTransaction(txId, jdbcService, connection, rdbEngine)); + } else { + transaction = new JdbcTransaction(txId, jdbcService, connection, rdbEngine); + } + getNamespace().ifPresent(transaction::withNamespace); getTable().ifPresent(transaction::withTable); return transaction; @@ -109,16 +136,6 @@ public DistributedTransaction begin(String txId) throws TransactionException { } } - @Override - public DistributedTransaction beginReadOnly() { - throw new UnsupportedOperationException("implement later"); - } - - @Override - public DistributedTransaction beginReadOnly(String txId) { - throw new UnsupportedOperationException("implement later"); - } - /** @deprecated As of release 2.4.0. Will be removed in release 4.0.0. */ @SuppressWarnings("InlineMeSuggester") @Deprecated @@ -173,19 +190,19 @@ public DistributedTransaction start( @Override public Optional get(Get get) throws CrudException, UnknownTransactionStatusException { - return executeTransaction(t -> t.get(copyAndSetTargetToIfNot(get))); + return executeTransaction(t -> t.get(copyAndSetTargetToIfNot(get)), true); } @Override public List scan(Scan scan) throws CrudException, UnknownTransactionStatusException { - return executeTransaction(t -> t.scan(copyAndSetTargetToIfNot(scan))); + return executeTransaction(t -> t.scan(copyAndSetTargetToIfNot(scan)), true); } @Override public Scanner getScanner(Scan scan) throws CrudException { DistributedTransaction transaction; try { - transaction = begin(); + transaction = beginReadOnly(); } catch (TransactionNotFoundException e) { throw new CrudConflictException(e.getMessage(), e, e.getTransactionId().orElse(null)); } catch (TransactionException e) { @@ -277,7 +294,8 @@ public void put(Put put) throws CrudException, UnknownTransactionStatusException t -> { t.put(copyAndSetTargetToIfNot(put)); return null; - }); + }, + false); } /** @deprecated As of release 3.13.0. Will be removed in release 5.0.0. */ @@ -288,7 +306,8 @@ public void put(List puts) throws CrudException, UnknownTransactionStatusEx t -> { t.put(copyAndSetTargetToIfNot(puts)); return null; - }); + }, + false); } @Override @@ -297,7 +316,8 @@ public void insert(Insert insert) throws CrudException, UnknownTransactionStatus t -> { t.insert(copyAndSetTargetToIfNot(insert)); return null; - }); + }, + false); } @Override @@ -306,7 +326,8 @@ public void upsert(Upsert upsert) throws CrudException, UnknownTransactionStatus t -> { t.upsert(copyAndSetTargetToIfNot(upsert)); return null; - }); + }, + false); } @Override @@ -315,7 +336,8 @@ public void update(Update update) throws CrudException, UnknownTransactionStatus t -> { t.update(copyAndSetTargetToIfNot(update)); return null; - }); + }, + false); } @Override @@ -324,7 +346,8 @@ public void delete(Delete delete) throws CrudException, UnknownTransactionStatus t -> { t.delete(copyAndSetTargetToIfNot(delete)); return null; - }); + }, + false); } /** @deprecated As of release 3.13.0. Will be removed in release 5.0.0. */ @@ -335,7 +358,8 @@ public void delete(List deletes) throws CrudException, UnknownTransactio t -> { t.delete(copyAndSetTargetToIfNot(deletes)); return null; - }); + }, + false); } @Override @@ -345,15 +369,21 @@ public void mutate(List mutations) t -> { t.mutate(copyAndSetTargetToIfNot(mutations)); return null; - }); + }, + false); } private R executeTransaction( - ThrowableFunction throwableFunction) + ThrowableFunction throwableFunction, + boolean readOnly) throws CrudException, UnknownTransactionStatusException { DistributedTransaction transaction; try { - transaction = begin(); + if (readOnly) { + transaction = beginReadOnly(); + } else { + transaction = begin(); + } } catch (TransactionNotFoundException e) { throw new CrudConflictException(e.getMessage(), e, e.getTransactionId().orElse(null)); } catch (TransactionException e) { diff --git a/core/src/test/java/com/scalar/db/transaction/jdbc/JdbcTransactionManagerTest.java b/core/src/test/java/com/scalar/db/transaction/jdbc/JdbcTransactionManagerTest.java index 80d0375e6d..8a34348e14 100644 --- a/core/src/test/java/com/scalar/db/transaction/jdbc/JdbcTransactionManagerTest.java +++ b/core/src/test/java/com/scalar/db/transaction/jdbc/JdbcTransactionManagerTest.java @@ -25,6 +25,7 @@ import com.scalar.db.api.Update; import com.scalar.db.api.Upsert; import com.scalar.db.common.ActiveTransactionManagedDistributedTransactionManager; +import com.scalar.db.common.ReadOnlyDistributedTransaction; import com.scalar.db.config.DatabaseConfig; import com.scalar.db.exception.storage.ExecutionException; import com.scalar.db.exception.transaction.AbortException; @@ -131,6 +132,77 @@ public void whenGetOperationsExecutedAndJdbcServiceThrowsSQLException_shouldThro .isInstanceOf(CrudException.class); } + @Test + public void begin_WithoutTxId_ShouldCreateNewTransaction() throws Exception { + // Arrange + Connection connection = mock(Connection.class); + when(dataSource.getConnection()).thenReturn(connection); + + // Act + DistributedTransaction actual = manager.begin(); + + // Assert + verify(dataSource).getConnection(); + assertThat(actual).isInstanceOf(JdbcTransaction.class); + } + + @Test + public void begin_WithTxId_ShouldCreateTransactionWithGivenId() throws Exception { + // Arrange + Connection connection = mock(Connection.class); + when(dataSource.getConnection()).thenReturn(connection); + String txId = "my-tx-id"; + + // Act + DistributedTransaction actual = manager.begin(txId); + + // Assert + verify(dataSource).getConnection(); + assertThat(actual).isInstanceOf(JdbcTransaction.class); + assertThat(actual.getId()).isEqualTo(txId); + } + + @Test + public void beginReadOnly_WithoutTxId_ShouldCreateReadOnlyTransaction() throws Exception { + // Arrange + Connection connection = mock(Connection.class); + when(dataSource.getConnection()).thenReturn(connection); + + // Act + DistributedTransaction actual = manager.beginReadOnly(); + + // Assert + verify(dataSource).getConnection(); + verify(connection).setReadOnly(true); + assertThat(actual).isInstanceOf(ReadOnlyDistributedTransaction.class); + } + + @Test + public void beginReadOnly_WithTxId_ShouldCreateReadOnlyTransactionWithGivenId() throws Exception { + // Arrange + Connection connection = mock(Connection.class); + when(dataSource.getConnection()).thenReturn(connection); + String txId = "my-tx-id"; + + // Act + DistributedTransaction result = manager.beginReadOnly(txId); + + // Assert + verify(dataSource).getConnection(); + verify(connection).setReadOnly(true); + assertThat(result).isInstanceOf(ReadOnlyDistributedTransaction.class); + assertThat(result.getId()).isEqualTo(txId); + } + + @Test + public void begin_SQLExceptionThrown_ShouldThrowTransactionException() throws Exception { + // Arrange + when(dataSource.getConnection()).thenThrow(SQLException.class); + + // Act Assert + assertThatThrownBy(() -> manager.begin()).isInstanceOf(TransactionException.class); + } + @Test public void get_withConflictError_shouldThrowCrudConflictException() throws SQLException, ExecutionException { @@ -187,7 +259,7 @@ public void getScannerAndScannerOne_ShouldReturnScannerAndReturnProperResult() t DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(); + doReturn(transaction).when(spied).beginReadOnly(); Scan scan = Scan.newBuilder() @@ -217,7 +289,7 @@ public void getScannerAndScannerOne_ShouldReturnScannerAndReturnProperResult() t assertThat(actual.one()).isEmpty(); actual.close(); - verify(spied).begin(); + verify(spied).beginReadOnly(); verify(transaction).commit(); verify(scanner).close(); } @@ -228,7 +300,7 @@ public void getScannerAndScannerAll_ShouldReturnScannerAndReturnProperResults() DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(); + doReturn(transaction).when(spied).beginReadOnly(); Scan scan = Scan.newBuilder() @@ -255,7 +327,7 @@ public void getScannerAndScannerAll_ShouldReturnScannerAndReturnProperResults() assertThat(actual.all()).isEmpty(); actual.close(); - verify(spied).begin(); + verify(spied).beginReadOnly(); verify(transaction).commit(); verify(scanner).close(); } @@ -267,7 +339,7 @@ public void getScannerAndScannerIterator_ShouldReturnScannerAndReturnProperResul DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(); + doReturn(transaction).when(spied).beginReadOnly(); Scan scan = Scan.newBuilder() @@ -302,7 +374,7 @@ public void getScannerAndScannerIterator_ShouldReturnScannerAndReturnProperResul assertThat(iterator.hasNext()).isFalse(); actual.close(); - verify(spied).begin(); + verify(spied).beginReadOnly(); verify(transaction).commit(); verify(scanner).close(); } @@ -313,14 +385,14 @@ public void getScannerAndScannerIterator_ShouldReturnScannerAndReturnProperResul throws TransactionException { // Arrange JdbcTransactionManager spied = spy(manager); - doThrow(TransactionNotFoundException.class).when(spied).begin(); + doThrow(TransactionNotFoundException.class).when(spied).beginReadOnly(); Scan scan = mock(Scan.class); // Act Assert assertThatThrownBy(() -> spied.getScanner(scan)).isInstanceOf(CrudConflictException.class); - verify(spied).begin(); + verify(spied).beginReadOnly(); } @Test @@ -328,14 +400,14 @@ public void getScanner_TransactionExceptionThrownByTransactionBegin_ShouldThrowC throws TransactionException { // Arrange JdbcTransactionManager spied = spy(manager); - doThrow(TransactionException.class).when(spied).begin(); + doThrow(TransactionException.class).when(spied).beginReadOnly(); Scan scan = mock(Scan.class); // Act Assert assertThatThrownBy(() -> spied.getScanner(scan)).isInstanceOf(CrudException.class); - verify(spied).begin(); + verify(spied).beginReadOnly(); } @Test @@ -346,7 +418,7 @@ public void getScanner_TransactionExceptionThrownByTransactionBegin_ShouldThrowC DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(); + doReturn(transaction).when(spied).beginReadOnly(); Scan scan = Scan.newBuilder() @@ -360,7 +432,7 @@ public void getScanner_TransactionExceptionThrownByTransactionBegin_ShouldThrowC // Act Assert assertThatThrownBy(() -> spied.getScanner(scan)).isInstanceOf(CrudException.class); - verify(spied).begin(); + verify(spied).beginReadOnly(); verify(transaction).rollback(); } @@ -372,7 +444,7 @@ public void getScanner_TransactionExceptionThrownByTransactionBegin_ShouldThrowC DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(); + doReturn(transaction).when(spied).beginReadOnly(); Scan scan = Scan.newBuilder() @@ -390,7 +462,7 @@ public void getScanner_TransactionExceptionThrownByTransactionBegin_ShouldThrowC TransactionManagerCrudOperable.Scanner actual = spied.getScanner(scan); assertThatThrownBy(actual::one).isInstanceOf(CrudException.class); - verify(spied).begin(); + verify(spied).beginReadOnly(); verify(scanner).close(); verify(transaction).rollback(); } @@ -402,7 +474,7 @@ public void getScanner_TransactionExceptionThrownByTransactionBegin_ShouldThrowC // Arrange DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(); + doReturn(transaction).when(spied).beginReadOnly(); Scan scan = Scan.newBuilder() @@ -420,7 +492,7 @@ public void getScanner_TransactionExceptionThrownByTransactionBegin_ShouldThrowC TransactionManagerCrudOperable.Scanner actual = spied.getScanner(scan); assertThatThrownBy(actual::all).isInstanceOf(CrudException.class); - verify(spied).begin(); + verify(spied).beginReadOnly(); verify(scanner).close(); verify(transaction).rollback(); } @@ -432,7 +504,7 @@ public void getScanner_TransactionExceptionThrownByTransactionBegin_ShouldThrowC // Arrange DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(); + doReturn(transaction).when(spied).beginReadOnly(); Scan scan = Scan.newBuilder() @@ -450,7 +522,7 @@ public void getScanner_TransactionExceptionThrownByTransactionBegin_ShouldThrowC TransactionManagerCrudOperable.Scanner actual = spied.getScanner(scan); assertThatThrownBy(actual::close).isInstanceOf(CrudException.class); - verify(spied).begin(); + verify(spied).beginReadOnly(); verify(scanner).close(); verify(transaction).rollback(); } @@ -463,7 +535,7 @@ public void getScanner_TransactionExceptionThrownByTransactionBegin_ShouldThrowC DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(); + doReturn(transaction).when(spied).beginReadOnly(); doThrow(CommitConflictException.class).when(transaction).commit(); Scan scan = @@ -480,7 +552,7 @@ public void getScanner_TransactionExceptionThrownByTransactionBegin_ShouldThrowC TransactionManagerCrudOperable.Scanner actual = spied.getScanner(scan); assertThatThrownBy(actual::close).isInstanceOf(CrudConflictException.class); - verify(spied).begin(); + verify(spied).beginReadOnly(); verify(scanner).close(); verify(transaction).rollback(); } @@ -493,7 +565,7 @@ public void getScanner_TransactionExceptionThrownByTransactionBegin_ShouldThrowC DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(); + doReturn(transaction).when(spied).beginReadOnly(); doThrow(UnknownTransactionStatusException.class).when(transaction).commit(); Scan scan = @@ -510,7 +582,7 @@ public void getScanner_TransactionExceptionThrownByTransactionBegin_ShouldThrowC TransactionManagerCrudOperable.Scanner actual = spied.getScanner(scan); assertThatThrownBy(actual::close).isInstanceOf(UnknownTransactionStatusException.class); - verify(spied).begin(); + verify(spied).beginReadOnly(); verify(scanner).close(); } @@ -522,7 +594,7 @@ public void getScanner_TransactionExceptionThrownByTransactionBegin_ShouldThrowC DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(); + doReturn(transaction).when(spied).beginReadOnly(); doThrow(CommitException.class).when(transaction).commit(); Scan scan = @@ -539,7 +611,7 @@ public void getScanner_TransactionExceptionThrownByTransactionBegin_ShouldThrowC TransactionManagerCrudOperable.Scanner actual = spied.getScanner(scan); assertThatThrownBy(actual::close).isInstanceOf(CrudException.class); - verify(spied).begin(); + verify(spied).beginReadOnly(); verify(scanner).close(); verify(transaction).rollback(); } @@ -994,7 +1066,7 @@ public void get_ShouldGet() throws TransactionException { DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(any()); + doReturn(transaction).when(spied).beginReadOnly(); Get get = Get.newBuilder().namespace("ns").table("tbl").partitionKey(Key.ofInt("pk", 0)).build(); @@ -1006,7 +1078,7 @@ public void get_ShouldGet() throws TransactionException { Optional actual = spied.get(get); // Assert - verify(spied).begin(any()); + verify(spied).beginReadOnly(); verify(transaction).get(get); verify(transaction).commit(); assertThat(actual).isEqualTo(Optional.of(result)); @@ -1018,7 +1090,7 @@ public void get_ShouldGet() throws TransactionException { throws TransactionException { // Arrange JdbcTransactionManager spied = spy(manager); - doThrow(TransactionNotFoundException.class).when(spied).begin(any()); + doThrow(TransactionNotFoundException.class).when(spied).beginReadOnly(); Get get = Get.newBuilder().namespace("ns").table("tbl").partitionKey(Key.ofInt("pk", 0)).build(); @@ -1026,7 +1098,7 @@ public void get_ShouldGet() throws TransactionException { // Act Assert assertThatThrownBy(() -> spied.get(get)).isInstanceOf(CrudConflictException.class); - verify(spied).begin(any()); + verify(spied).beginReadOnly(); } @Test @@ -1034,7 +1106,7 @@ public void get_TransactionExceptionThrownByTransactionBegin_ShouldThrowCrudExce throws TransactionException { // Arrange JdbcTransactionManager spied = spy(manager); - doThrow(TransactionException.class).when(spied).begin(any()); + doThrow(TransactionException.class).when(spied).beginReadOnly(); Get get = Get.newBuilder().namespace("ns").table("tbl").partitionKey(Key.ofInt("pk", 0)).build(); @@ -1042,7 +1114,7 @@ public void get_TransactionExceptionThrownByTransactionBegin_ShouldThrowCrudExce // Act Assert assertThatThrownBy(() -> spied.get(get)).isInstanceOf(CrudException.class); - verify(spied).begin(any()); + verify(spied).beginReadOnly(); } @Test @@ -1052,7 +1124,7 @@ public void get_CrudExceptionThrownByTransactionGet_ShouldThrowCrudException() DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(any()); + doReturn(transaction).when(spied).beginReadOnly(); Get get = Get.newBuilder().namespace("ns").table("tbl").partitionKey(Key.ofInt("pk", 0)).build(); @@ -1061,7 +1133,7 @@ public void get_CrudExceptionThrownByTransactionGet_ShouldThrowCrudException() // Act Assert assertThatThrownBy(() -> spied.get(get)).isInstanceOf(CrudException.class); - verify(spied).begin(any()); + verify(spied).beginReadOnly(); verify(transaction).get(get); verify(transaction).rollback(); } @@ -1074,7 +1146,7 @@ public void get_CrudExceptionThrownByTransactionGet_ShouldThrowCrudException() DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(any()); + doReturn(transaction).when(spied).beginReadOnly(); Get get = Get.newBuilder().namespace("ns").table("tbl").partitionKey(Key.ofInt("pk", 0)).build(); @@ -1083,7 +1155,7 @@ public void get_CrudExceptionThrownByTransactionGet_ShouldThrowCrudException() // Act Assert assertThatThrownBy(() -> spied.get(get)).isInstanceOf(CrudConflictException.class); - verify(spied).begin(any()); + verify(spied).beginReadOnly(); verify(transaction).get(get); verify(transaction).rollback(); } @@ -1096,7 +1168,7 @@ public void get_CrudExceptionThrownByTransactionGet_ShouldThrowCrudException() DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(any()); + doReturn(transaction).when(spied).beginReadOnly(); Get get = Get.newBuilder().namespace("ns").table("tbl").partitionKey(Key.ofInt("pk", 0)).build(); @@ -1105,7 +1177,7 @@ public void get_CrudExceptionThrownByTransactionGet_ShouldThrowCrudException() // Act Assert assertThatThrownBy(() -> spied.get(get)).isInstanceOf(UnknownTransactionStatusException.class); - verify(spied).begin(any()); + verify(spied).beginReadOnly(); verify(transaction).get(get); verify(transaction).commit(); } @@ -1117,7 +1189,7 @@ public void get_CommitExceptionThrownByTransactionCommit_ShouldThrowUCrudExcepti DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(any()); + doReturn(transaction).when(spied).beginReadOnly(); Get get = Get.newBuilder().namespace("ns").table("tbl").partitionKey(Key.ofInt("pk", 0)).build(); @@ -1126,7 +1198,7 @@ public void get_CommitExceptionThrownByTransactionCommit_ShouldThrowUCrudExcepti // Act Assert assertThatThrownBy(() -> spied.get(get)).isInstanceOf(CrudException.class); - verify(spied).begin(any()); + verify(spied).beginReadOnly(); verify(transaction).get(get); verify(transaction).commit(); } @@ -1137,7 +1209,7 @@ public void scan_ShouldScan() throws TransactionException { DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(any()); + doReturn(transaction).when(spied).beginReadOnly(); Scan scan = Scan.newBuilder().namespace("ns").table("tbl").partitionKey(Key.ofInt("pk", 0)).build(); @@ -1150,7 +1222,7 @@ public void scan_ShouldScan() throws TransactionException { List actual = spied.scan(scan); // Assert - verify(spied).begin(any()); + verify(spied).beginReadOnly(); verify(transaction).scan(scan); verify(transaction).commit(); assertThat(actual).isEqualTo(results); @@ -1162,7 +1234,7 @@ public void put_ShouldPut() throws TransactionException { DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(any()); + doReturn(transaction).when(spied).begin(); Put put = Put.newBuilder() @@ -1176,7 +1248,7 @@ public void put_ShouldPut() throws TransactionException { spied.put(put); // Assert - verify(spied).begin(any()); + verify(spied).begin(); verify(transaction).put(put); verify(transaction).commit(); } @@ -1187,7 +1259,7 @@ public void put_MultiplePutsGiven_ShouldPut() throws TransactionException { DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(any()); + doReturn(transaction).when(spied).begin(); List puts = Arrays.asList( @@ -1214,7 +1286,7 @@ public void put_MultiplePutsGiven_ShouldPut() throws TransactionException { spied.put(puts); // Assert - verify(spied).begin(any()); + verify(spied).begin(); verify(transaction).put(puts); verify(transaction).commit(); } @@ -1225,7 +1297,7 @@ public void insert_ShouldInsert() throws TransactionException { DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(any()); + doReturn(transaction).when(spied).begin(); Insert insert = Insert.newBuilder() @@ -1239,7 +1311,7 @@ public void insert_ShouldInsert() throws TransactionException { spied.insert(insert); // Assert - verify(spied).begin(any()); + verify(spied).begin(); verify(transaction).insert(insert); verify(transaction).commit(); } @@ -1250,7 +1322,7 @@ public void upsert_ShouldUpsert() throws TransactionException { DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(any()); + doReturn(transaction).when(spied).begin(); Upsert upsert = Upsert.newBuilder() @@ -1264,7 +1336,7 @@ public void upsert_ShouldUpsert() throws TransactionException { spied.upsert(upsert); // Assert - verify(spied).begin(any()); + verify(spied).begin(); verify(transaction).upsert(upsert); verify(transaction).commit(); } @@ -1275,7 +1347,7 @@ public void update_ShouldUpdate() throws TransactionException { DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(any()); + doReturn(transaction).when(spied).begin(); Update update = Update.newBuilder() @@ -1289,7 +1361,7 @@ public void update_ShouldUpdate() throws TransactionException { spied.update(update); // Assert - verify(spied).begin(any()); + verify(spied).begin(); verify(transaction).update(update); verify(transaction).commit(); } @@ -1300,7 +1372,7 @@ public void delete_ShouldDelete() throws TransactionException { DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(any()); + doReturn(transaction).when(spied).begin(); Delete delete = Delete.newBuilder().namespace("ns").table("tbl").partitionKey(Key.ofInt("pk", 0)).build(); @@ -1309,7 +1381,7 @@ public void delete_ShouldDelete() throws TransactionException { spied.delete(delete); // Assert - verify(spied).begin(any()); + verify(spied).begin(); verify(transaction).delete(delete); verify(transaction).commit(); } @@ -1320,7 +1392,7 @@ public void delete_MultipleDeletesGiven_ShouldDelete() throws TransactionExcepti DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(any()); + doReturn(transaction).when(spied).begin(); List deletes = Arrays.asList( @@ -1344,7 +1416,7 @@ public void delete_MultipleDeletesGiven_ShouldDelete() throws TransactionExcepti spied.delete(deletes); // Assert - verify(spied).begin(any()); + verify(spied).begin(); verify(transaction).delete(deletes); verify(transaction).commit(); } @@ -1355,7 +1427,7 @@ public void mutate_ShouldMutate() throws TransactionException { DistributedTransaction transaction = mock(DistributedTransaction.class); JdbcTransactionManager spied = spy(manager); - doReturn(transaction).when(spied).begin(any()); + doReturn(transaction).when(spied).begin(); List mutations = Arrays.asList( @@ -1393,7 +1465,7 @@ public void mutate_ShouldMutate() throws TransactionException { spied.mutate(mutations); // Assert - verify(spied).begin(any()); + verify(spied).begin(); verify(transaction).mutate(mutations); verify(transaction).commit(); }