@Test
public void testCommitAbortedReport() throws Exception {
secondClientHandler.setAutoFullAbort(false);
clientHandler.sendMessage(new TimestampRequest());
clientHandler.receiveBootstrap();
TimestampResponse tr1 = clientHandler.receiveMessage(TimestampResponse.class);
secondClientHandler.sendMessage(new TimestampRequest());
secondClientHandler.receiveBootstrap();
TimestampResponse tr2 = secondClientHandler.receiveMessage(TimestampResponse.class);
clientHandler.sendMessage(new CommitRequest(tr1.timestamp, new RowKey[] { r1 }));
CommitResponse cr1 = clientHandler.receiveMessage(CommitResponse.class);
assertTrue(cr1.committed);
assertTrue(cr1.commitTimestamp > tr1.timestamp);
assertEquals(tr1.timestamp, cr1.startTimestamp);
secondClientHandler.sendMessage(new CommitRequest(tr2.timestamp, new RowKey[] { r1, r2 }));
CommitResponse cr2 = secondClientHandler.receiveMessage(CommitResponse.class);
assertEquals(tr2.timestamp, cr2.startTimestamp);
assertFalse(cr2.committed);
clientHandler.sendMessage(new TimestampRequest());
CommittedTransactionReport ctr2 = clientHandler.receiveMessage(CommittedTransactionReport.class);
assertEquals(cr1.commitTimestamp, ctr2.commitTimestamp);
assertEquals(cr1.startTimestamp, ctr2.startTimestamp);
//
// Half Aborted Transaction Report
//
AbortedTransactionReport atr1 = clientHandler.receiveMessage(AbortedTransactionReport.class);
assertEquals(tr2.timestamp, atr1.startTimestamp);
clientHandler.receiveMessage(TimestampResponse.class);
secondClientHandler.sendMessage(new TimestampRequest());
CommittedTransactionReport ctr3 = secondClientHandler.receiveMessage(CommittedTransactionReport.class);
assertEquals(cr1.commitTimestamp, ctr3.commitTimestamp);
assertEquals(cr1.startTimestamp, ctr3.startTimestamp);
//
// Half Aborted Transaction Report
//
AbortedTransactionReport atr2 = secondClientHandler.receiveMessage(AbortedTransactionReport.class);
assertEquals(tr2.timestamp, atr2.startTimestamp);
secondClientHandler.receiveMessage(TimestampResponse.class);
secondClientHandler.sendMessage(new FullAbortRequest(tr2.timestamp));
// Let the TSO receive and process the FullAbortReport
secondClientHandler.sendMessage(new CommitQueryRequest(0, 0));
secondClientHandler.receiveMessage();
//
// Cleaned Transaction Report
//
clientHandler.sendMessage(new TimestampRequest());
CleanedTransactionReport cltr1 = clientHandler.receiveMessage(CleanedTransactionReport.class);
assertEquals(tr2.timestamp, cltr1.startTimestamp);
//
// Cleaned Transaction Report
//
secondClientHandler.sendMessage(new TimestampRequest());
CleanedTransactionReport cltr2 = secondClientHandler.receiveMessage(CleanedTransactionReport.class);
assertEquals(tr2.timestamp, cltr2.startTimestamp);
}