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/30 17:47:18 UTC

[6/9] ignite git commit: ignite-3477 lock free freelist

ignite-3477 lock free freelist


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

Branch: refs/heads/ignite-3477-freelist
Commit: 468af801e3715664019a6243be29a1ed38830c88
Parents: 260aee1
Author: sboikov <sb...@gridgain.com>
Authored: Mon Jan 30 13:13:02 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Mon Jan 30 13:13:02 2017 +0300

----------------------------------------------------------------------
 .../cache/database/freelist/DataPageList.java   | 23 ++++++
 .../cache/database/freelist/FreeListImpl2.java  | 80 +++++++++++++-------
 .../database/FreeListImpl2SelfTest.java         | 16 +++-
 3 files changed, 88 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/468af801/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/DataPageList.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/DataPageList.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/DataPageList.java
index 33ed2aa..710164d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/DataPageList.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/DataPageList.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.processors.cache.database.freelist;
 
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.internal.pagemem.Page;
 import org.apache.ignite.internal.pagemem.PageMemory;
 import org.apache.ignite.internal.processors.cache.database.tree.io.DataPageIO;
@@ -90,6 +91,28 @@ public class DataPageList {
         }
     }
 
+    public void dumpState(int cacheId, IgniteLogger log) throws IgniteCheckedException {
+        Head head = this.head;
+
+        long pageId = head.pageId;
+
+        if (pageId == 0) {
+            log.info("        Empty");
+
+            return;
+        }
+
+        while (pageId != 0) {
+            Page page = pageMem.page(cacheId, pageId);
+
+            long pageAddr = page.pageAddress();
+
+            log.info("        Page [id=" + pageId + ", free=" + io.getFreeSpace(pageAddr) + ']');
+
+            pageId = io.getNextPageId(pageAddr);
+        }
+    }
+
     /**
      *
      */

http://git-wip-us.apache.org/repos/asf/ignite/blob/468af801/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
index 81186a6..46b1ea0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl2.java
@@ -17,10 +17,10 @@
 
 package org.apache.ignite.internal.processors.cache.database.freelist;
 
-import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReferenceArray;
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.internal.IgniteInterruptedCheckedException;
 import org.apache.ignite.internal.pagemem.Page;
 import org.apache.ignite.internal.pagemem.PageIdAllocator;
@@ -316,16 +316,14 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
         compacter.setName("compacter");
         compacter.setDaemon(true);
 
-        //compacter.start();
+        compacter.start();
     }
 
     private void putInBucket(int bucket, Page page) throws IgniteCheckedException {
         AtomicReferenceArray<DataPageList> b = buckets[bucket];
 
-        ThreadLocalRandom rnd = ThreadLocalRandom.current();
-
         while (true) {
-            int idx = rnd.nextInt(STACKS_PER_BUCKET);
+            int idx = randomInt(STACKS_PER_BUCKET);
 
             DataPageList list = b.get(idx);
 
@@ -354,10 +352,8 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
 //        }
 //
 //        return null;
-        ThreadLocalRandom rnd = ThreadLocalRandom.current();
-
         while (true) {
-            int idx = rnd.nextInt(STACKS_PER_BUCKET);
+            int idx = randomInt(STACKS_PER_BUCKET);
 
             DataPageList list = b.get(idx);
 
@@ -407,6 +403,26 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
         return pageMem.page(cacheId, pageId);
     }
 
+    public void dumpState(IgniteLogger log) throws IgniteCheckedException {
+        int s = (int)Math.pow(2, shift);
+
+        for (int b = 0; b < BUCKETS; b++) {
+            log.info("Bucket [idx=" + b + ", spaceFrom=" + s * b + ", spaceTo=" + s * (b + 1) + "]");
+
+            AtomicReferenceArray<DataPageList> stacks = buckets[b];
+
+            for (int i = 0; i < stacks.length(); i++) {
+                log.info("    Stripe: " + i);
+
+                DataPageList pageList = stacks.get(i);
+
+                assert pageList != null;
+
+                pageList.dumpState(cacheId, log);
+            }
+        }
+    }
+
     public void compact() throws IgniteCheckedException {
         for (int b = 0; b < BUCKETS; b++)
             compactBucket(b);
@@ -430,6 +446,8 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
         }
     }
 
+    public IgniteLogger log;
+
     private void compactStack(DataPageList pageList) throws IgniteCheckedException {
         Page page;
 
@@ -444,7 +462,7 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
 
     private final AtomicBoolean cg = new AtomicBoolean();
 
-    public boolean locCompact;
+    public boolean locCompact = true;
 
     /** {@inheritDoc} */
     @Override public void insertDataRow(CacheDataRow row) throws IgniteCheckedException {
@@ -481,29 +499,35 @@ public class FreeListImpl2 extends DataStructure implements FreeList, ReuseList
                                 if (take) {
                                     Page page;
 
-                                    while ((page = pageList.take(cacheId)) != null) {
-                                        Boolean found = writePage(pageMem,
-                                            page,
-                                            this,
-                                            compact2,
-                                            null,
-                                            wal,
-                                            null,
-                                            freeSpace,
-                                            null);
-
-                                        assert found != null;
-
-                                        if (found) {
-                                            foundPage = page;
-
-                                            break;
+                                    try {
+                                        while ((page = pageList.take(cacheId)) != null) {
+                                            Boolean found = writePage(pageMem,
+                                                page,
+                                                this,
+                                                compact2,
+                                                null,
+                                                wal,
+                                                null,
+                                                freeSpace,
+                                                null);
+
+                                            assert found != null;
+
+                                            if (found) {
+                                                foundPage = page;
+
+                                                break;
+                                            }
                                         }
                                     }
-
-                                    stacks.set(i, pageList);
+                                    finally {
+                                        stacks.set(i, pageList);
+                                    }
                                 }
                             }
+
+                            if (foundPage != null)
+                                break;
                         }
 
                         if (foundPage != null)

http://git-wip-us.apache.org/repos/asf/ignite/blob/468af801/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImpl2SelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImpl2SelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImpl2SelfTest.java
index bcb4c58..6bac890 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImpl2SelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImpl2SelfTest.java
@@ -91,6 +91,7 @@ public class FreeListImpl2SelfTest extends GridCommonAbstractTest {
         pageMem = createPageMemory(1024);
 
         FreeListImpl2 fl = new FreeListImpl2(1, "freelist", pageMem, null, null, 0, true);
+        fl.rnd = new Random();
 
         for (int iter = 0; iter < 100_000; iter++) {
             System.out.println("Iter: " + iter + ", allocated=" + pageMem.loadedPages());
@@ -107,6 +108,8 @@ public class FreeListImpl2SelfTest extends GridCommonAbstractTest {
 
             for (Long link : links)
                 fl.removeDataRowByLink(link);
+
+            //fl.locCompact = true;
         }
 
         fl.close();
@@ -120,12 +123,15 @@ public class FreeListImpl2SelfTest extends GridCommonAbstractTest {
 
         FreeListImpl2 fl = new FreeListImpl2(1, "freelist", pageMem, null, null, 0, true);
 
+        fl.rnd = new Random(1);
+        fl.log = log;
+
         for (int iter = 0; iter < 1; iter++) {
             System.out.println("Iter: " + iter + ", allocated=" + pageMem.loadedPages());
 
             List<Long> links = new ArrayList<>();
 
-            for (int i = 0; i < 100_000; i++) {
+            for (int i = 0; i < 10_000; i++) {
                 TestDataRow row = new TestDataRow(64, 64);
 
                 fl.insertDataRow(row);
@@ -136,11 +142,15 @@ public class FreeListImpl2SelfTest extends GridCommonAbstractTest {
             for (Long link : links)
                 fl.removeDataRowByLink(link);
 
+            //fl.dumpState(log);
+
             fl.locCompact = true;
 
-            TestDataRow row = new TestDataRow(64, 64);
+            for (int i = 0; i < 1000; i++) {
+                TestDataRow row = new TestDataRow(64, 64);
 
-            fl.insertDataRow(row);
+                fl.insertDataRow(row);
+            }
         }
 
         fl.close();