Search in sources :

Example 1 with State

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();
}
Also used : State(com.scalar.db.transaction.consensuscommit.Coordinator.State) TransactionState(com.scalar.db.api.TransactionState) Result(com.scalar.db.api.Result) Test(org.junit.Test)

Example 2 with State

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);
}
Also used : TransactionState(com.scalar.db.api.TransactionState) TransactionState(com.scalar.db.api.TransactionState) State(com.scalar.db.transaction.consensuscommit.Coordinator.State) Test(org.junit.jupiter.api.Test)

Example 3 with State

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();
}
Also used : State(com.scalar.db.transaction.consensuscommit.Coordinator.State) TransactionState(com.scalar.db.api.TransactionState) Result(com.scalar.db.api.Result) Test(org.junit.jupiter.api.Test)

Example 4 with State

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);
}
Also used : State(com.scalar.db.transaction.consensuscommit.Coordinator.State) TransactionState(com.scalar.db.api.TransactionState) IntValue(com.scalar.db.io.IntValue) Key(com.scalar.db.io.Key) Put(com.scalar.db.api.Put)

Example 5 with 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);
}
Also used : TransactionState(com.scalar.db.api.TransactionState) TransactionState(com.scalar.db.api.TransactionState) State(com.scalar.db.transaction.consensuscommit.Coordinator.State) Test(org.junit.jupiter.api.Test)

Aggregations

TransactionState (com.scalar.db.api.TransactionState)6 State (com.scalar.db.transaction.consensuscommit.Coordinator.State)6 Test (org.junit.jupiter.api.Test)3 Put (com.scalar.db.api.Put)2 Result (com.scalar.db.api.Result)2 IntValue (com.scalar.db.io.IntValue)2 Key (com.scalar.db.io.Key)2 Test (org.junit.Test)1