@SuppressWarnings({ "unused", "SameParameterValue" })
    private boolean assertReadIndex(final Node node, final int index) throws InterruptedException {
        final CountDownLatch latch = new CountDownLatch(1);
        final byte[] requestContext = TestUtils.getRandomBytes();
        final AtomicBoolean success = new AtomicBoolean(false);
        node.readIndex(requestContext, new ReadIndexClosure() {

            @Override
            public void run(final Status status, final long theIndex, final byte[] reqCtx) {
                try {
                    if (status.isOk()) {
                        assertEquals(index, theIndex);
                        assertArrayEquals(requestContext, reqCtx);
                        success.set(true);
                    } else {
                        assertTrue(status.getErrorMsg(),
                            status.getErrorMsg().contains("RPC exception:Check connection["));
                        assertTrue(status.getErrorMsg(),
                            status.getErrorMsg().contains("] fail and try to create new one"));
                    }
                } finally {
                    latch.countDown();
                }
            }
        });
        latch.await();
        return success.get();
    }
Test rollback stateMachine with readIndex for issue 317:
https://github.com/sofastack/sofa-jraft/issues/317
jraft-extension/java-log-storage-impl/src/test/java/com/alipay/sofa/jraft/core/NodeTest.java