use of com.scalar.db.transaction.consensuscommit.Coordinator.State in project scalardb by scalar-labs.
the class TwoPhaseConsensusCommitIntegrationTest method commit_WriteSkewOnNonExistingRecordsWithSerializableWithExtraWriteAndCommitStatusFailed_ShouldRollbackProperly.
@Test
public void commit_WriteSkewOnNonExistingRecordsWithSerializableWithExtraWriteAndCommitStatusFailed_ShouldRollbackProperly() throws TransactionException, CoordinatorException {
// Arrange
State state = new State(ANY_ID_1, TransactionState.ABORTED);
coordinator.putState(state);
Isolation isolation = Isolation.SERIALIZABLE;
SerializableStrategy strategy = SerializableStrategy.EXTRA_WRITE;
// Act
TwoPhaseConsensusCommit txSub1 = manager.start(ANY_ID_1, isolation, strategy);
TwoPhaseConsensusCommit txSub2 = manager.join(txSub1.getId(), isolation, strategy);
Optional<Result> result = txSub2.get(prepareGet(1, 0, TABLE_2));
assertThat(result).isNotPresent();
result = txSub1.get(prepareGet(0, 0, TABLE_1));
assertThat(result).isNotPresent();
int current1 = 0;
txSub1.put(preparePut(0, 0, TABLE_1).withValue(BALANCE, current1 + 1));
assertThatThrownBy(() -> {
txSub1.prepare();
txSub2.prepare();
txSub1.commit();
txSub2.commit();
}).isInstanceOf(CommitException.class);
txSub1.rollback();
txSub2.rollback();
// Assert
TwoPhaseConsensusCommit transaction = manager.start();
result = transaction.get(prepareGet(0, 0, TABLE_1));
assertThat(result).isNotPresent();
result = transaction.get(prepareGet(1, 0, TABLE_2));
assertThat(result).isNotPresent();
}
use of com.scalar.db.transaction.consensuscommit.Coordinator.State in project scalardb by scalar-labs.
the class TwoPhaseConsensusCommitManagerTest method check_StateReturned_ReturnTheState.
@Test
public void check_StateReturned_ReturnTheState() throws CoordinatorException {
// Arrange
TransactionState expected = TransactionState.COMMITTED;
when(coordinator.getState(ANY_TX_ID)).thenReturn(Optional.of(new State(ANY_TX_ID, expected)));
// Act
TransactionState actual = manager.getState(ANY_TX_ID);
// Assert
assertThat(actual).isEqualTo(expected);
}
use of com.scalar.db.transaction.consensuscommit.Coordinator.State in project scalardb by scalar-labs.
the class TwoPhaseConsensusCommitSpecificIntegrationTestBase method commit_WriteSkewOnNonExistingRecordsWithSerializableWithExtraWriteAndCommitStatusFailed_ShouldRollbackProperly.
@Test
public void commit_WriteSkewOnNonExistingRecordsWithSerializableWithExtraWriteAndCommitStatusFailed_ShouldRollbackProperly() throws TransactionException, CoordinatorException {
// Arrange
State state = new State(ANY_ID_1, TransactionState.ABORTED);
coordinator.putState(state);
Isolation isolation = Isolation.SERIALIZABLE;
SerializableStrategy strategy = SerializableStrategy.EXTRA_WRITE;
// Act
TwoPhaseConsensusCommit txSub1 = manager.start(ANY_ID_1, isolation, strategy);
TwoPhaseConsensusCommit txSub2 = manager.join(txSub1.getId(), isolation, strategy);
Optional<Result> result = txSub2.get(prepareGet(1, 0, TABLE_2));
assertThat(result).isNotPresent();
result = txSub1.get(prepareGet(0, 0, TABLE_1));
assertThat(result).isNotPresent();
int current1 = 0;
txSub1.put(preparePut(0, 0, TABLE_1).withValue(BALANCE, current1 + 1));
assertThatThrownBy(() -> {
txSub1.prepare();
txSub2.prepare();
txSub1.commit();
txSub2.commit();
}).isInstanceOf(CommitException.class);
txSub1.rollback();
txSub2.rollback();
// Assert
TwoPhaseConsensusCommit transaction = manager.start();
result = transaction.get(prepareGet(0, 0, TABLE_1));
assertThat(result).isNotPresent();
result = transaction.get(prepareGet(1, 0, TABLE_2));
assertThat(result).isNotPresent();
}
use of com.scalar.db.transaction.consensuscommit.Coordinator.State in project scalardb by scalar-labs.
the class TwoPhaseConsensusCommitSpecificIntegrationTestBase method populatePreparedRecordAndCoordinatorStateRecord.
private void populatePreparedRecordAndCoordinatorStateRecord(String table, TransactionState recordState, long preparedAt, TransactionState coordinatorState) throws ExecutionException, CoordinatorException {
Key partitionKey = new Key(new IntValue(ACCOUNT_ID, 0));
Key clusteringKey = new Key(new IntValue(ACCOUNT_TYPE, 0));
Put put = new Put(partitionKey, clusteringKey).forNamespace(namespace).forTable(table).withValue(new IntValue(BALANCE, INITIAL_BALANCE)).withValue(Attribute.toIdValue(ANY_ID_2)).withValue(Attribute.toStateValue(recordState)).withValue(Attribute.toVersionValue(2)).withValue(Attribute.toPreparedAtValue(preparedAt)).withValue(Attribute.toBeforeIdValue(ANY_ID_1)).withValue(Attribute.toBeforeStateValue(TransactionState.COMMITTED)).withValue(Attribute.toBeforeVersionValue(1)).withValue(Attribute.toBeforePreparedAtValue(1)).withValue(Attribute.toBeforeCommittedAtValue(1));
storage.put(put);
if (coordinatorState == null) {
return;
}
State state = new State(ANY_ID_2, coordinatorState);
coordinator.putState(state);
}
use of com.scalar.db.transaction.consensuscommit.Coordinator.State in project scalardb by scalar-labs.
the class ConsensusCommitManagerTest method check_StateReturned_ReturnTheState.
@Test
public void check_StateReturned_ReturnTheState() throws CoordinatorException {
// Arrange
TransactionState expected = TransactionState.COMMITTED;
when(coordinator.getState(ANY_TX_ID)).thenReturn(Optional.of(new State(ANY_TX_ID, expected)));
// Act
TransactionState actual = manager.getState(ANY_TX_ID);
// Assert
assertThat(actual).isEqualTo(expected);
}
Aggregations