use of com.scalar.db.transaction.rpc.GrpcTransaction in project scalardb by scalar-labs.
the class DistributedTransactionServiceWithConsensusCommitIntegrationTest method abort_forOngoingTransaction_ShouldAbortCorrectly.
@Test
public void abort_forOngoingTransaction_ShouldAbortCorrectly() throws TransactionException {
// Arrange
GrpcTransaction transaction = manager.start();
transaction.get(prepareGet(0, 0, TABLE_1));
transaction.put(preparePut(0, 0, TABLE_1).withValue(BALANCE, 1));
// Act
manager.abort(transaction.getId());
assertThatCode(transaction::commit).isInstanceOf(CommitException.class);
// Assert
TransactionState state = manager.getState(transaction.getId());
assertThat(state).isEqualTo(TransactionState.ABORTED);
}
use of com.scalar.db.transaction.rpc.GrpcTransaction in project scalardb by scalar-labs.
the class DistributedTransactionServiceWithConsensusCommitIntegrationTest method commit_NonConflictingDeletesGivenForExisting_ShouldCommitBoth.
private void commit_NonConflictingDeletesGivenForExisting_ShouldCommitBoth(String table1, String table2) throws TransactionException {
// Arrange
boolean differentTables = !table1.equals(table2);
int account1 = 0;
int account2 = NUM_TYPES;
int account3 = NUM_TYPES * 2;
int account4 = NUM_TYPES * 3;
populateRecords(table1);
if (differentTables) {
populateRecords(table2);
}
// Act
GrpcTransaction transaction = prepareDeletes(account1, table1, account2, table2);
assertThatCode(() -> prepareDeletes(account3, table2, account4, table1).commit()).doesNotThrowAnyException();
assertThatCode(transaction::commit).doesNotThrowAnyException();
// Assert
List<Get> gets1 = prepareGets(table1);
List<Get> gets2 = differentTables ? prepareGets(table2) : gets1;
GrpcTransaction another = manager.start();
assertThat(another.get(gets1.get(account1)).isPresent()).isFalse();
assertThat(another.get(gets2.get(account2)).isPresent()).isFalse();
assertThat(another.get(gets2.get(account3)).isPresent()).isFalse();
assertThat(another.get(gets1.get(account4)).isPresent()).isFalse();
another.commit();
}
use of com.scalar.db.transaction.rpc.GrpcTransaction in project scalardb by scalar-labs.
the class DistributedTransactionServiceWithConsensusCommitIntegrationTest method putAndCommit_GetsAndPutsForSameKeyButDifferentTablesGiven_ShouldCommitBoth.
@Test
public void putAndCommit_GetsAndPutsForSameKeyButDifferentTablesGiven_ShouldCommitBoth() throws TransactionException {
// Arrange
int expected = INITIAL_BALANCE;
List<Put> puts1 = preparePuts(TABLE_1);
List<Put> puts2 = preparePuts(TABLE_2);
int from = 0;
int to = NUM_TYPES;
int anotherFrom = from;
int anotherTo = to;
puts1.get(from).withValue(BALANCE, expected);
puts1.get(to).withValue(BALANCE, expected);
// Act Assert
GrpcTransaction transaction = manager.start();
transaction.put(puts1.get(from));
transaction.put(puts1.get(to));
GrpcTransaction conflictingTransaction = manager.start();
puts2.get(from).withValue(BALANCE, expected);
puts2.get(to).withValue(BALANCE, expected);
assertThatCode(() -> {
conflictingTransaction.put(puts2.get(anotherFrom));
conflictingTransaction.put(puts2.get(anotherTo));
conflictingTransaction.commit();
}).doesNotThrowAnyException();
assertThatCode(transaction::commit).doesNotThrowAnyException();
// Assert
List<Get> gets1 = prepareGets(TABLE_1);
List<Get> gets2 = prepareGets(TABLE_2);
GrpcTransaction another = manager.start();
Optional<Result> fromResult = another.get(gets1.get(from));
assertThat(fromResult).isPresent();
assertThat(getBalance(fromResult.get())).isEqualTo(expected);
Optional<Result> toResult = another.get(gets1.get(to));
assertThat(toResult).isPresent();
assertThat(getBalance(toResult.get())).isEqualTo(expected);
Optional<Result> anotherFromResult = another.get(gets2.get(anotherFrom));
assertThat(anotherFromResult).isPresent();
assertThat(getBalance(anotherFromResult.get())).isEqualTo(expected);
Optional<Result> anotherToResult = another.get(gets2.get(anotherTo));
assertThat(anotherToResult).isPresent();
assertThat(getBalance(anotherToResult.get())).isEqualTo(expected);
another.commit();
}
use of com.scalar.db.transaction.rpc.GrpcTransaction in project scalardb by scalar-labs.
the class DistributedTransactionServiceWithConsensusCommitIntegrationTest method put_DeleteCalledBefore_ShouldThrowIllegalArgumentException.
@Test
public void put_DeleteCalledBefore_ShouldThrowIllegalArgumentException() throws TransactionException {
// Arrange
GrpcTransaction transaction = manager.start();
transaction.put(preparePut(0, 0, TABLE_1).withValue(BALANCE, 1));
transaction.commit();
// Act
GrpcTransaction transaction1 = manager.start();
Get get = prepareGet(0, 0, TABLE_1);
transaction1.get(get);
transaction1.delete(prepareDelete(0, 0, TABLE_1));
Throwable thrown = catchThrowable(() -> transaction1.put(preparePut(0, 0, TABLE_1).withValue(BALANCE, 2)));
transaction1.abort();
// Assert
assertThat(thrown).isInstanceOf(IllegalArgumentException.class);
}
use of com.scalar.db.transaction.rpc.GrpcTransaction in project scalardb by scalar-labs.
the class DistributedTransactionServiceWithConsensusCommitIntegrationTest method getAndScan_CommitHappenedInBetween_ShouldReadRepeatably.
@Test
public void getAndScan_CommitHappenedInBetween_ShouldReadRepeatably() throws TransactionException {
// Arrange
GrpcTransaction transaction = manager.start();
transaction.put(preparePut(0, 0, TABLE_1).withValue(BALANCE, 1));
transaction.commit();
GrpcTransaction transaction1 = manager.start();
Optional<Result> result1 = transaction1.get(prepareGet(0, 0, TABLE_1));
GrpcTransaction transaction2 = manager.start();
transaction2.get(prepareGet(0, 0, TABLE_1));
transaction2.put(preparePut(0, 0, TABLE_1).withValue(BALANCE, 2));
transaction2.commit();
// Act
Result result2 = transaction1.scan(prepareScan(0, 0, 0, TABLE_1)).get(0);
Optional<Result> result3 = transaction1.get(prepareGet(0, 0, TABLE_1));
transaction1.commit();
// Assert
assertThat(result1).isPresent();
assertThat(result1.get()).isEqualTo(result2);
assertThat(result1).isEqualTo(result3);
}
Aggregations