IGNITE-7122: Fixed assertion in BPlusTree printing code. This closes #3157.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/1e8eaff1 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/1e8eaff1 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/1e8eaff1 Branch: refs/heads/ignite-zk-ce Commit: 1e8eaff1dc5f393e3e76cfe075602c504e484afe Parents: 850863e Author: gg-shq <[email protected]> Authored: Tue Dec 12 16:05:36 2017 +0300 Committer: devozerov <[email protected]> Committed: Tue Dec 12 16:05:36 2017 +0300 ---------------------------------------------------------------------- .../cache/persistence/tree/BPlusTree.java | 10 +++++++++- .../internal/util/lang/GridTreePrinter.java | 19 ++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/1e8eaff1/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 436a69d..cb6898a 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 @@ -121,6 +121,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements /** */ private boolean keys = true; + /** {@inheritDoc} */ @Override protected List<Long> getChildren(final Long pageId) { if (pageId == null || pageId == 0L) return null; @@ -131,11 +132,14 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements try { long pageAddr = readLock(pageId, page); // No correctness guaranties. + if (pageAddr == 0) + return null; + try { BPlusIO io = io(pageAddr); if (io.isLeaf()) - return null; + return Collections.emptyList(); int cnt = io.getCount(pageAddr); @@ -172,6 +176,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements } } + /** {@inheritDoc} */ @Override protected String formatTreeNode(final Long pageId) { if (pageId == null) return ">NPE<"; @@ -183,6 +188,9 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements long page = acquirePage(pageId); try { long pageAddr = readLock(pageId, page); // No correctness guaranties. + if (pageAddr == 0) + return "<Obsolete>"; + try { BPlusIO<L> io = io(pageAddr); http://git-wip-us.apache.org/repos/asf/ignite/blob/1e8eaff1/modules/core/src/main/java/org/apache/ignite/internal/util/lang/GridTreePrinter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/GridTreePrinter.java b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/GridTreePrinter.java index 5bf37eb..f6b3d57 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/GridTreePrinter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/GridTreePrinter.java @@ -54,7 +54,7 @@ public abstract class GridTreePrinter<T> { * @param prefix Prefix. * @param tail Tail child. * @param a Output. - * @throws IOException + * @throws IOException If failed. */ private void printTree(T treeNode, String prefix, boolean tail, Appendable a) throws IOException { List<T> children = getChildren(treeNode); @@ -63,13 +63,22 @@ public abstract class GridTreePrinter<T> { a.append(prefix).append(tail ? "âââ " : "âââ ").append(formatTreeNode(treeNode)).append('\n'); - for (int i = 0; i < cnt; i++) - printTree(children.get(i), prefix + (tail ? " " : "â "), i == cnt - 1, a); + String childPrefix = prefix + (tail ? " " : "â "); + + if (children == null) + a.append(childPrefix).append("âââ <list of children is not accessible>\n"); + else { + for (int i = 0; i < cnt; i++) + printTree(children.get(i), childPrefix, i == cnt - 1, a); + } } /** - * @param treeNode Tree node. - * @return List of children. + * Returns list of tree node children. + * + * @param treeNode The tree node. + * @return List of children (possibly empty, if it is a leaf page) + * or null if the node can't be read (e.g., is locked). */ protected abstract List<T> getChildren(T treeNode);
