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/03/10 07:23:49 UTC
[28/43] ignite git commit: IGNITE-4712 Memory leaks in PageMemory
IGNITE-4712 Memory leaks in PageMemory
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/21d62829
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/21d62829
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/21d62829
Branch: refs/heads/ignite-4712
Commit: 21d6282953b47c94559b708b343172ca0049e984
Parents: 6743d5c
Author: Igor Seliverstov <gv...@gmail.com>
Authored: Mon Feb 20 13:40:05 2017 +0300
Committer: Igor Seliverstov <gv...@gmail.com>
Committed: Wed Mar 1 10:44:54 2017 +0300
----------------------------------------------------------------------
.../cache/database/freelist/PagesList.java | 39 ++++++++++++--------
.../IgniteDbMemoryLeakLargeObjectsTest.java | 14 ++++---
2 files changed, 32 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/21d62829/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/PagesList.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/PagesList.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/PagesList.java
index e5430cf..c03f432 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/PagesList.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/PagesList.java
@@ -76,9 +76,6 @@ public abstract class PagesList extends DataStructure {
Math.min(8, Runtime.getRuntime().availableProcessors() * 2));
/** */
- private final boolean trackBucketsSize = IgniteSystemProperties.getBoolean("IGNITE_PAGES_LIST_TRACK_SIZE", false);
-
- /** */
protected final LongAdder8[] bucketsSize;
/** Page ID to store list metadata. */
@@ -600,8 +597,7 @@ public abstract class PagesList extends DataStructure {
if (idx == -1)
handlePageFull(pageId, page, pageAddr, io, dataPage, dataPageAddr, bucket);
else {
- if (trackBucketsSize)
- bucketsSize[bucket].increment();
+ bucketsSize[bucket].increment();
if (isWalDeltaRecordNeeded(wal, page))
wal.log(new PagesListAddPageRecord(cacheId, pageId, dataPageId));
@@ -695,8 +691,7 @@ public abstract class PagesList extends DataStructure {
assert idx != -1;
- if (trackBucketsSize)
- bucketsSize[bucket].increment();
+ bucketsSize[bucket].increment();
dataIO.setFreeListPageId(dataPageAddr, nextId);
@@ -786,8 +781,7 @@ public abstract class PagesList extends DataStructure {
}
}
else {
- if (trackBucketsSize)
- bucketsSize[bucket].increment();
+ bucketsSize[bucket].increment();
// TODO: use single WAL record for bag?
if (isWalDeltaRecordNeeded(wal, page))
@@ -819,7 +813,18 @@ public abstract class PagesList extends DataStructure {
if (tails == null)
return null;
- return randomTail(tails);
+ int len = tails.length;
+ int init = randomInt(len);
+ int cur = init;
+
+ while (true) {
+ Stripe stripe = tails[cur];
+ if(!stripe.empty)
+ return stripe;
+
+ if((cur = (cur + 1) % len) == init)
+ return null;
+ }
}
/**
@@ -873,7 +878,7 @@ public abstract class PagesList extends DataStructure {
for (int lockAttempt = 0; ;) {
Stripe stripe = getPageForTake(bucket);
- if (stripe == null || stripe.empty)
+ if (stripe == null)
return 0L;
long tailId = stripe.tailId;
@@ -904,8 +909,7 @@ public abstract class PagesList extends DataStructure {
long pageId = io.takeAnyPage(tailPageAddr);
if (pageId != 0L) {
- if (trackBucketsSize)
- bucketsSize[bucket].decrement();
+ bucketsSize[bucket].decrement();
if (isWalDeltaRecordNeeded(wal, tail))
wal.log(new PagesListRemovePageRecord(cacheId, tailId, pageId));
@@ -965,8 +969,12 @@ public abstract class PagesList extends DataStructure {
ret = tailId;
}
- else
+ else {
stripe.empty = true;
+
+ if (bucketsSize[bucket].sum() > 0)
+ continue;
+ }
}
// If we do not have a previous page (we are at head), then we still can return
@@ -1026,8 +1034,7 @@ public abstract class PagesList extends DataStructure {
if (!rmvd)
return false;
- if (trackBucketsSize)
- bucketsSize[bucket].decrement();
+ bucketsSize[bucket].decrement();
if (isWalDeltaRecordNeeded(wal, page))
wal.log(new PagesListRemovePageRecord(cacheId, pageId, dataPageId));
http://git-wip-us.apache.org/repos/asf/ignite/blob/21d62829/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakLargeObjectsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakLargeObjectsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakLargeObjectsTest.java
index c1b1c9b..0fa9096 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakLargeObjectsTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakLargeObjectsTest.java
@@ -18,6 +18,7 @@
package org.apache.ignite.internal.processors.database;
import org.apache.ignite.IgniteCache;
+import org.apache.ignite.configuration.MemoryConfiguration;
import org.apache.ignite.internal.IgniteEx;
/**
@@ -35,6 +36,13 @@ public class IgniteDbMemoryLeakLargeObjectsTest extends IgniteDbMemoryLeakAbstra
}
/** {@inheritDoc} */
+ @Override protected void configure(MemoryConfiguration mCfg) {
+ super.configure(mCfg);
+
+ mCfg.setPageCacheSize(35840000); // The space for 35000 pages
+ }
+
+ /** {@inheritDoc} */
@Override protected IgniteCache<Object, Object> cache(IgniteEx ig) {
return ig.cache("large");
}
@@ -49,12 +57,8 @@ public class IgniteDbMemoryLeakLargeObjectsTest extends IgniteDbMemoryLeakAbstra
return new LargeDbValue("test-value-1-" + getRandom().nextInt(200), "test-value-2-" + getRandom().nextInt(200), ARRAY);
}
- @Override protected int warmUp() {
- return 600;
- }
-
/** {@inheritDoc} */
@Override protected long pagesMax() {
- return 2000000;
+ return 35000;
}
}