use of com.scalar.db.transaction.rpc.GrpcTransaction in project scalardb by scalar-labs.
the class DistributedTransactionServiceWithConsensusCommitIntegrationTest method delete_PutCalledBefore_ShouldDelete.
@Test
public void delete_PutCalledBefore_ShouldDelete() 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);
Optional<Result> resultBefore = transaction1.get(get);
transaction1.put(preparePut(0, 0, TABLE_1).withValue(BALANCE, 2));
transaction1.delete(prepareDelete(0, 0, TABLE_1));
assertThatCode(transaction1::commit).doesNotThrowAnyException();
// Assert
GrpcTransaction transaction2 = manager.start();
Optional<Result> resultAfter = transaction2.get(get);
transaction2.commit();
assertThat(resultBefore.isPresent()).isTrue();
assertThat(resultAfter.isPresent()).isFalse();
}
use of com.scalar.db.transaction.rpc.GrpcTransaction in project scalardb by scalar-labs.
the class DistributedTransactionServiceWithConsensusCommitIntegrationTest method commit_WriteSkewOnExistingRecordsWithSnapshot_ShouldProduceNonSerializableResult.
private void commit_WriteSkewOnExistingRecordsWithSnapshot_ShouldProduceNonSerializableResult(String table1, String table2) throws TransactionException {
// Arrange
List<Put> puts = Arrays.asList(preparePut(0, 0, table1).withValue(BALANCE, 1), preparePut(0, 1, table2).withValue(BALANCE, 1));
GrpcTransaction transaction = manager.start();
transaction.put(puts);
transaction.commit();
// Act
GrpcTransaction transaction1 = manager.start();
GrpcTransaction transaction2 = manager.start();
Get get1_1 = prepareGet(0, 1, table2);
Optional<Result> result1 = transaction1.get(get1_1);
assertThat(result1).isPresent();
int current1 = getBalance(result1.get());
Get get1_2 = prepareGet(0, 0, table1);
transaction1.get(get1_2);
Get get2_1 = prepareGet(0, 0, table1);
Optional<Result> result2 = transaction2.get(get2_1);
assertThat(result2).isPresent();
int current2 = getBalance(result2.get());
Get get2_2 = prepareGet(0, 1, table2);
transaction2.get(get2_2);
Put put1 = preparePut(0, 0, table1).withValue(BALANCE, current1 + 1);
transaction1.put(put1);
Put put2 = preparePut(0, 1, table2).withValue(BALANCE, current2 + 1);
transaction2.put(put2);
transaction1.commit();
transaction2.commit();
// Assert
transaction = manager.start();
result1 = transaction.get(get1_1);
result2 = transaction.get(get2_1);
transaction.commit();
// the results can not be produced by executing the transactions serially
assertThat(result1).isPresent();
assertThat(getBalance(result1.get())).isEqualTo(2);
assertThat(result2).isPresent();
assertThat(getBalance(result2.get())).isEqualTo(2);
}
use of com.scalar.db.transaction.rpc.GrpcTransaction in project scalardb by scalar-labs.
the class DistributedTransactionServiceWithConsensusCommitIntegrationTest method deleteAndCommit_DeleteGivenInBetweenTransactions_ShouldProduceSerializableResults.
@Test
public void deleteAndCommit_DeleteGivenInBetweenTransactions_ShouldProduceSerializableResults() throws TransactionException {
// Arrange
GrpcTransaction transaction = manager.start();
transaction.put(preparePut(0, 0, TABLE_1).withValue(BALANCE, 2));
transaction.commit();
// Act
GrpcTransaction transaction1 = manager.start();
transaction1.get(prepareGet(0, 0, TABLE_1));
transaction1.delete(prepareDelete(0, 0, TABLE_1));
GrpcTransaction transaction2 = manager.start();
transaction2.get(prepareGet(0, 0, TABLE_1));
transaction2.delete(prepareDelete(0, 0, TABLE_1));
transaction2.commit();
// the same transaction processing as transaction1
GrpcTransaction transaction3 = manager.start();
Optional<Result> result3 = transaction3.get(prepareGet(0, 0, TABLE_1));
int balance3 = 0;
if (result3.isPresent()) {
balance3 = getBalance(result3.get());
}
transaction3.put(preparePut(0, 0, TABLE_1).withValue(BALANCE, balance3 + 1));
transaction3.commit();
Throwable thrown = catchThrowable(transaction1::commit);
// Assert
assertThat(thrown).isInstanceOf(CommitConflictException.class);
transaction = manager.start();
Optional<Result> result = transaction.get(prepareGet(0, 0, TABLE_1));
transaction.commit();
assertThat(result).isPresent();
assertThat(getBalance(result.get())).isEqualTo(1);
}
use of com.scalar.db.transaction.rpc.GrpcTransaction in project scalardb by scalar-labs.
the class DistributedTransactionServiceWithConsensusCommitIntegrationTest method putAndCommit_PutGivenForExistingAndNeverRead_ShouldThrowCommitException.
@Test
public void putAndCommit_PutGivenForExistingAndNeverRead_ShouldThrowCommitException() throws TransactionException {
// Arrange
populateRecords(TABLE_1);
List<Put> puts = preparePuts(TABLE_1);
puts.get(0).withValue(BALANCE, 1100);
GrpcTransaction transaction = manager.start();
// Act Assert
transaction.put(puts.get(0));
assertThatThrownBy(transaction::commit).isInstanceOf(CommitException.class);
}
use of com.scalar.db.transaction.rpc.GrpcTransaction in project scalardb by scalar-labs.
the class DistributedTransactionServiceWithConsensusCommitWithExtraReadIntegrationTest method commit_WriteSkewWithScanOnNonExistingRecordsWithSerializableWithExtraRead_ShouldThrowCommitConflictException.
@Test
public void commit_WriteSkewWithScanOnNonExistingRecordsWithSerializableWithExtraRead_ShouldThrowCommitConflictException() throws TransactionException {
// Arrange
// no records
// Act
GrpcTransaction transaction1 = manager.start();
GrpcTransaction transaction2 = manager.start();
List<Result> results1 = transaction1.scan(prepareScan(0, 0, 1, TABLE_1));
int count1 = results1.size();
List<Result> results2 = transaction2.scan(prepareScan(0, 0, 1, TABLE_1));
int count2 = results2.size();
Put put1 = preparePut(0, 0, TABLE_1).withValue(BALANCE, count1 + 1);
transaction1.put(put1);
Put put2 = preparePut(0, 1, TABLE_1).withValue(BALANCE, count2 + 1);
transaction2.put(put2);
Throwable thrown1 = catchThrowable(transaction1::commit);
Throwable thrown2 = catchThrowable(transaction2::commit);
// Assert
assertThat(results1).isEmpty();
assertThat(results2).isEmpty();
GrpcTransaction transaction = manager.start();
Optional<Result> result1 = transaction.get(prepareGet(0, 0, TABLE_1));
Optional<Result> result2 = transaction.get(prepareGet(0, 1, TABLE_1));
transaction.commit();
assertThat(result1.isPresent()).isTrue();
assertThat(getBalance(result1.get())).isEqualTo(1);
assertThat(result2.isPresent()).isFalse();
assertThat(thrown1).doesNotThrowAnyException();
assertThat(thrown2).isInstanceOf(CommitConflictException.class);
}
Aggregations