IGNITE-4876 - Tests should wait for topology change on all nodes
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/4e80ddfe Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/4e80ddfe Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/4e80ddfe Branch: refs/heads/ignite-1192 Commit: 4e80ddfe25d21f316de287bf5dade4ef0a0d17cc Parents: 77740bf Author: Konstantin Dudkov <kdud...@ya.ru> Authored: Fri Apr 7 17:17:04 2017 +0300 Committer: Alexey Goncharuk <alexey.goncha...@gmail.com> Committed: Fri Apr 7 17:17:04 2017 +0300 ---------------------------------------------------------------------- .../testframework/junits/GridAbstractTest.java | 53 +++++++++++++++++++- 1 file changed, 51 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/4e80ddfe/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java index ddcf91f..1bb4540 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java @@ -57,16 +57,20 @@ import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.NearCacheConfiguration; import org.apache.ignite.events.EventType; +import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.IgniteInterruptedCheckedException; import org.apache.ignite.internal.IgniteKernal; import org.apache.ignite.internal.IgnitionEx; import org.apache.ignite.internal.binary.BinaryEnumCache; import org.apache.ignite.internal.binary.BinaryMarshaller; +import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.resource.GridSpringResourceContext; import org.apache.ignite.internal.util.GridClassLoaderCache; import org.apache.ignite.internal.util.GridTestClockTimer; import org.apache.ignite.internal.util.GridUnsafe; +import org.apache.ignite.internal.util.lang.GridAbsPredicate; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.G; import org.apache.ignite.internal.util.typedef.internal.LT; @@ -138,6 +142,9 @@ public abstract class GridAbstractTest extends TestCase { private static final long DFLT_TEST_TIMEOUT = 5 * 60 * 1000; /** */ + private static final int DFLT_TOP_WAIT_TIMEOUT = 2000; + + /** */ private static final transient Map<Class<?>, TestCounters> tests = new ConcurrentHashMap<>(); /** */ @@ -953,6 +960,16 @@ public abstract class GridAbstractTest extends TestCase { */ @SuppressWarnings({"deprecation"}) protected void stopGrid(@Nullable String igniteInstanceName, boolean cancel) { + stopGrid(igniteInstanceName, cancel, true); + } + + /** + * @param igniteInstanceName Ignite instance name. + * @param cancel Cancel flag. + * @param awaitTop Await topology change flag. + */ + @SuppressWarnings({"deprecation"}) + protected void stopGrid(@Nullable String igniteInstanceName, boolean cancel, boolean awaitTop) { try { Ignite ignite = grid(igniteInstanceName); @@ -965,6 +982,9 @@ public abstract class GridAbstractTest extends TestCase { G.stop(igniteInstanceName, cancel); else IgniteProcessProxy.stop(igniteInstanceName, cancel); + + if (awaitTop) + awaitTopologyChange(); } catch (IllegalStateException ignored) { // Ignore error if grid already stopped. @@ -999,10 +1019,10 @@ public abstract class GridAbstractTest extends TestCase { } for (Ignite g : clients) - stopGrid(g.name(), cancel); + stopGrid(g.name(), cancel, false); for (Ignite g : srvs) - stopGrid(g.name(), cancel); + stopGrid(g.name(), cancel, false); assert G.allGrids().isEmpty(); } @@ -1996,6 +2016,35 @@ public abstract class GridAbstractTest extends TestCase { /** * + * @throws IgniteInterruptedCheckedException + */ + public void awaitTopologyChange() throws IgniteInterruptedCheckedException { + for (Ignite g : G.allGrids()) { + final GridKernalContext ctx = ((IgniteKernal)g).context(); + + if (ctx.isStopping()) + continue; + + AffinityTopologyVersion topVer = ctx.discovery().topologyVersionEx(); + AffinityTopologyVersion exchVer = ctx.cache().context().exchange().readyAffinityVersion(); + + if (! topVer.equals(exchVer)) { + info("topology version mismatch: node " + g.name() + " " + exchVer + ", " + topVer); + + GridTestUtils.waitForCondition(new GridAbsPredicate() { + @Override public boolean apply() { + AffinityTopologyVersion topVer = ctx.discovery().topologyVersionEx(); + AffinityTopologyVersion exchVer = ctx.cache().context().exchange().readyAffinityVersion(); + + return exchVer.equals(topVer); + } + }, DFLT_TOP_WAIT_TIMEOUT); + } + } + } + + /** + * */ private static interface WriteReplaceOwner { /**