This is an automated email from the ASF dual-hosted git repository. sboikov pushed a commit to branch ignite-invokeAll in repository https://gitbox.apache.org/repos/asf/ignite.git
commit d945a5cef04c1be25858a6444edb21607a085e92 Author: Sergi Vladykin <sergi.vlady...@gmail.com> AuthorDate: Mon Feb 25 11:05:47 2019 +0300 reuse --- .../cache/persistence/tree/BPlusTree.java | 31 ++++++++++++++++------ .../persistence/tree/reuse/LongListReuseBag.java | 21 +++++++++++++++ .../cache/persistence/tree/reuse/ReuseBag.java | 8 ++++++ .../persistence/tree/reuse/SinglePageReuseBag.java | 9 +++++++ .../apache/ignite/internal/util/GridLongList.java | 2 +- 5 files changed, 62 insertions(+), 9 deletions(-) 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 37d7f68..99efaff 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 @@ -2957,7 +2957,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements * @return The same or new reuse bag containing the given page id. */ protected final ReuseBag addFreePageToBag(ReuseBag reuseBag, long pageId) throws IgniteCheckedException { - if (invoke != null && invoke.addFreePage(pageId)) + if (invoke != null && invoke.addFreePageForReuse(pageId)) return reuseBag; assert pageId != 0L; @@ -3984,7 +3984,9 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements */ private L insertWithSplit(long pageId, long page, long pageAddr, BPlusIO<L> io, int idx, int lvl) throws IgniteCheckedException { - long fwdId = allocatePage(null); + ReuseBag bag = invoke == null ? null : invoke.getReuseBag(); + + long fwdId = allocatePage(bag); long fwdPage = acquirePage(fwdId); try { @@ -4032,7 +4034,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements } if (!hadFwd && lvl == getRootLevel()) { // We are splitting root. - long newRootId = allocatePage(null); + long newRootId = allocatePage(bag); long newRootPage = acquirePage(newRootId); try { @@ -4178,7 +4180,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements Function<L, InvokeClosure<T>> closures; /** */ - ReuseBag reuseBag; + ReuseBag reuseBag = new LongListReuseBag(); /** * @param firstRow The first row. @@ -4200,7 +4202,8 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements if (!doSwitchToNextRow(res, sortedRows)) return false; - reuseFreePagesFromBag(reuseBag, 15); + if (reuseBag.size() > 128) + reuseFreePagesFromBag(reuseBag.take(64), 0); // Create a new closure for the switched row. clo = closures.apply(row); @@ -4214,13 +4217,18 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements } /** {@inheritDoc} */ - @Override boolean addFreePage(long pageId) throws IgniteCheckedException { + @Override boolean addFreePageForReuse(long pageId) throws IgniteCheckedException { reuseBag = addFreePageToBag(reuseBag, pageId); return true; } /** {@inheritDoc} */ + @Override public ReuseBag getReuseBag() { + return reuseBag; + } + + /** {@inheritDoc} */ @Override void releaseAll() throws IgniteCheckedException { super.releaseAll(); @@ -4522,9 +4530,16 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements * @param pageId Page Id for reuse. * @return {@code true} If it was accepted. */ - boolean addFreePage(long pageId) throws IgniteCheckedException { + boolean addFreePageForReuse(long pageId) throws IgniteCheckedException { return false; } + + /** + * @return Reuse bag for this operation. + */ + ReuseBag getReuseBag() { + return null; + } } /** @@ -4555,7 +4570,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements if (!doSwitchToNextRow(res, sortedRows)) return false; - reuseFreePagesFromBag(reuseBag, 15); + reuseFreePagesFromBag(reuseBag, 16); // Reset state. rmvdRow = null; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/reuse/LongListReuseBag.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/reuse/LongListReuseBag.java index c7be05e..3381be8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/reuse/LongListReuseBag.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/reuse/LongListReuseBag.java @@ -35,6 +35,13 @@ public final class LongListReuseBag extends GridLongList implements ReuseBag { } /** + * @param pageIds Page ids. + */ + public LongListReuseBag(long[] pageIds) { + super(pageIds); + } + + /** * @param size Initial size. * @param bag Bag to take pages from. */ @@ -62,4 +69,18 @@ public final class LongListReuseBag extends GridLongList implements ReuseBag { @Override public long pollFreePage() { return isEmpty() ? 0L : remove(); } + + /** {@inheritDoc} */ + @Override public ReuseBag take(int cnt) { + assert cnt > 0: cnt; + + if (cnt > size()) + return null; + + long[] res = new long[cnt]; + System.arraycopy(arr, size() - cnt, res, 0, cnt); + pop(cnt); + + return new LongListReuseBag(res); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/reuse/ReuseBag.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/reuse/ReuseBag.java index 5d4579d..65aac99 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/reuse/ReuseBag.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/reuse/ReuseBag.java @@ -41,4 +41,12 @@ public interface ReuseBag { * @return Number of pages for reuse in this bag. */ int size(); + + /** + * Takes and removes {@code cnt} pages from this bag. + * + * @param cnt Number of pages to take. + * @return Bag or {@code null} if there are not enough pages in this bag. + */ + ReuseBag take(int cnt); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/reuse/SinglePageReuseBag.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/reuse/SinglePageReuseBag.java index 16a3868..468bf84 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/reuse/SinglePageReuseBag.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/reuse/SinglePageReuseBag.java @@ -67,6 +67,15 @@ public final class SinglePageReuseBag implements ReuseBag { } /** {@inheritDoc} */ + @Override public ReuseBag take(int cnt) { + assert cnt > 0: cnt; + + long id = pollFreePage(); + + return id == 0L ? null : new SinglePageReuseBag(id); + } + + /** {@inheritDoc} */ @Override public String toString() { return S.toString(SinglePageReuseBag.class, this, "pageId", U.hexLong(pageId)); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/GridLongList.java b/modules/core/src/main/java/org/apache/ignite/internal/util/GridLongList.java index 1c022b0..0d34ea0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/GridLongList.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/GridLongList.java @@ -48,7 +48,7 @@ public class GridLongList implements Message, Externalizable { public static final long[] EMPTY_ARRAY = new long[0]; /** */ - private long[] arr; + protected long[] arr; /** */ private int idx;