review IGNITE-2708 Need to validate that SPIs are started only once (cherry picked from commit cd063da)
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/7ea83d63 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/7ea83d63 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/7ea83d63 Branch: refs/heads/ignite-3038 Commit: 7ea83d63a1ada25f4a0b9adcaaa7ab7d3282a4e3 Parents: 8b16e1c Author: Yakov Zhdanov <[email protected]> Authored: Fri May 13 11:48:00 2016 +0300 Committer: Denis Magda <[email protected]> Committed: Tue May 31 09:29:11 2016 +0300 ---------------------------------------------------------------------- .../internal/managers/GridManagerAdapter.java | 5 +++- .../org/apache/ignite/spi/IgniteSpiAdapter.java | 28 ++++++++++++++++++-- .../ignite/internal/GridFactorySelfTest.java | 27 ++++++++++++++++++- 3 files changed, 56 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/7ea83d63/modules/core/src/main/java/org/apache/ignite/internal/managers/GridManagerAdapter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/GridManagerAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/GridManagerAdapter.java index 21a80c3..58d64f6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/GridManagerAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/GridManagerAdapter.java @@ -209,6 +209,9 @@ public abstract class GridManagerAdapter<T extends IgniteSpi> implements GridMan Collection<String> names = U.newHashSet(spis.length); for (T spi : spis) { + if (spi instanceof IgniteSpiAdapter) + ((IgniteSpiAdapter)spi).onBeforeStart(); + // Inject all spi resources. ctx.resource().inject(spi); @@ -629,4 +632,4 @@ public abstract class GridManagerAdapter<T extends IgniteSpi> implements GridMan @Override public final String toString() { return S.toString(GridManagerAdapter.class, this, "name", getClass().getName()); } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/ignite/blob/7ea83d63/modules/core/src/main/java/org/apache/ignite/spi/IgniteSpiAdapter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/spi/IgniteSpiAdapter.java b/modules/core/src/main/java/org/apache/ignite/spi/IgniteSpiAdapter.java index 1cb202c..7cb2e13 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/IgniteSpiAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/IgniteSpiAdapter.java @@ -25,6 +25,7 @@ import java.util.Date; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.concurrent.atomic.AtomicBoolean; import javax.management.JMException; import javax.management.MBeanServer; import javax.management.ObjectName; @@ -95,11 +96,14 @@ public abstract class IgniteSpiAdapter implements IgniteSpi, IgniteSpiManagement private boolean failureDetectionTimeoutEnabled = true; /** - * Failure detection timeout. Initialized with the value of - * {@link IgniteConfiguration#getFailureDetectionTimeout()}. + * Failure detection timeout. Initialized with the value of + * {@link IgniteConfiguration#getFailureDetectionTimeout()}. */ private long failureDetectionTimeout; + /** Start flag to deny repeating start attempts. */ + private final AtomicBoolean startedFlag = new AtomicBoolean(); + /** * Creates new adapter and initializes it from the current (this) class. * SPI name will be initialized to the simple name of the class @@ -116,6 +120,26 @@ public abstract class IgniteSpiAdapter implements IgniteSpi, IgniteSpiManagement startTstamp = U.currentTimeMillis(); } + /** + * This method is called by built-in managers implementation to avoid + * repeating SPI start attempts. + */ + public final void onBeforeStart() { + if (!startedFlag.compareAndSet(false, true)) + throw new IllegalStateException("SPI has already been started " + + "(always create new configuration instance for each starting Ignite instances) " + + "[spi=" + this + ']'); + } + + /** + * Checks if {@link #onBeforeStart()} has been called on this SPI instance. + * + * @return {@code True} if {@link #onBeforeStart()} has already been called. + */ + public final boolean started() { + return startedFlag.get(); + } + /** {@inheritDoc} */ @Override public final String getStartTimestampFormatted() { return DateFormat.getDateTimeInstance().format(new Date(startTstamp)); http://git-wip-us.apache.org/repos/asf/ignite/blob/7ea83d63/modules/spring/src/test/java/org/apache/ignite/internal/GridFactorySelfTest.java ---------------------------------------------------------------------- diff --git a/modules/spring/src/test/java/org/apache/ignite/internal/GridFactorySelfTest.java b/modules/spring/src/test/java/org/apache/ignite/internal/GridFactorySelfTest.java index cca3e8b..b94ed48 100644 --- a/modules/spring/src/test/java/org/apache/ignite/internal/GridFactorySelfTest.java +++ b/modules/spring/src/test/java/org/apache/ignite/internal/GridFactorySelfTest.java @@ -902,6 +902,31 @@ public class GridFactorySelfTest extends GridCommonAbstractTest { } /** + * @throws Exception If failed. + */ + public void testRepeatingStart() throws Exception { + try { + IgniteConfiguration c = getConfiguration("1"); + + startGrid("1", c); + + assert ((TcpDiscoverySpi)c.getDiscoverySpi()).started(); + + try { + startGrid("2", c); + + fail("Should not be able to start grid using same configuration instance."); + } + catch (Exception e) { + info("Caught expected exception: " + e); + } + } + finally { + stopAllGrids(); + } + } + + /** * Test task. */ private static class TestTask extends ComputeTaskSplitAdapter<Void, Void> { @@ -930,4 +955,4 @@ public class GridFactorySelfTest extends GridCommonAbstractTest { return null; } } -} \ No newline at end of file +}
