#IGNITE Added message on init stop.
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
index 48f24ac..9f7c983 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
@@ -124,10 +124,18 @@
/** {@inheritDoc} */
@Override protected String className(int id) throws IgniteCheckedException {
- if (cache == null)
+ GridCacheAdapter<Integer, String> cache0 = cache;
+
+ if (cache0 == null) {
U.awaitQuiet(latch);
- String clsName = cache.get(id);
+ cache0 = cache;
+
+ if (cache0 == null)
+ throw new IllegalStateException("Failed to initialize marshaller context (grid is stopping).");
+ }
+
+ String clsName = cache0.get(id);
if (clsName == null) {
File file = new File(workDir, id + ".classname");
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheDaemonNodeStopSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheDaemonNodeStopSelfTest.java
new file mode 100644
index 0000000..c56ad1c
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheDaemonNodeStopSelfTest.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.configuration.*;
+import org.apache.ignite.internal.*;
+import org.apache.ignite.spi.discovery.tcp.*;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.*;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*;
+import org.apache.ignite.testframework.*;
+import org.apache.ignite.testframework.junits.common.*;
+
+import java.util.concurrent.*;
+
+import static org.apache.ignite.cache.CacheAtomicityMode.*;
+import static org.apache.ignite.cache.CacheMode.*;
+
+/**
+ * Test cache operations with daemon node.
+ */
+public class GridCacheDaemonNodeStopSelfTest extends GridCommonAbstractTest {
+ /** */
+ private static TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
+
+ /** Daemon flag. */
+ protected boolean daemon;
+
+ /** {@inheritDoc} */
+ @Override protected void beforeTest() throws Exception {
+ super.beforeTest();
+
+ daemon = false;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
+ IgniteConfiguration c = super.getConfiguration(gridName);
+
+ c.setDaemon(daemon);
+
+ TcpDiscoverySpi disco = new TcpDiscoverySpi();
+
+ disco.setIpFinder(ipFinder);
+
+ c.setDiscoverySpi(disco);
+
+ c.setConnectorConfiguration(null);
+
+ CacheConfiguration cc = defaultCacheConfiguration();
+
+ cc.setCacheMode(LOCAL);
+ cc.setAtomicityMode(ATOMIC);
+
+ TransactionConfiguration cfg = new TransactionConfiguration();
+
+ c.setTransactionConfiguration(cfg);
+
+ c.setCacheConfiguration(cc);
+
+ return c;
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testStartStop() throws Exception {
+ try {
+ daemon = true;
+
+ final IgniteEx daemonNode = startGrid(0);
+
+ final IgniteInternalFuture<Object> f = GridTestUtils.runAsync(new Callable<Object>() {
+ @Override public Object call() throws Exception {
+ daemonNode.context().marshallerContext().getClass(1,
+ GridCacheDaemonNodeStopSelfTest.class.getClassLoader());
+
+ return null;
+ }
+ });
+
+ GridTestUtils.assertThrowsWithCause(new Callable<Object>() {
+ @Override public Object call() throws Exception {
+ f.get(300);
+
+ return null;
+ }
+ }, IgniteFutureTimeoutCheckedException.class);
+
+ // Stop grid.
+ stopGrid(0);
+
+ GridTestUtils.assertThrowsWithCause(new Callable<Object>() {
+ @Override public Object call() throws Exception {
+ f.get(5, TimeUnit.SECONDS);
+
+ return null;
+ }
+ }, IllegalStateException.class);
+ }
+ finally {
+ stopAllGrids();
+ }
+ }
+}
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite3.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite3.java
index 5947d33..b83f50f 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite3.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite3.java
@@ -100,6 +100,7 @@
suite.addTestSuite(GridCacheDaemonNodeLocalSelfTest.class);
suite.addTestSuite(GridCacheDaemonNodePartitionedSelfTest.class);
suite.addTestSuite(GridCacheDaemonNodeReplicatedSelfTest.class);
+ suite.addTestSuite(GridCacheDaemonNodeStopSelfTest.class);
// Write-behind.
suite.addTest(IgniteCacheWriteBehindTestSuite.suite());