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());

Reply via email to