Skip to content

Commit 08dba09

Browse files
committed
Fix ZenDiscoveryUnitTests to use listener properly
A consequence of elastic#63 is that a FailedToCommitClusterStateException is no longer thrown by ZenDiscovery#publish(), it is just passed to the listener, so tests that relied on catching it can no longer work.
1 parent f9033e1 commit 08dba09

File tree

1 file changed

+47
-31
lines changed

1 file changed

+47
-31
lines changed

server/src/test/java/org/elasticsearch/discovery/zen/ZenDiscoveryUnitTests.java

Lines changed: 47 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@
1919

2020
package org.elasticsearch.discovery.zen;
2121

22-
import org.elasticsearch.action.ActionListener;
23-
import org.elasticsearch.core.internal.io.IOUtils;
2422
import org.elasticsearch.Version;
23+
import org.elasticsearch.action.ActionListener;
2524
import org.elasticsearch.action.support.replication.ClusterStateCreationUtils;
2625
import org.elasticsearch.cluster.ClusterChangedEvent;
2726
import org.elasticsearch.cluster.ClusterModule;
@@ -44,6 +43,7 @@
4443
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
4544
import org.elasticsearch.common.settings.ClusterSettings;
4645
import org.elasticsearch.common.settings.Settings;
46+
import org.elasticsearch.core.internal.io.IOUtils;
4747
import org.elasticsearch.discovery.Discovery;
4848
import org.elasticsearch.discovery.zen.PublishClusterStateActionTests.AssertingAckListener;
4949
import org.elasticsearch.index.shard.ShardId;
@@ -85,12 +85,12 @@
8585
import static org.elasticsearch.cluster.service.MasterServiceTests.discoveryState;
8686
import static org.elasticsearch.discovery.zen.ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING;
8787
import static org.elasticsearch.discovery.zen.ZenDiscovery.shouldIgnoreOrRejectNewClusterState;
88-
import static org.elasticsearch.test.ClusterServiceUtils.setState;
89-
import static org.hamcrest.Matchers.arrayWithSize;
9088
import static org.hamcrest.Matchers.containsString;
9189
import static org.hamcrest.Matchers.emptyArray;
9290
import static org.hamcrest.Matchers.equalTo;
9391
import static org.hamcrest.Matchers.hasToString;
92+
import static org.hamcrest.Matchers.is;
93+
import static org.hamcrest.Matchers.notNullValue;
9494

9595
public class ZenDiscoveryUnitTests extends ESTestCase {
9696

@@ -228,16 +228,19 @@ public void testNodesUpdatedAfterClusterStatePublished() throws Exception {
228228
DiscoveryNodes.builder(state.nodes()).add(otherNode).masterNodeId(masterNode.getId())
229229
).build();
230230

231-
try {
232-
// publishing a new cluster state
233-
ClusterChangedEvent clusterChangedEvent = new ClusterChangedEvent("testing", newState, state);
234-
AssertingAckListener listener = new AssertingAckListener(newState.nodes().getSize() - 1);
235-
expectedFDNodes = masterZen.getFaultDetectionNodes();
236-
masterZen.publish(clusterChangedEvent, getNoopPublishListener(), listener);
231+
// publishing a new cluster state
232+
ClusterChangedEvent clusterChangedEvent = new ClusterChangedEvent("testing", newState, state);
233+
AssertingAckListener listener = new AssertingAckListener(newState.nodes().getSize() - 1);
234+
expectedFDNodes = masterZen.getFaultDetectionNodes();
235+
AwaitingPublishListener awaitingPublishListener = new AwaitingPublishListener();
236+
masterZen.publish(clusterChangedEvent, awaitingPublishListener, listener);
237+
awaitingPublishListener.await();
238+
if (awaitingPublishListener.getException() == null) {
239+
// publication succeeded, wait for acks
237240
listener.await(10, TimeUnit.SECONDS);
238241
// publish was a success, update expected FD nodes based on new cluster state
239242
expectedFDNodes = fdNodesForState(newState, masterNode);
240-
} catch (Discovery.FailedToCommitClusterStateException e) {
243+
} else {
241244
// not successful, so expectedFDNodes above should remain what it was originally assigned
242245
assertEquals(3, minMasterNodes); // ensure min master nodes is the higher value, otherwise we shouldn't fail
243246
}
@@ -281,35 +284,48 @@ public void testPendingCSQueueIsClearedWhenClusterStatePublished() throws Except
281284
DiscoveryNodes.builder(discoveryState(masterMasterService).nodes()).masterNodeId(masterNode.getId())
282285
).build();
283286

284-
285-
try {
286-
// publishing a new cluster state
287-
ClusterChangedEvent clusterChangedEvent = new ClusterChangedEvent("testing", newState, state);
288-
AssertingAckListener listener = new AssertingAckListener(newState.nodes().getSize() - 1);
289-
masterZen.publish(clusterChangedEvent, getNoopPublishListener(), listener);
287+
// publishing a new cluster state
288+
ClusterChangedEvent clusterChangedEvent = new ClusterChangedEvent("testing", newState, state);
289+
AssertingAckListener listener = new AssertingAckListener(newState.nodes().getSize() - 1);
290+
AwaitingPublishListener awaitingPublishListener = new AwaitingPublishListener();
291+
masterZen.publish(clusterChangedEvent, awaitingPublishListener, listener);
292+
awaitingPublishListener.await();
293+
if (awaitingPublishListener.getException() == null) {
294+
// publication succeeded, wait for acks
290295
listener.await(1, TimeUnit.HOURS);
291-
// publish was a success, check that queue as cleared
292-
assertThat(masterZen.pendingClusterStates(), emptyArray());
293-
} catch (Discovery.FailedToCommitClusterStateException e) {
294-
// not successful, so the pending queue should be cleaned
295-
assertThat(Arrays.toString(masterZen.pendingClusterStates()), masterZen.pendingClusterStates(), arrayWithSize(0));
296296
}
297+
// queue should be cleared whether successful or not
298+
assertThat(Arrays.toString(masterZen.pendingClusterStates()), masterZen.pendingClusterStates(), emptyArray());
297299
} finally {
298300
IOUtils.close(toClose);
299301
terminate(threadPool);
300302
}
301303
}
302304

303-
private ActionListener<Void> getNoopPublishListener() {
304-
return new ActionListener<Void>() {
305-
@Override
306-
public void onResponse(Void aVoid) {
307-
}
305+
private class AwaitingPublishListener implements ActionListener<Void> {
306+
private final CountDownLatch countDownLatch = new CountDownLatch(1);
307+
private Discovery.FailedToCommitClusterStateException exception;
308308

309-
@Override
310-
public void onFailure(Exception e) {
311-
}
312-
};
309+
@Override
310+
public void onResponse(Void aVoid) {
311+
assertThat(countDownLatch.getCount(), is(1L));
312+
countDownLatch.countDown();
313+
}
314+
315+
@Override
316+
public void onFailure(Exception e) {
317+
assertThat(e, notNullValue());
318+
exception = (Discovery.FailedToCommitClusterStateException) e; // fail on other exception types
319+
onResponse(null);
320+
}
321+
322+
public void await() throws InterruptedException {
323+
countDownLatch.await();
324+
}
325+
326+
public Discovery.FailedToCommitClusterStateException getException() {
327+
return exception;
328+
}
313329
}
314330

315331
private ZenDiscovery buildZenDiscovery(Settings settings, TransportService service, MasterService masterService,

0 commit comments

Comments
 (0)