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();