Repository: ignite Updated Branches: refs/heads/ignite-2.0 d20f4588f -> 6cc43cae9
Replaced partsToEvict from queue to map to do not add the same partition several times. Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/d1f637f7 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/d1f637f7 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/d1f637f7 Branch: refs/heads/ignite-2.0 Commit: d1f637f799c307b34ddabd7abb8d2f0dcf9d73b3 Parents: a826c61 Author: sboikov <sboi...@gridgain.com> Authored: Thu Apr 20 18:35:12 2017 +0300 Committer: sboikov <sboi...@gridgain.com> Committed: Thu Apr 20 18:35:12 2017 +0300 ---------------------------------------------------------------------- .../dht/preloader/GridDhtPreloader.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/d1f637f7/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java index 517f04a..9f1b96e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReadWriteLock; @@ -106,7 +107,7 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter { private final ReadWriteLock demandLock = new ReentrantReadWriteLock(); /** */ - private final ConcurrentLinkedDeque8<GridDhtLocalPartition> partsToEvict = new ConcurrentLinkedDeque8<>(); + private final ConcurrentHashMap<Integer, GridDhtLocalPartition> partsToEvict = new ConcurrentHashMap<>(); /** */ private final AtomicInteger partsEvictOwning = new AtomicInteger(); @@ -774,28 +775,28 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter { /** {@inheritDoc} */ @Override public void evictPartitionAsync(GridDhtLocalPartition part) { - partsToEvict.add(part); + partsToEvict.putIfAbsent(part.id(), part); if (partsEvictOwning.get() == 0 && partsEvictOwning.compareAndSet(0, 1)) { cctx.closures().callLocalSafe(new GPC<Boolean>() { @Override public Boolean call() { boolean locked = true; - while (locked || !partsToEvict.isEmptyx()) { + while (locked || !partsToEvict.isEmpty()) { if (!locked && !partsEvictOwning.compareAndSet(0, 1)) return false; try { - GridDhtLocalPartition part = partsToEvict.poll(); - - if (part != null) + for (GridDhtLocalPartition part : partsToEvict.values()) { try { + partsToEvict.remove(part.id()); + part.tryEvict(); GridDhtPartitionState state = part.state(); if (state == RENTING || ((state == MOVING || state == OWNING) && part.shouldBeRenting())) - partsToEvict.push(part); + partsToEvict.put(part.id(), part); } catch (Throwable ex) { if (cctx.kernalContext().isStopping()) { @@ -810,9 +811,10 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter { else LT.error(log, ex, "Partition eviction failed, this can cause grid hang."); } + } } finally { - if (!partsToEvict.isEmptyx()) + if (!partsToEvict.isEmpty()) locked = true; else { boolean res = partsEvictOwning.compareAndSet(1, 0);