You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2019/02/26 12:17:41 UTC
[ignite] 10/11: reuse
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 <se...@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;