use of org.apache.tephra.TransactionContext in project cdap by caskdata.
the class TransactionContextTest method testCanCommitFalse.
@Test
public void testCanCommitFalse() throws TransactionFailureException, InterruptedException {
txClient.failCanCommitOnce = true;
TransactionContext context = newTransactionContext(ds1, ds2);
// start transaction
context.start();
// add a change to ds1 and ds2
ds1.addChange(A);
ds2.addChange(B);
// commit transaction should fail and cause rollback
try {
context.finish();
Assert.fail("commit failed - exception should be thrown");
} catch (TransactionConflictException e) {
Assert.assertNull(e.getCause());
}
// verify both are rolled back and tx is aborted
Assert.assertTrue(ds1.started);
Assert.assertTrue(ds2.started);
Assert.assertTrue(ds1.checked);
Assert.assertTrue(ds2.checked);
Assert.assertFalse(ds1.committed);
Assert.assertFalse(ds2.committed);
Assert.assertFalse(ds1.postCommitted);
Assert.assertFalse(ds2.postCommitted);
Assert.assertTrue(ds1.rolledBack);
Assert.assertTrue(ds2.rolledBack);
Assert.assertEquals(txClient.state, DummyTxClient.CommitState.Aborted);
}
use of org.apache.tephra.TransactionContext in project cdap by caskdata.
the class TransactionContextTest method testAddThenRemoveSuccess.
@Test
public void testAddThenRemoveSuccess() throws TransactionFailureException {
TransactionContext context = newTransactionContext();
context.start();
Assert.assertTrue(context.addTransactionAware(ds1));
ds1.addChange(A);
try {
context.removeTransactionAware(ds1);
Assert.fail("Removal of TransactionAware should fails when there is active transaction.");
} catch (IllegalStateException e) {
// Expected
}
context.finish();
Assert.assertTrue(context.removeTransactionAware(ds1));
// Removing a TransactionAware not added before should returns false
Assert.assertFalse(context.removeTransactionAware(ds2));
// Verify ds1 is committed and post-committed
Assert.assertTrue(ds1.started);
Assert.assertTrue(ds1.checked);
Assert.assertTrue(ds1.committed);
Assert.assertTrue(ds1.postCommitted);
Assert.assertFalse(ds1.rolledBack);
// Verify nothing happen to ds2
Assert.assertFalse(ds2.started);
Assert.assertFalse(ds2.checked);
Assert.assertFalse(ds2.committed);
Assert.assertFalse(ds2.postCommitted);
Assert.assertFalse(ds2.rolledBack);
Assert.assertEquals(txClient.state, DummyTxClient.CommitState.Committed);
}
use of org.apache.tephra.TransactionContext in project cdap by caskdata.
the class TransactionContextTest method testPersistAndRollbackFalse.
@Test
public void testPersistAndRollbackFalse() throws TransactionFailureException, InterruptedException {
ds1.failCommitTxOnce = InduceFailure.ReturnFalse;
ds1.failRollbackTxOnce = InduceFailure.ReturnFalse;
TransactionContext context = newTransactionContext(ds1, ds2);
// start transaction
context.start();
// add a change to ds1 and ds2
ds1.addChange(A);
ds2.addChange(B);
// commit transaction should fail and cause rollback
try {
context.finish();
Assert.fail("Persist should have failed - exception should be thrown");
} catch (TransactionFailureException e) {
// in this case, the ds simply returned false
Assert.assertNull(e.getCause());
}
// verify both are rolled back and tx is invalidated
Assert.assertTrue(ds1.started);
Assert.assertTrue(ds2.started);
Assert.assertTrue(ds1.checked);
Assert.assertTrue(ds2.checked);
Assert.assertTrue(ds1.committed);
Assert.assertFalse(ds2.committed);
Assert.assertFalse(ds1.postCommitted);
Assert.assertFalse(ds2.postCommitted);
Assert.assertTrue(ds1.rolledBack);
Assert.assertTrue(ds2.rolledBack);
Assert.assertEquals(txClient.state, DummyTxClient.CommitState.Invalidated);
}
use of org.apache.tephra.TransactionContext in project cdap by caskdata.
the class TransactionContextTest method testPersistFalse.
@Test
public void testPersistFalse() throws TransactionFailureException, InterruptedException {
ds1.failCommitTxOnce = InduceFailure.ReturnFalse;
TransactionContext context = newTransactionContext(ds1, ds2);
// start transaction
context.start();
// add a change to ds1 and ds2
ds1.addChange(A);
ds2.addChange(B);
// commit transaction should fail and cause rollback
try {
context.finish();
Assert.fail("Persist should have failed - exception should be thrown");
} catch (TransactionFailureException e) {
// in this case, the ds simply returned false
Assert.assertNull(e.getCause());
}
// verify both are rolled back and tx is aborted
Assert.assertTrue(ds1.started);
Assert.assertTrue(ds2.started);
Assert.assertTrue(ds1.checked);
Assert.assertTrue(ds2.checked);
Assert.assertTrue(ds1.committed);
Assert.assertFalse(ds2.committed);
Assert.assertFalse(ds1.postCommitted);
Assert.assertFalse(ds2.postCommitted);
Assert.assertTrue(ds1.rolledBack);
Assert.assertTrue(ds2.rolledBack);
Assert.assertEquals(txClient.state, DummyTxClient.CommitState.Aborted);
}
use of org.apache.tephra.TransactionContext in project cdap by caskdata.
the class TransactionContextTest method testStartAndRollbackFailure.
@Test
public void testStartAndRollbackFailure() throws TransactionFailureException, InterruptedException {
ds1.failStartTxOnce = InduceFailure.ThrowException;
TransactionContext context = newTransactionContext(ds1, ds2);
// start transaction
try {
context.start();
Assert.fail("start failed - exception should be thrown");
} catch (TransactionFailureException e) {
Assert.assertEquals("start failure", e.getCause().getMessage());
}
// verify both are not rolled back and tx is aborted
Assert.assertTrue(ds1.started);
Assert.assertFalse(ds2.started);
Assert.assertFalse(ds1.checked);
Assert.assertFalse(ds2.checked);
Assert.assertFalse(ds1.committed);
Assert.assertFalse(ds2.committed);
Assert.assertFalse(ds1.postCommitted);
Assert.assertFalse(ds2.postCommitted);
Assert.assertFalse(ds1.rolledBack);
Assert.assertFalse(ds2.rolledBack);
Assert.assertEquals(txClient.state, DummyTxClient.CommitState.Aborted);
}
Aggregations