clientHandler.sendMessage(new TimestampRequest());
clientHandler.receiveBootstrap();
TimestampResponse tr1 = clientHandler.receiveMessage(TimestampResponse.class);
clientHandler.sendMessage(new CommitRequest(tr1.timestamp));
CommitResponse cr1 = clientHandler.receiveMessage(CommitResponse.class);
assertTrue(cr1.committed);
assertTrue(cr1.commitTimestamp > tr1.timestamp);
assertEquals(tr1.timestamp, cr1.startTimestamp);
secondClientHandler.sendMessage(new TimestampRequest());
secondClientHandler.receiveBootstrap();
TimestampResponse tr2 = secondClientHandler.receiveMessage(TimestampResponse.class);
secondClientHandler.sendMessage(new CommitRequest(tr2.timestamp));
CommitResponse cr2 = secondClientHandler.receiveMessage(CommitResponse.class);
assertTrue(cr2.committed);
assertTrue(cr2.commitTimestamp > tr2.timestamp);
assertEquals(tr2.timestamp, cr2.startTimestamp);
clientHandler.sendMessage(new TimestampRequest());
// Txn 2 was a readonly transaction, so no committed info received
clientHandler.receiveMessage(TimestampResponse.class);
secondClientHandler.sendMessage(new TimestampRequest());
TimestampResponse tr3 = secondClientHandler.receiveMessage(TimestampResponse.class);
secondClientHandler.sendMessage(new CommitRequest(tr3.timestamp, new RowKey[] { r1 }));
CommitResponse cr3 = secondClientHandler.receiveMessage(CommitResponse.class);
assertTrue(cr3.committed);
assertTrue(cr3.commitTimestamp > tr3.timestamp);
assertEquals(tr3.timestamp, cr3.startTimestamp);
clientHandler.sendMessage(new TimestampRequest());