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;