ignite-db - reuse fix
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/813c36f6 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/813c36f6 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/813c36f6 Branch: refs/heads/ignite-db-x-10884 Commit: 813c36f6959ab2216dc6c32c20ef81777289a53e Parents: 9cfda8d Author: S.Vladykin <[email protected]> Authored: Wed Apr 20 23:14:21 2016 +0300 Committer: S.Vladykin <[email protected]> Committed: Wed Apr 20 23:14:21 2016 +0300 ---------------------------------------------------------------------- .../cache/database/tree/BPlusTree.java | 25 ++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/813c36f6/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java index 51649a5..98fd8eb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java @@ -853,6 +853,8 @@ public abstract class BPlusTree<L, T extends L> { finally { r.releaseTail(); r.releaseMeta(); + + r.reuseEmptyPages(); } } @@ -1608,6 +1610,9 @@ public abstract class BPlusTree<L, T extends L> { Tail<L> tail; /** */ + List<FullPageId> emptyPages; + + /** */ byte needReplaceInner = FALSE; /** */ @@ -1893,11 +1898,23 @@ public abstract class BPlusTree<L, T extends L> { // Mark removed. io.setRemoveId(buf, Long.MAX_VALUE); - // Reuse empty page. - if (reuseList != null) { -// U.dumpStack("page: " + page.fullId()); + if (reuseList == null) + return; // We are not allowed to reuse pages. - reuseList.put(BPlusTree.this, page.fullId()); + // We will reuse empty page. + if (emptyPages == null) + emptyPages = new ArrayList<>(4); + + emptyPages.add(page.fullId()); + } + + /** + * @throws IgniteCheckedException If failed. + */ + private void reuseEmptyPages() throws IgniteCheckedException { + if (emptyPages != null) { + for (int i = 0; i < emptyPages.size(); i++) + reuseList.put(BPlusTree.this, emptyPages.get(i)); } }
