@Test
public void testSegmentedRaftLogStateMachineDataTimeoutIOException() throws Exception {
RaftServerConfigKeys.Log.StateMachineData.setSync(properties, true);
final TimeDuration syncTimeout = TimeDuration.valueOf(100, TimeUnit.MILLISECONDS);
RaftServerConfigKeys.Log.StateMachineData.setSyncTimeout(properties, syncTimeout);
final int numRetries = 2;
RaftServerConfigKeys.Log.StateMachineData.setSyncTimeoutRetry(properties, numRetries);
ExitUtils.disableSystemExit();
final LogEntryProto entry = prepareLogEntry(0, 0, null, true);
final StateMachine sm = new BaseStateMachine() {
@Override
public CompletableFuture<?> writeStateMachineData(LogEntryProto entry) {
return new CompletableFuture<>();
}
};
try (SegmentedRaftLog raftLog = new SegmentedRaftLog(peerId, null, sm, null, storage, -1, properties)) {
raftLog.open(RaftServerConstants.INVALID_LOG_INDEX, null);
raftLog.appendEntry(entry);
JavaUtils.attempt(() -> {
final ExitUtils.ExitException exitException = ExitUtils.getFirstExitException();
Objects.requireNonNull(exitException, "exitException == null");
Assert.assertEquals(TimeoutIOException.class, exitException.getCause().getClass());
}, 3*numRetries, syncTimeout, "RaftLogWorker should catch TimeoutIOException and exit", LOG);
ExitUtils.clear();
}
}