From 707394d4760b9a37be0c04f28faef917c4b9aefa Mon Sep 17 00:00:00 2001 From: Tor Brede Vekterli Date: Fri, 27 Apr 2018 16:15:08 +0200 Subject: Avoid candidate state racing with published state in tests Since the tests using `StateWaiter` expects to observe _both_ versioned and unversioned (candidate) states, we ignore candidate states iff they are equal to the versioned state we have already observed. Otherwise, tests waiting for a _versioned_ state risk never observing the version number itself (only a candidate following it) and hang until they time out. --- .../clustercontroller/core/testutils/StateWaiter.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'clustercontroller-core') diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/testutils/StateWaiter.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/testutils/StateWaiter.java index 7811e68c381..eb0ca6cff15 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/testutils/StateWaiter.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/testutils/StateWaiter.java @@ -37,6 +37,21 @@ public class StateWaiter implements SystemStateListener { public void handleNewCandidateState(ClusterStateBundle states) { // Treat candidate states as if they were published for the tests that use // this (deprecated) waiter class. + // + // Since the tests using StateWaiter expects to observe _both_ versioned and + // unversioned (candidate) states, we ignore candidate states iff they are + // equal to the versioned state we have already observed. Otherwise, tests + // waiting for a _versioned_ state risk never observing the version number + // itself (only a candidate following it) and hang until they time out. + synchronized (timer) { + if (current != null) { + ClusterState versionPatchedState = states.getBaselineClusterState().clone(); + versionPatchedState.setVersion(current.getVersion()); + if (versionPatchedState.equals(current)) { + return; + } + } + } handleNewPublishedState(states); } -- cgit v1.2.3