Repository: ignite Updated Branches: refs/heads/master d3566c145 -> cc370d6cf
IGNITE-8219 Call failure handler when an infinite loop is detected in B+ tree. Fixes #3849. Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/cc370d6c Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/cc370d6c Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/cc370d6c Branch: refs/heads/master Commit: cc370d6cfef4a9d82761cc70fcb3bbeb0f91ab94 Parents: d3566c1 Author: Alexey Stelmak <[email protected]> Authored: Thu Aug 9 16:37:04 2018 +0300 Committer: Alexey Goncharuk <[email protected]> Committed: Thu Aug 9 16:37:04 2018 +0300 ---------------------------------------------------------------------- .../benchmarks/jmh/tree/BPlusTreeBenchmark.java | 2 +- .../persistence/GridCacheOffheapManager.java | 3 +- .../cache/persistence/IndexStorageImpl.java | 13 ++++--- .../persistence/metastorage/MetaStorage.java | 7 +++- .../metastorage/MetastorageTree.java | 36 ++++++++++++-------- .../cache/persistence/tree/BPlusTree.java | 33 ++++++++++++++---- .../cache/persistence/tree/io/BPlusMetaIO.java | 2 +- .../persistence/tree/util/PageHandler.java | 10 +++--- .../processors/cache/tree/CacheDataTree.java | 3 +- .../cache/tree/PendingEntriesTree.java | 8 ++--- .../processors/database/BPlusTreeSelfTest.java | 2 +- .../database/IndexStorageSelfTest.java | 3 +- .../processors/query/h2/database/H2Tree.java | 7 ++-- .../query/h2/database/H2TreeIndex.java | 3 +- .../index/DynamicIndexAbstractSelfTest.java | 3 ++ 15 files changed, 92 insertions(+), 43 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/cc370d6c/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java ---------------------------------------------------------------------- diff --git a/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java index cef00ee..7ed84cb 100644 --- a/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java +++ b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java @@ -176,7 +176,7 @@ public class BPlusTreeBenchmark extends JmhAbstractBenchmark { TestTree(ReuseList reuseList, int cacheId, PageMemory pageMem, long metaPageId) throws IgniteCheckedException { super("test", cacheId, pageMem, null, new AtomicLong(), metaPageId, reuseList, - new IOVersions<>(new LongInnerIO()), new IOVersions<>(new LongLeafIO())); + new IOVersions<>(new LongInnerIO()), new IOVersions<>(new LongLeafIO()), null); PageIO.registerTest(latestInnerIO(), latestLeafIO()); http://git-wip-us.apache.org/repos/asf/ignite/blob/cc370d6c/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 ea775dc..62aadb2 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 @@ -132,7 +132,8 @@ public class GridCacheOffheapManager extends IgniteCacheOffheapManagerImpl imple PageIdAllocator.FLAG_IDX, reuseList, metastoreRoot.pageId().pageId(), - metastoreRoot.isAllocated()); + metastoreRoot.isAllocated(), + ctx.kernalContext().failure()); ((GridCacheDatabaseSharedManager)ctx.database()).addCheckpointListener(this); } http://git-wip-us.apache.org/repos/asf/ignite/blob/cc370d6c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IndexStorageImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IndexStorageImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IndexStorageImpl.java index 7daef3c..a4266fa 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IndexStorageImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IndexStorageImpl.java @@ -32,7 +32,9 @@ import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusLeaf import org.apache.ignite.internal.processors.cache.persistence.tree.io.IOVersions; import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseList; import org.apache.ignite.internal.processors.cache.persistence.tree.util.PageHandler; +import org.apache.ignite.internal.processors.failure.FailureProcessor; import org.apache.ignite.internal.util.typedef.internal.U; +import org.jetbrains.annotations.Nullable; /** * Metadata storage. @@ -78,7 +80,8 @@ public class IndexStorageImpl implements IndexStorage { final byte allocSpace, final ReuseList reuseList, final long rootPageId, - final boolean initNew + final boolean initNew, + final FailureProcessor failureProcessor ) { try { this.pageMem = pageMem; @@ -88,7 +91,7 @@ public class IndexStorageImpl implements IndexStorage { this.reuseList = reuseList; metaTree = new MetaTree(grpId, allocPartId, allocSpace, pageMem, wal, globalRmvId, rootPageId, - reuseList, MetaStoreInnerIO.VERSIONS, MetaStoreLeafIO.VERSIONS, initNew); + reuseList, MetaStoreInnerIO.VERSIONS, MetaStoreLeafIO.VERSIONS, initNew, failureProcessor); } catch (IgniteCheckedException e) { throw new IgniteException(e); @@ -164,6 +167,7 @@ public class IndexStorageImpl implements IndexStorage { * @param reuseList Reuse list. * @param innerIos Inner IOs. * @param leafIos Leaf IOs. + * @param failureProcessor if the tree is corrupted. * @throws IgniteCheckedException If failed. */ private MetaTree( @@ -177,9 +181,10 @@ public class IndexStorageImpl implements IndexStorage { final ReuseList reuseList, final IOVersions<? extends BPlusInnerIO<IndexItem>> innerIos, final IOVersions<? extends BPlusLeafIO<IndexItem>> leafIos, - final boolean initNew + final boolean initNew, + @Nullable FailureProcessor failureProcessor ) throws IgniteCheckedException { - super(treeName("meta", "Meta"), cacheId, pageMem, wal, globalRmvId, metaPageId, reuseList, innerIos, leafIos); + super(treeName("meta", "Meta"), cacheId, pageMem, wal, globalRmvId, metaPageId, reuseList, innerIos, leafIos, failureProcessor); this.allocPartId = allocPartId; this.allocSpace = allocSpace; http://git-wip-us.apache.org/repos/asf/ignite/blob/cc370d6c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetaStorage.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetaStorage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetaStorage.java index 14bd450..4a2549b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetaStorage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetaStorage.java @@ -51,6 +51,7 @@ import org.apache.ignite.internal.processors.cache.persistence.tree.io.PageParti import org.apache.ignite.internal.processors.cache.persistence.tree.io.SimpleDataPageIO; import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseList; import org.apache.ignite.internal.processors.cache.persistence.tree.util.PageHandler; +import org.apache.ignite.internal.processors.failure.FailureProcessor; import org.apache.ignite.internal.util.lang.GridCursor; import org.apache.ignite.internal.util.typedef.internal.CU; import org.apache.ignite.internal.util.typedef.internal.U; @@ -115,6 +116,9 @@ public class MetaStorage implements DbCheckpointListener, ReadOnlyMetastorage, R private final Marshaller marshaller = new JdkMarshaller(); /** */ + private final FailureProcessor failureProcessor; + + /** */ public MetaStorage( GridCacheSharedContext cctx, DataRegion dataRegion, @@ -126,6 +130,7 @@ public class MetaStorage implements DbCheckpointListener, ReadOnlyMetastorage, R this.regionMetrics = regionMetrics; this.readOnly = readOnly; log = cctx.logger(getClass()); + this.failureProcessor = cctx.kernalContext().failure(); } /** */ @@ -145,7 +150,7 @@ public class MetaStorage implements DbCheckpointListener, ReadOnlyMetastorage, R MetastorageRowStore rowStore = new MetastorageRowStore(freeList, db); tree = new MetastorageTree(METASTORAGE_CACHE_ID, dataRegion.pageMemory(), wal, rmvId, - freeList, rowStore, treeRoot.pageId().pageId(), treeRoot.isAllocated()); + freeList, rowStore, treeRoot.pageId().pageId(), treeRoot.isAllocated(), failureProcessor); if (!readOnly) ((GridCacheDatabaseSharedManager)db).addCheckpointListener(this); http://git-wip-us.apache.org/repos/asf/ignite/blob/cc370d6c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetastorageTree.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetastorageTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetastorageTree.java index 445522b..19a145f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetastorageTree.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/metastorage/MetastorageTree.java @@ -28,6 +28,8 @@ import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusInne import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusLeafIO; import org.apache.ignite.internal.processors.cache.persistence.tree.io.IOVersions; import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseList; +import org.apache.ignite.internal.processors.failure.FailureProcessor; +import org.jetbrains.annotations.Nullable; /** * @@ -40,12 +42,15 @@ public class MetastorageTree extends BPlusTree<MetastorageSearchRow, Metastorage private MetastorageRowStore rowStore; /** - * @param pageMem - * @param wal - * @param globalRmvId - * @param metaPageId - * @param reuseList - * @throws IgniteCheckedException + * @param pageMem Page memory instance. + * @param wal WAL manager. + * @param globalRmvId Global remove ID. + * @param metaPageId Meta page ID. + * @param reuseList Reuse list. + * @param rowStore Row store. + * @param initNew Init new flag, if {@code true}, then new tree will be allocated. + * @param failureProcessor To call if the tree is corrupted. + * @throws IgniteCheckedException If failed to initialize. */ public MetastorageTree(int cacheId, PageMemory pageMem, @@ -54,9 +59,10 @@ public class MetastorageTree extends BPlusTree<MetastorageSearchRow, Metastorage ReuseList reuseList, MetastorageRowStore rowStore, long metaPageId, - boolean initNew) throws IgniteCheckedException { + boolean initNew, + @Nullable FailureProcessor failureProcessor) throws IgniteCheckedException { super("Metastorage", cacheId, pageMem, wal, - globalRmvId, metaPageId, reuseList, MetastorageInnerIO.VERSIONS, MetastoreLeafIO.VERSIONS); + globalRmvId, metaPageId, reuseList, MetastorageInnerIO.VERSIONS, MetastoreLeafIO.VERSIONS, failureProcessor); this.rowStore = rowStore; @@ -65,7 +71,7 @@ public class MetastorageTree extends BPlusTree<MetastorageSearchRow, Metastorage /** {@inheritDoc} */ @Override protected int compare(BPlusIO<MetastorageSearchRow> io, long pageAddr, int idx, - MetastorageSearchRow row) throws IgniteCheckedException { + MetastorageSearchRow row) { String key = ((DataLinkIO)io).getKey(pageAddr, idx); @@ -132,7 +138,7 @@ public class MetastorageTree extends BPlusTree<MetastorageSearchRow, Metastorage /** {@inheritDoc} */ @Override public void storeByOffset(long pageAddr, int off, - MetastorageSearchRow row) throws IgniteCheckedException { + MetastorageSearchRow row) { assert row.link() != 0; PageUtils.putLong(pageAddr, off, row.link()); @@ -146,7 +152,7 @@ public class MetastorageTree extends BPlusTree<MetastorageSearchRow, Metastorage /** {@inheritDoc} */ @Override public void store(long dstPageAddr, int dstIdx, BPlusIO<MetastorageSearchRow> srcIo, long srcPageAddr, - int srcIdx) throws IgniteCheckedException { + int srcIdx) { int srcOff = srcIo.offset(srcIdx); int dstOff = offset(dstIdx); @@ -162,7 +168,7 @@ public class MetastorageTree extends BPlusTree<MetastorageSearchRow, Metastorage /** {@inheritDoc} */ @Override public MetastorageSearchRow getLookupRow(BPlusTree<MetastorageSearchRow, ?> tree, long pageAddr, - int idx) throws IgniteCheckedException { + int idx) { long link = getLink(pageAddr, idx); String key = getKey(pageAddr, idx); @@ -207,7 +213,7 @@ public class MetastorageTree extends BPlusTree<MetastorageSearchRow, Metastorage /** {@inheritDoc} */ @Override public void storeByOffset(long pageAddr, int off, - MetastorageSearchRow row) throws IgniteCheckedException { + MetastorageSearchRow row) { assert row.link() != 0; PageUtils.putLong(pageAddr, off, row.link()); @@ -221,7 +227,7 @@ public class MetastorageTree extends BPlusTree<MetastorageSearchRow, Metastorage /** {@inheritDoc} */ @Override public void store(long dstPageAddr, int dstIdx, BPlusIO<MetastorageSearchRow> srcIo, long srcPageAddr, - int srcIdx) throws IgniteCheckedException { + int srcIdx) { int srcOff = srcIo.offset(srcIdx); int dstOff = offset(dstIdx); @@ -237,7 +243,7 @@ public class MetastorageTree extends BPlusTree<MetastorageSearchRow, Metastorage /** {@inheritDoc} */ @Override public MetastorageSearchRow getLookupRow(BPlusTree<MetastorageSearchRow, ?> tree, long pageAddr, - int idx) throws IgniteCheckedException { + int idx) { long link = getLink(pageAddr, idx); String key = getKey(pageAddr, idx); http://git-wip-us.apache.org/repos/asf/ignite/blob/cc370d6c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/BPlusTree.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/BPlusTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/BPlusTree.java index e30de5a..cb28878 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/BPlusTree.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/BPlusTree.java @@ -27,6 +27,8 @@ import java.util.concurrent.atomic.AtomicLong; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteSystemProperties; +import org.apache.ignite.failure.FailureContext; +import org.apache.ignite.failure.FailureType; import org.apache.ignite.internal.IgniteInterruptedCheckedException; import org.apache.ignite.internal.pagemem.PageIdUtils; import org.apache.ignite.internal.pagemem.PageMemory; @@ -53,6 +55,7 @@ import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.LongLi import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseBag; import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseList; import org.apache.ignite.internal.processors.cache.persistence.tree.util.PageHandler; +import org.apache.ignite.internal.processors.failure.FailureProcessor; import org.apache.ignite.internal.util.GridArrays; import org.apache.ignite.internal.util.GridLongList; import org.apache.ignite.internal.util.IgniteTree; @@ -65,6 +68,7 @@ import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteInClosure; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.IgniteSystemProperties.IGNITE_BPLUS_TREE_LOCK_RETRIES; import static org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.Bool.DONE; import static org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.Bool.FALSE; import static org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.Bool.READY; @@ -92,7 +96,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements /** */ private static final int LOCK_RETRIES = IgniteSystemProperties.getInteger( - IgniteSystemProperties.IGNITE_BPLUS_TREE_LOCK_RETRIES, IGNITE_BPLUS_TREE_LOCK_RETRIES_DEFAULT); + IGNITE_BPLUS_TREE_LOCK_RETRIES, IGNITE_BPLUS_TREE_LOCK_RETRIES_DEFAULT); /** */ private final AtomicBoolean destroyed = new AtomicBoolean(false); @@ -124,6 +128,9 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements /** */ private volatile TreeMetaData treeMeta; + /** Failure processor. */ + private final FailureProcessor failureProcessor; + /** */ private final GridTreePrinter<Long> treePrinter = new GridTreePrinter<Long>() { /** */ @@ -720,6 +727,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements * @param reuseList Reuse list. * @param innerIos Inner IO versions. * @param leafIos Leaf IO versions. + * @param failureProcessor if the tree is corrupted. * @throws IgniteCheckedException If failed. */ protected BPlusTree( @@ -731,9 +739,10 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements long metaPageId, ReuseList reuseList, IOVersions<? extends BPlusInnerIO<L>> innerIos, - IOVersions<? extends BPlusLeafIO<L>> leafIos + IOVersions<? extends BPlusLeafIO<L>> leafIos, + @Nullable FailureProcessor failureProcessor ) throws IgniteCheckedException { - this(name, cacheId, pageMem, wal, globalRmvId, metaPageId, reuseList); + this(name, cacheId, pageMem, wal, globalRmvId, metaPageId, reuseList, failureProcessor); setIos(innerIos, leafIos); } @@ -745,6 +754,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements * @param globalRmvId Remove ID. * @param metaPageId Meta page ID. * @param reuseList Reuse list. + * @param failureProcessor if the tree is corrupted. * @throws IgniteCheckedException If failed. */ protected BPlusTree( @@ -754,7 +764,8 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements IgniteWriteAheadLogManager wal, AtomicLong globalRmvId, long metaPageId, - ReuseList reuseList + ReuseList reuseList, + @Nullable FailureProcessor failureProcessor ) throws IgniteCheckedException { super(cacheId, pageMem, wal); @@ -770,6 +781,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements this.name = name; this.reuseList = reuseList; this.globalRmvId = globalRmvId; + this.failureProcessor = failureProcessor; } /** @@ -2561,8 +2573,17 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements * @throws IgniteCheckedException If the operation can not be retried. */ final void checkLockRetry() throws IgniteCheckedException { - if (lockRetriesCnt == 0) - throw new IgniteCheckedException("Maximum of retries " + getLockRetries() + " reached."); + if (lockRetriesCnt == 0) { + IgniteCheckedException e = new IgniteCheckedException("Maximum number of retries " + + getLockRetries() + " reached for " + getClass().getSimpleName() + " operation " + + "(the tree may be corrupted). Increase " + IGNITE_BPLUS_TREE_LOCK_RETRIES + " system property " + + "if you regularly see this message (current value is " + getLockRetries() + ")."); + + if (failureProcessor != null) + failureProcessor.process(new FailureContext(FailureType.CRITICAL_ERROR, e)); + + throw e; + } lockRetriesCnt--; } http://git-wip-us.apache.org/repos/asf/ignite/blob/cc370d6c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusMetaIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusMetaIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusMetaIO.java index afa3c9a..623951b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusMetaIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusMetaIO.java @@ -77,7 +77,7 @@ public class BPlusMetaIO extends PageIO { * @return Number of levels in this tree. */ public int getLevelsCount(long pageAddr) { - return PageUtils.getByte(pageAddr, LVLS_OFF); + return Byte.toUnsignedInt(PageUtils.getByte(pageAddr, LVLS_OFF)); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/cc370d6c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/util/PageHandler.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/util/PageHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/util/PageHandler.java index a52038a..98c6f1f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/util/PageHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/util/PageHandler.java @@ -151,16 +151,18 @@ public abstract class PageHandler<X, R> { int intArg, R lockFailed ) throws IgniteCheckedException { - long pageAddr = readLock(pageMem, cacheId, pageId, page, lsnr); + long pageAddr = 0L; - if (pageAddr == 0L) - return lockFailed; try { + if ((pageAddr = readLock(pageMem, cacheId, pageId, page, lsnr)) == 0L) + return lockFailed; + PageIO io = PageIO.getPageIO(pageAddr); return h.run(cacheId, pageId, page, pageAddr, io, null, arg, intArg); } finally { - readUnlock(pageMem, cacheId, pageId, page, pageAddr, lsnr); + if (pageAddr != 0L) + readUnlock(pageMem, cacheId, pageId, page, pageAddr, lsnr); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/cc370d6c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java index f2bfa41..c6214eb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java @@ -70,7 +70,8 @@ public class CacheDataTree extends BPlusTree<CacheSearchRow, CacheDataRow> { metaPageId, reuseList, grp.sharedGroup() ? CacheIdAwareDataInnerIO.VERSIONS : DataInnerIO.VERSIONS, - grp.sharedGroup() ? CacheIdAwareDataLeafIO.VERSIONS : DataLeafIO.VERSIONS); + grp.sharedGroup() ? CacheIdAwareDataLeafIO.VERSIONS : DataLeafIO.VERSIONS, + grp.shared().kernalContext().failure()); assert rowStore != null; http://git-wip-us.apache.org/repos/asf/ignite/blob/cc370d6c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/PendingEntriesTree.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/PendingEntriesTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/PendingEntriesTree.java index 0b1c931..78a9f56 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/PendingEntriesTree.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/PendingEntriesTree.java @@ -30,7 +30,7 @@ import org.apache.ignite.internal.util.typedef.internal.CU; */ public class PendingEntriesTree extends BPlusTree<PendingRow, PendingRow> { /** */ - public final static Object WITHOUT_KEY = new Object(); + public static final Object WITHOUT_KEY = new Object(); /** */ private final CacheGroupContext grp; @@ -60,7 +60,8 @@ public class PendingEntriesTree extends BPlusTree<PendingRow, PendingRow> { metaPageId, reuseList, grp.sharedGroup() ? CacheIdAwarePendingEntryInnerIO.VERSIONS : PendingEntryInnerIO.VERSIONS, - grp.sharedGroup() ? CacheIdAwarePendingEntryLeafIO.VERSIONS : PendingEntryLeafIO.VERSIONS); + grp.sharedGroup() ? CacheIdAwarePendingEntryLeafIO.VERSIONS : PendingEntryLeafIO.VERSIONS, + grp.shared().kernalContext().failure()); this.grp = grp; @@ -70,8 +71,7 @@ public class PendingEntriesTree extends BPlusTree<PendingRow, PendingRow> { } /** {@inheritDoc} */ - @Override protected int compare(BPlusIO<PendingRow> iox, long pageAddr, int idx, PendingRow row) - throws IgniteCheckedException { + @Override protected int compare(BPlusIO<PendingRow> iox, long pageAddr, int idx, PendingRow row) { PendingRowIO io = (PendingRowIO)iox; int cmp; http://git-wip-us.apache.org/repos/asf/ignite/blob/cc370d6c/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java index bd9a099..3c368f7 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java @@ -2385,7 +2385,7 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest { public TestTree(ReuseList reuseList, boolean canGetRow, int cacheId, PageMemory pageMem, long metaPageId) throws IgniteCheckedException { super("test", cacheId, pageMem, null, new AtomicLong(), metaPageId, reuseList, - new IOVersions<>(new LongInnerIO(canGetRow)), new IOVersions<>(new LongLeafIO())); + new IOVersions<>(new LongInnerIO(canGetRow)), new IOVersions<>(new LongLeafIO()), null); PageIO.registerTest(latestInnerIO(), latestLeafIO()); http://git-wip-us.apache.org/repos/asf/ignite/blob/cc370d6c/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IndexStorageSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IndexStorageSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IndexStorageSelfTest.java index b92534c..69a86b4 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IndexStorageSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IndexStorageSelfTest.java @@ -98,7 +98,8 @@ public class IndexStorageSelfTest extends GridCommonAbstractTest { if (metaStore == null) { metaStore = new IndexStorageImpl(mem, null, new AtomicLong(), cacheId, PageIdAllocator.INDEX_PARTITION, PageMemory.FLAG_IDX, - null, mem.allocatePage(cacheId, PageIdAllocator.INDEX_PARTITION, PageMemory.FLAG_IDX), true); + null, mem.allocatePage(cacheId, PageIdAllocator.INDEX_PARTITION, PageMemory.FLAG_IDX), true, + null); storeMap.put(cacheId, metaStore); } http://git-wip-us.apache.org/repos/asf/ignite/blob/cc370d6c/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java index 8da3b05..424969e 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java @@ -28,6 +28,7 @@ import org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree; import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusIO; import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusMetaIO; import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseList; +import org.apache.ignite.internal.processors.failure.FailureProcessor; import org.apache.ignite.internal.processors.query.h2.H2RowCache; import org.apache.ignite.internal.processors.query.h2.database.io.H2ExtrasInnerIO; import org.apache.ignite.internal.processors.query.h2.database.io.H2ExtrasLeafIO; @@ -81,6 +82,7 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> { * @param metaPageId Meta page ID. * @param initNew Initialize new index. * @param rowCache Row cache. + * @param failureProcessor if the tree is corrupted. * @throws IgniteCheckedException If failed. */ protected H2Tree( @@ -96,9 +98,10 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> { IndexColumn[] cols, List<InlineIndexHelper> inlineIdxs, int inlineSize, - @Nullable H2RowCache rowCache + @Nullable H2RowCache rowCache, + @Nullable FailureProcessor failureProcessor ) throws IgniteCheckedException { - super(name, grpId, pageMem, wal, globalRmvId, metaPageId, reuseList); + super(name, grpId, pageMem, wal, globalRmvId, metaPageId, reuseList, failureProcessor); if (!initNew) { // Page is ready - read inline size from it. http://git-wip-us.apache.org/repos/asf/ignite/blob/cc370d6c/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java index 2441ff1..393ca3b 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java @@ -139,7 +139,8 @@ public class H2TreeIndex extends GridH2IndexBase { cols, inlineIdxs, computeInlineSize(inlineIdxs, inlineSize), - rowCache) { + rowCache, + cctx.kernalContext().failure()) { @Override public int compareValues(Value v1, Value v2) { return v1 == v2 ? 0 : table.compareTypeSafe(v1, v2); } http://git-wip-us.apache.org/repos/asf/ignite/blob/cc370d6c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java index 2b5dcb7..4490fc7 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java @@ -40,6 +40,7 @@ import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.DataRegionConfiguration; import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.failure.StopNodeFailureHandler; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.binary.BinaryMarshaller; import org.apache.ignite.internal.util.typedef.T2; @@ -131,6 +132,8 @@ public abstract class DynamicIndexAbstractSelfTest extends AbstractSchemaSelfTes protected IgniteConfiguration commonConfiguration(int idx) throws Exception { IgniteConfiguration cfg = super.getConfiguration(getTestIgniteInstanceName(idx)); + cfg.setFailureHandler(new StopNodeFailureHandler()); + cfg.setDiscoverySpi(new TcpDiscoverySpi().setIpFinder(IP_FINDER)); cfg.setMarshaller(new BinaryMarshaller());
