You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2018/03/19 06:27:18 UTC
[41/50] [abbrv] ignite git commit: IGNITE-7890 Fixed error handing on
corrupted storage during node startup
IGNITE-7890 Fixed error handing on corrupted storage during node startup
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/f623ef10
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/f623ef10
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/f623ef10
Branch: refs/heads/ignite-zk
Commit: f623ef10bb73a34ede5501eed78be362f3ba8c7d
Parents: 094f6c3
Author: Ilya Lantukh <il...@gridgain.com>
Authored: Fri Mar 16 14:25:13 2018 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Fri Mar 16 14:25:13 2018 +0300
----------------------------------------------------------------------
.../persistence/GridCacheOffheapManager.java | 9 ++
.../persistence/pagemem/PageMemoryImpl.java | 2 +-
.../IgnitePdsCorruptedStoreTest.java | 154 +++++++++++++++++++
.../ignite/testsuites/IgnitePdsTestSuite2.java | 3 +
4 files changed, 167 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/f623ef10/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java
index d3b73bd..313a763 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheOffheapManager.java
@@ -27,6 +27,7 @@ import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException;
+import org.apache.ignite.internal.NodeInvalidator;
import org.apache.ignite.internal.pagemem.FullPageId;
import org.apache.ignite.internal.pagemem.PageIdAllocator;
import org.apache.ignite.internal.pagemem.PageIdUtils;
@@ -1179,6 +1180,14 @@ public class GridCacheOffheapManager extends IgniteCacheOffheapManagerImpl imple
delegate = delegate0;
}
+ catch (Throwable ex) {
+ U.error(log, "Unhandled exception during page store initialization. All further operations will " +
+ "be failed and local node will be stopped.", ex);
+
+ NodeInvalidator.INSTANCE.invalidate(ctx.kernalContext(), ex);
+
+ throw ex;
+ }
finally {
latch.countDown();
http://git-wip-us.apache.org/repos/asf/ignite/blob/f623ef10/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java
index 9f979f5..5657099 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java
@@ -897,7 +897,7 @@ public class PageMemoryImpl implements PageMemoryEx {
ByteBuffer restored = curPage == null ? lastValidPage : curPage;
if (restored == null)
- throw new AssertionError(String.format(
+ throw new IllegalStateException(String.format(
"Page is broken. Can't restore it from WAL. (grpId = %d, pageId = %X).",
fullId.groupId(), fullId.pageId()
));
http://git-wip-us.apache.org/repos/asf/ignite/blob/f623ef10/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCorruptedStoreTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCorruptedStoreTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCorruptedStoreTest.java
new file mode 100644
index 0000000..f49ebf6
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCorruptedStoreTest.java
@@ -0,0 +1,154 @@
+/*
+ * 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.persistence;
+
+import java.io.File;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheRebalanceMode;
+import org.apache.ignite.cache.CacheWriteSynchronizationMode;
+import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.ConnectorConfiguration;
+import org.apache.ignite.configuration.DataRegionConfiguration;
+import org.apache.ignite.configuration.DataStorageConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.util.typedef.G;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+/**
+ *
+ */
+public class IgnitePdsCorruptedStoreTest extends GridCommonAbstractTest {
+ /** */
+ private static final String CACHE_NAME1 = "cache1";
+
+ /** */
+ private static final String CACHE_NAME2 = "cache2";
+
+ /** {@inheritDoc} */
+ @Override protected void beforeTest() throws Exception {
+ cleanPersistenceDir();
+
+ super.beforeTest();
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTest() throws Exception {
+ super.afterTest();
+
+ cleanPersistenceDir();
+ }
+
+ /** {@inheritDoc} */
+ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+ IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+ cfg.setConnectorConfiguration(new ConnectorConfiguration());
+
+ cfg.setConsistentId(igniteInstanceName);
+
+ DataStorageConfiguration memCfg = new DataStorageConfiguration()
+ .setDefaultDataRegionConfiguration(
+ new DataRegionConfiguration()
+ .setMaxSize(100 * 1024 * 1024)
+ .setPersistenceEnabled(true)
+ );
+
+ cfg.setDataStorageConfiguration(memCfg);
+
+ cfg.setCacheConfiguration(cacheConfiguration(CACHE_NAME1), cacheConfiguration(CACHE_NAME2));
+
+ return cfg;
+ }
+
+ /**
+ * @return File or folder in work directory.
+ * @throws IgniteCheckedException If failed to resolve file name.
+ */
+ private File file(String file) throws IgniteCheckedException {
+ return U.resolveWorkDirectory(U.defaultWorkDirectory(), file, false);
+ }
+
+ /**
+ * Create cache configuration.
+ *
+ * @param name Cache name.
+ */
+ private CacheConfiguration cacheConfiguration(String name) {
+ CacheConfiguration ccfg = new CacheConfiguration();
+ ccfg.setName(name);
+ ccfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
+ ccfg.setRebalanceMode(CacheRebalanceMode.SYNC);
+ ccfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
+ ccfg.setAffinity(new RendezvousAffinityFunction(false, 32));
+ ccfg.setBackups(2);
+
+ return ccfg;
+ }
+
+ /**
+ * @throws Exception If test failed.
+ */
+ public void testNodeInvalidatedWhenPersistenceIsCorrupted() throws Exception {
+ Ignite ignite = startGrid(0);
+
+ startGrid(1);
+
+ ignite.cluster().active(true);
+
+ awaitPartitionMapExchange();
+
+ IgniteCache<Integer, String> cache1 = ignite.cache(CACHE_NAME1);
+
+ for (int i = 0; i < 100; ++i)
+ cache1.put(i, String.valueOf(i));
+
+ forceCheckpoint();
+
+ cache1.put(2, "test");
+
+ String nodeName = ignite.name().replaceAll("\\.", "_");
+
+ stopAllGrids();
+
+ U.delete(file(String.format("db/%s/cache-%s/part-2.bin", nodeName, CACHE_NAME1)));
+
+ ignite = startGrid(1);
+
+ try {
+ startGrid(0);
+ }
+ catch (IgniteCheckedException ex) {
+ // expected
+
+ throw ex;
+ }
+
+ IgniteCache<Integer, Integer> cache2 = ignite.cache(CACHE_NAME2);
+
+ // check that partition map exchange had been finished
+ cache2.put(1, 1);
+
+ assertEquals(1, ignite.cluster().nodes().size());
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f623ef10/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java
index 5aca92f..f955b11 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java
@@ -22,6 +22,7 @@ import org.apache.ignite.internal.processors.cache.persistence.IgniteDataStorage
import org.apache.ignite.internal.processors.cache.persistence.IgnitePdsContinuousRestartTest;
import org.apache.ignite.internal.processors.cache.persistence.IgnitePdsContinuousRestartTest2;
import org.apache.ignite.internal.processors.cache.persistence.IgnitePdsContinuousRestartTestWithSharedGroupAndIndexes;
+import org.apache.ignite.internal.processors.cache.persistence.IgnitePdsCorruptedStoreTest;
import org.apache.ignite.internal.processors.cache.persistence.IgnitePdsExchangeDuringCheckpointTest;
import org.apache.ignite.internal.processors.cache.persistence.IgnitePdsPageSizesTest;
import org.apache.ignite.internal.processors.cache.persistence.IgnitePdsRecoveryAfterFileCorruptionTest;
@@ -132,5 +133,7 @@ public class IgnitePdsTestSuite2 extends TestSuite {
suite.addTestSuite(WalCompactionTest.class);
suite.addTestSuite(IgniteCheckpointDirtyPagesForLowLoadTest.class);
+
+ suite.addTestSuite(IgnitePdsCorruptedStoreTest.class);
}
}