Fix race in global checkpoint listeners test
This race can occur if the latch from the listener notifies the test thread and the test thread races ahead before the scheduler thread has a chance to emit the log message. This commit fixes this test by not counting down the latch until after the log message we are going to assert on has been emitted.
This commit is contained in:
parent
6dfe54c838
commit
d806a0e59d
|
@ -49,10 +49,13 @@ import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
|
||||||
import static org.elasticsearch.index.seqno.SequenceNumbers.NO_OPS_PERFORMED;
|
import static org.elasticsearch.index.seqno.SequenceNumbers.NO_OPS_PERFORMED;
|
||||||
import static org.elasticsearch.index.seqno.SequenceNumbers.UNASSIGNED_SEQ_NO;
|
import static org.elasticsearch.index.seqno.SequenceNumbers.UNASSIGNED_SEQ_NO;
|
||||||
|
import static org.hamcrest.Matchers.any;
|
||||||
import static org.hamcrest.Matchers.containsString;
|
import static org.hamcrest.Matchers.containsString;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.hasToString;
|
import static org.hamcrest.Matchers.hasToString;
|
||||||
import static org.hamcrest.Matchers.instanceOf;
|
import static org.hamcrest.Matchers.instanceOf;
|
||||||
|
import static org.mockito.Matchers.argThat;
|
||||||
|
import static org.mockito.Mockito.doAnswer;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.reset;
|
import static org.mockito.Mockito.reset;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
|
@ -561,19 +564,19 @@ public class GlobalCheckpointListenersTests extends ESTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testFailingListenerAfterTimeout() throws InterruptedException {
|
public void testFailingListenerAfterTimeout() throws InterruptedException {
|
||||||
|
final CountDownLatch latch = new CountDownLatch(1);
|
||||||
final Logger mockLogger = mock(Logger.class);
|
final Logger mockLogger = mock(Logger.class);
|
||||||
|
doAnswer(invocationOnMock -> {
|
||||||
|
latch.countDown();
|
||||||
|
return null;
|
||||||
|
}).when(mockLogger).warn(argThat(any(String.class)), argThat(any(RuntimeException.class)));
|
||||||
final GlobalCheckpointListeners globalCheckpointListeners =
|
final GlobalCheckpointListeners globalCheckpointListeners =
|
||||||
new GlobalCheckpointListeners(shardId, Runnable::run, scheduler, mockLogger);
|
new GlobalCheckpointListeners(shardId, Runnable::run, scheduler, mockLogger);
|
||||||
final CountDownLatch latch = new CountDownLatch(1);
|
|
||||||
final TimeValue timeout = TimeValue.timeValueMillis(randomIntBetween(1, 50));
|
final TimeValue timeout = TimeValue.timeValueMillis(randomIntBetween(1, 50));
|
||||||
globalCheckpointListeners.add(
|
globalCheckpointListeners.add(
|
||||||
NO_OPS_PERFORMED,
|
NO_OPS_PERFORMED,
|
||||||
(g, e) -> {
|
(g, e) -> {
|
||||||
try {
|
|
||||||
throw new RuntimeException("failure");
|
throw new RuntimeException("failure");
|
||||||
} finally {
|
|
||||||
latch.countDown();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
timeout);
|
timeout);
|
||||||
latch.await();
|
latch.await();
|
||||||
|
|
Loading…
Reference in New Issue