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/08/01 10:37:40 UTC
[40/49] ignite git commit: IGNITE-5793 - Fixed infinite TTL expire on
cache gateway leave
IGNITE-5793 - Fixed infinite TTL expire on cache gateway leave
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/355e8e83
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/355e8e83
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/355e8e83
Branch: refs/heads/ignite-5578
Commit: 355e8e83d0efcc2fcaacc8edc977b82b39c14d4e
Parents: 6cff481
Author: Ivan Rakov <iv...@gmail.com>
Authored: Mon Jul 31 10:37:11 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Mon Jul 31 10:37:11 2017 +0300
----------------------------------------------------------------------
.../apache/ignite/IgniteSystemProperties.java | 6 +++++
.../processors/cache/GridCacheUtils.java | 7 +++++-
.../cache/IgniteCacheOffheapManagerImpl.java | 26 ++++++++++++--------
3 files changed, 28 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/355e8e83/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
index 264fb4b..2fa52b6 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
@@ -614,6 +614,12 @@ public final class IgniteSystemProperties {
public static final String IGNITE_REBALANCE_STATISTICS_TIME_INTERVAL = "IGNITE_REBALANCE_STATISTICS_TIME_INTERVAL";
/**
+ * When cache has entries with expired TTL, each user operation will also remove this amount of expired entries.
+ * Defaults to {@code 5}.
+ */
+ public static final String IGNITE_TTL_EXPIRE_BATCH_SIZE = "IGNITE_TTL_EXPIRE_BATCH_SIZE";
+
+ /**
* Indexing discovery history size. Protects from duplicate messages maintaining the list of IDs of recently
* arrived discovery messages.
* <p>
http://git-wip-us.apache.org/repos/asf/ignite/blob/355e8e83/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
index c93b224..a07b166 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
@@ -42,6 +42,7 @@ import org.apache.ignite.IgniteCache;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException;
import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.IgniteSystemProperties;
import org.apache.ignite.cache.CacheAtomicUpdateTimeoutException;
import org.apache.ignite.cache.CachePartialUpdateException;
import org.apache.ignite.cache.CacheServerNotFoundException;
@@ -107,6 +108,10 @@ public class GridCacheUtils {
/** Cheat cache ID for debugging and benchmarking purposes. */
public static final int cheatCacheId;
+ /** Each cache operation removes this amount of entries with expired TTL. */
+ private static final int TTL_BATCH_SIZE = IgniteSystemProperties.getInteger(
+ IgniteSystemProperties.IGNITE_TTL_EXPIRE_BATCH_SIZE, 5);
+
/*
*
*/
@@ -851,7 +856,7 @@ public class GridCacheUtils {
public static void unwindEvicts(GridCacheContext ctx) {
assert ctx != null;
- ctx.ttl().expire();
+ ctx.ttl().expire(TTL_BATCH_SIZE);
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/355e8e83/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
index 6d16b60..ba6c89d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
@@ -975,30 +975,35 @@ public class IgniteCacheOffheapManagerImpl implements IgniteCacheOffheapManager
assert !cctx.isNear() : cctx.name();
if (hasPendingEntries && pendingEntries != null) {
- cctx.shared().database().checkpointReadLock();
-
- try {
- GridCacheVersion obsoleteVer = null;
+ GridCacheVersion obsoleteVer = null;
- long now = U.currentTimeMillis();
+ long now = U.currentTimeMillis();
- GridCursor<PendingRow> cur;
+ GridCursor<PendingRow> cur;
if (grp.sharedGroup())
cur = pendingEntries.find(new PendingRow(cctx.cacheId()), new PendingRow(cctx.cacheId(), now, 0));
else
cur = pendingEntries.find(null, new PendingRow(UNDEFINED_CACHE_ID, now, 0));
- int cleared = 0;
+ if (!cur.next())
+ return false;
+
+ int cleared = 0;
- while (cur.next()) {
+ cctx.shared().database().checkpointReadLock();
+
+ try {
+ do {
PendingRow row = cur.get();
if (amount != -1 && cleared > amount)
return true;
- if (row.key.partition() == -1)
- row.key.partition(cctx.affinity().partition(row.key));assert row.key != null && row.link != 0 && row.expireTime != 0 : row;
+ if (row.key.partition() == -1)
+ row.key.partition(cctx.affinity().partition(row.key));
+
+ assert row.key != null && row.link != 0 && row.expireTime != 0 : row;
if (pendingEntries.removex(row)) {
if (obsoleteVer == null)
@@ -1009,6 +1014,7 @@ public class IgniteCacheOffheapManagerImpl implements IgniteCacheOffheapManager
cleared++;
}
+ while (cur.next());
}
finally {
cctx.shared().database().checkpointReadUnlock();