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 2017/01/20 12:38:52 UTC

ignite git commit: Fake memory management.

Repository: ignite
Updated Branches:
  refs/heads/ignite-3477-test1 [created] 2b06c1917


Fake memory management.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/2b06c191
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/2b06c191
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/2b06c191

Branch: refs/heads/ignite-3477-test1
Commit: 2b06c1917825854c7f786f3baed7ea7f82630df7
Parents: c47d031
Author: sboikov <sb...@gridgain.com>
Authored: Fri Jan 20 15:38:57 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Fri Jan 20 15:38:57 2017 +0300

----------------------------------------------------------------------
 .../configuration/MemoryConfiguration.java      |   2 +-
 .../cache/database/freelist/FreeListImpl.java   | 142 +++++++++++--------
 .../cache/database/tree/io/DataPageIO.java      |   6 +
 3 files changed, 86 insertions(+), 64 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/2b06c191/modules/core/src/main/java/org/apache/ignite/configuration/MemoryConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/MemoryConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/MemoryConfiguration.java
index 242354e..ed37784 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/MemoryConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/MemoryConfiguration.java
@@ -29,7 +29,7 @@ public class MemoryConfiguration implements Serializable {
     private static final long serialVersionUID = 0L;
 
     /** Default cache size is 1Gb. */
-    public static final long DFLT_PAGE_CACHE_SIZE = 1024 * 1024 * 1024;
+    public static final long DFLT_PAGE_CACHE_SIZE = 4L * 1024 * 1024 * 1024;
 
     /** Default page size. */
     public static final int DFLT_PAGE_SIZE = 2 * 1024;

http://git-wip-us.apache.org/repos/asf/ignite/blob/2b06c191/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl.java
index 6c1b21b..1e0d914 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.processors.cache.database.freelist;
 
+import java.util.concurrent.ConcurrentLinkedDeque;
 import java.util.concurrent.atomic.AtomicReferenceArray;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.pagemem.Page;
@@ -87,13 +88,13 @@ public class FreeListImpl extends PagesList implements FreeList, ReuseList {
                     addRowFragment(page, pageAddr, io, row, written, rowSize);
 
                 // Reread free space after update.
-                int newFreeSpace = io.getFreeSpace(pageAddr);
-
-                if (newFreeSpace > MIN_PAGE_FREE_SPACE) {
-                    int bucket = bucket(newFreeSpace, false);
-
-                    put(null, page, pageAddr, bucket);
-                }
+//                int newFreeSpace = io.getFreeSpace(pageAddr);
+//
+//                if (newFreeSpace > MIN_PAGE_FREE_SPACE) {
+//                    int bucket = bucket(newFreeSpace, false);
+//
+//                    put(null, page, pageAddr, bucket);
+//                }
 
                 // Avoid boxing with garbage generation for usual case.
                 return written == rowSize ? COMPLETE : written;
@@ -186,7 +187,7 @@ public class FreeListImpl extends PagesList implements FreeList, ReuseList {
 
             assert oldFreeSpace >= 0: oldFreeSpace;
 
-            long nextLink = io.removeRow(pageAddr, itemId, pageSize());
+            long nextLink = io.removeRowTmp(pageAddr, itemId, pageSize());
 
             if (isWalDeltaRecordNeeded(wal, page))
                 wal.log(new DataPageRemoveRecord(cacheId, page.id(), itemId));
@@ -199,23 +200,23 @@ public class FreeListImpl extends PagesList implements FreeList, ReuseList {
 //                    put(null, page, buf, REUSE_BUCKET);
 //            }
 
-            int newFreeSpace = io.getFreeSpace(pageAddr);
-
-            if (newFreeSpace > MIN_PAGE_FREE_SPACE) {
-                int newBucket = bucket(newFreeSpace, false);
-
-                if (oldFreeSpace > MIN_PAGE_FREE_SPACE) {
-                    int oldBucket = bucket(oldFreeSpace, false);
-
-                    if (oldBucket != newBucket) {
-                        // It is possible that page was concurrently taken for put, in this case put will handle bucket change.
-                        if (removeDataPage(page, pageAddr, io, oldBucket))
-                            put(null, page, pageAddr, newBucket);
-                    }
-                }
-                else
-                    put(null, page, pageAddr, newBucket);
-            }
+//            int newFreeSpace = io.getFreeSpace(pageAddr);
+//
+//            if (newFreeSpace > MIN_PAGE_FREE_SPACE) {
+//                int newBucket = bucket(newFreeSpace, false);
+//
+//                if (oldFreeSpace > MIN_PAGE_FREE_SPACE) {
+//                    int oldBucket = bucket(oldFreeSpace, false);
+//
+//                    if (oldBucket != newBucket) {
+//                        // It is possible that page was concurrently taken for put, in this case put will handle bucket change.
+//                        if (removeDataPage(page, pageAddr, io, oldBucket))
+//                            put(null, page, pageAddr, newBucket);
+//                    }
+//                }
+//                else
+//                    put(null, page, pageAddr, newBucket);
+//            }
 
             // For common case boxed 0L will be cached inside of Long, so no garbage will be produced.
             return nextLink;
@@ -296,41 +297,54 @@ public class FreeListImpl extends PagesList implements FreeList, ReuseList {
         return pageMem.page(cacheId, pageId);
     }
 
+    private final ConcurrentLinkedDeque<Long> pagePool = new ConcurrentLinkedDeque<>();
+
     /** {@inheritDoc} */
     @Override public void insertDataRow(CacheDataRow row) throws IgniteCheckedException {
-        int rowSize = getRowSize(row);
-
-        int written = 0;
-
-        do {
-            int freeSpace = Math.min(MIN_SIZE_FOR_DATA_PAGE, rowSize - written);
-
-            int bucket = bucket(freeSpace, false);
+        Long poolPageId = pagePool.pollFirst();
 
-            long pageId = 0;
-            boolean reuseBucket = false;
+        long pageId = poolPageId != null ? poolPageId : 0L;
 
-            // TODO: properly handle reuse bucket.
-            for (int b = bucket; b < BUCKETS - 1; b++) {
-                pageId = takeEmptyPage(b, DataPageIO.VERSIONS);
-
-                if (pageId != 0L) {
-                    reuseBucket = isReuseBucket(b);
-
-                    break;
-                }
-            }
+        try (Page page = pageId == 0 ? allocateDataPage(row.partition()) : pageMem.page(cacheId, pageId)) {
+            // If it is an existing page, we do not need to initialize it.
+            DataPageIO init = pageId == 0L ? DataPageIO.VERSIONS.latest() : null;
 
-            try (Page page = pageId == 0 ? allocateDataPage(row.partition()) : pageMem.page(cacheId, pageId)) {
-                // If it is an existing page, we do not need to initialize it.
-                DataPageIO init = reuseBucket || pageId == 0L ? DataPageIO.VERSIONS.latest() : null;
-
-                written = writePage(pageMem, page, this, writeRow, init, wal, row, written, FAIL_I);
-
-                assert written != FAIL_I; // We can't fail here.
-            }
+            writePage(pageMem, page, this, writeRow, init, wal, row, 0, FAIL_I);
         }
-        while (written != COMPLETE);
+
+//        int rowSize = getRowSize(row);
+//
+//        int written = 0;
+//
+//        do {
+//            int freeSpace = Math.min(MIN_SIZE_FOR_DATA_PAGE, rowSize - written);
+//
+//            int bucket = bucket(freeSpace, false);
+//
+//            long pageId = 0;
+//            boolean reuseBucket = false;
+//
+//            // TODO: properly handle reuse bucket.
+//            for (int b = bucket; b < BUCKETS - 1; b++) {
+//                pageId = takeEmptyPage(b, DataPageIO.VERSIONS);
+//
+//                if (pageId != 0L) {
+//                    reuseBucket = isReuseBucket(b);
+//
+//                    break;
+//                }
+//            }
+//
+//            try (Page page = pageId == 0 ? allocateDataPage(row.partition()) : pageMem.page(cacheId, pageId)) {
+//                // If it is an existing page, we do not need to initialize it.
+//                DataPageIO init = reuseBucket || pageId == 0L ? DataPageIO.VERSIONS.latest() : null;
+//
+//                written = writePage(pageMem, page, this, writeRow, init, wal, row, written, FAIL_I);
+//
+//                assert written != FAIL_I; // We can't fail here.
+//            }
+//        }
+//        while (written != COMPLETE);
     }
 
     /** {@inheritDoc} */
@@ -348,16 +362,18 @@ public class FreeListImpl extends PagesList implements FreeList, ReuseList {
             assert nextLink != FAIL_L; // Can't fail here.
         }
 
-        while (nextLink != 0L) {
-            itemId = PageIdUtils.itemId(nextLink);
-            pageId = PageIdUtils.pageId(nextLink);
-
-            try (Page page = pageMem.page(cacheId, pageId)) {
-                nextLink = writePage(pageMem, page, this, rmvRow, null, itemId, FAIL_L);
+        pagePool.add(pageId);
 
-                assert nextLink != FAIL_L; // Can't fail here.
-            }
-        }
+//        while (nextLink != 0L) {
+//            itemId = PageIdUtils.itemId(nextLink);
+//            pageId = PageIdUtils.pageId(nextLink);
+//
+//            try (Page page = pageMem.page(cacheId, pageId)) {
+//                nextLink = writePage(pageMem, page, this, rmvRow, null, itemId, FAIL_L);
+//
+//                assert nextLink != FAIL_L; // Can't fail here.
+//            }
+//        }
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/2b06c191/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java
index 548e300..f86a51e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java
@@ -597,6 +597,12 @@ public class DataPageIO extends PageIO {
         return -1;
     }
 
+    public long removeRowTmp(long pageAddr, int itemId, int pageSize) throws IgniteCheckedException {
+        setEmptyPage(pageAddr, pageSize);
+
+        return 0;
+    }
+
     /**
      * @param pageAddr Page address.
      * @param itemId Fixed item ID (the index used for referencing an entry from the outside).