You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2018/10/17 17:04:23 UTC
ignite git commit: IGNITE-9756 Fixed partition eviction deduplication
logic - Fixes #4936.
Repository: ignite
Updated Branches:
refs/heads/master 03cac751c -> aec3f91c2
IGNITE-9756 Fixed partition eviction deduplication logic - Fixes #4936.
Signed-off-by: Alexey Goncharuk <al...@gmail.com>
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/aec3f91c
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/aec3f91c
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/aec3f91c
Branch: refs/heads/master
Commit: aec3f91c22c26d3ceb56769d6d7a13a92c9036d4
Parents: 03cac75
Author: pereslegin-pa <xx...@gmail.com>
Authored: Wed Oct 17 19:58:29 2018 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Wed Oct 17 19:58:29 2018 +0300
----------------------------------------------------------------------
.../dht/topology/PartitionsEvictManager.java | 49 ++++++++------------
1 file changed, 20 insertions(+), 29 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/aec3f91c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/PartitionsEvictManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/PartitionsEvictManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/PartitionsEvictManager.java
index 7f2a2a7..404e194 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/PartitionsEvictManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/PartitionsEvictManager.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.processors.cache.distributed.dht.topology;
import java.util.Collection;
import java.util.Comparator;
+import java.util.HashSet;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
@@ -31,7 +32,6 @@ import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.managers.communication.GridIoPolicy;
import org.apache.ignite.internal.processors.cache.CacheGroupContext;
import org.apache.ignite.internal.processors.cache.GridCacheSharedManagerAdapter;
-import org.apache.ignite.internal.util.GridConcurrentHashSet;
import org.apache.ignite.internal.util.future.GridFutureAdapter;
import org.apache.ignite.internal.util.typedef.internal.LT;
import org.apache.ignite.internal.util.typedef.internal.U;
@@ -111,28 +111,28 @@ public class PartitionsEvictManager extends GridCacheSharedManagerAdapter {
* @param part Partition to evict.
*/
public void evictPartitionAsync(CacheGroupContext grp, GridDhtLocalPartition part) {
- // Check node stop.
- if (sharedEvictionContext.shouldStop())
- return;
-
GroupEvictionContext groupEvictionContext = evictionGroupsMap.computeIfAbsent(
grp.groupId(), (k) -> new GroupEvictionContext(grp));
- PartitionEvictionTask evictionTask = groupEvictionContext.createEvictPartitionTask(part);
-
- if (evictionTask == null)
+ // Check node stop.
+ if (groupEvictionContext.shouldStop())
return;
- if (log.isDebugEnabled())
- log.debug("Partition has been scheduled for eviction [grp=" + grp.cacheOrGroupName()
- + ", p=" + part.id() + ", state=" + part.state() + "]");
-
int bucket;
synchronized (mux) {
- bucket = evictionQueue.offer(evictionTask);
+ if (!groupEvictionContext.partIds.add(part.id()))
+ return;
+
+ bucket = evictionQueue.offer(new PartitionEvictionTask(part, groupEvictionContext));
}
+ groupEvictionContext.totalTasks.incrementAndGet();
+
+ if (log.isDebugEnabled())
+ log.debug("Partition has been scheduled for eviction [grp=" + grp.cacheOrGroupName()
+ + ", p=" + part.id() + ", state=" + part.state() + "]");
+
scheduleNextPartitionEviction(bucket);
}
@@ -271,7 +271,7 @@ public class PartitionsEvictManager extends GridCacheSharedManagerAdapter {
private final CacheGroupContext grp;
/** Deduplicate set partition ids. */
- private final Set<Integer> partIds = new GridConcurrentHashSet<>();
+ private final Set<Integer> partIds = new HashSet<>();
/** Future for currently running partition eviction task. */
private final Map<Integer, IgniteInternalFuture<?>> partsEvictFutures = new ConcurrentHashMap<>();
@@ -299,19 +299,6 @@ public class PartitionsEvictManager extends GridCacheSharedManagerAdapter {
/**
*
- * @param part Grid local partition.
- */
- private PartitionEvictionTask createEvictPartitionTask(GridDhtLocalPartition part){
- if (shouldStop() || !partIds.add(part.id()))
- return null;
-
- totalTasks.incrementAndGet();
-
- return new PartitionEvictionTask(part, this);
- }
-
- /**
- *
* @param task Partition eviction task.
*/
private synchronized void taskScheduled(PartitionEvictionTask task) {
@@ -324,6 +311,8 @@ public class PartitionsEvictManager extends GridCacheSharedManagerAdapter {
int partId = task.part.id();
+ partIds.remove(partId);
+
partsEvictFutures.put(partId, fut);
fut.listen(f -> {
@@ -429,12 +418,14 @@ public class PartitionsEvictManager extends GridCacheSharedManagerAdapter {
if (part.state() == GridDhtPartitionState.EVICTED && part.markForDestroy())
part.destroy();
}
- else // Re-offer partition if clear was unsuccessful due to partition reservation.
- evictionQueue.offer(this);
// Complete eviction future before schedule new to prevent deadlock with
// simultaneous eviction stopping and scheduling new eviction.
finishFut.onDone();
+
+ // Re-offer partition if clear was unsuccessful due to partition reservation.
+ if (!success)
+ evictPartitionAsync(groupEvictionCtx.grp, part);
}
catch (Throwable ex) {
finishFut.onDone(ex);