IGNITE-9661 Improved performance of partition state validation during PME - Fixes #4850.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/ad6416ca Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/ad6416ca Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/ad6416ca Branch: refs/heads/ignite-2.7-master Commit: ad6416ca4905d0d0bd032c636dca55eee497fbdb Parents: a35dac2 Author: Pavel Kovalenko <jokse...@gmail.com> Authored: Thu Oct 4 12:46:54 2018 +0300 Committer: Alexey Goncharuk <alexey.goncha...@gmail.com> Committed: Thu Oct 4 12:48:01 2018 +0300 ---------------------------------------------------------------------- .../GridDhtPartitionsStateValidator.java | 31 ++++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/ad6416ca/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionsStateValidator.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionsStateValidator.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionsStateValidator.java index d131d56..544d453 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionsStateValidator.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionsStateValidator.java @@ -119,7 +119,9 @@ public class GridDhtPartitionsStateValidator { Set<Integer> ignore = null; - for (int p = 0; p < top.partitions(); p++) { + for (int i = 0; i < countersMap.size(); i++) { + int p = countersMap.partitionAt(i); + if (top.partitionState(nodeId, p) != GridDhtPartitionState.OWNING) { if (ignore == null) ignore = new HashSet<>(); @@ -129,9 +131,8 @@ public class GridDhtPartitionsStateValidator { continue; } - int partIdx = countersMap.partitionIndex(p); - long updateCounter = partIdx >= 0 ? countersMap.updateCounterAt(partIdx) : 0; - long size = sizesMap.containsKey(p) ? sizesMap.get(p) : 0; + long updateCounter = countersMap.updateCounterAt(i); + long size = sizesMap.getOrDefault(p, 0L); // Do not validate partitions with zero update counter and size. if (updateCounter == 0 && size == 0) { @@ -186,14 +187,15 @@ public class GridDhtPartitionsStateValidator { Set<Integer> ignorePartitions = shouldIgnore(top, nodeId, e.getValue()); - for (int part = 0; part < partitions; part++) { - if (ignorePartitions != null && ignorePartitions.contains(part)) + for (int i = 0; i < countersMap.size(); i++) { + int p = countersMap.partitionAt(i); + + if (ignorePartitions != null && ignorePartitions.contains(p)) continue; - int partIdx = countersMap.partitionIndex(part); - long currentCounter = partIdx >= 0 ? countersMap.updateCounterAt(partIdx) : 0; + long currentCounter = countersMap.updateCounterAt(i); - process(invalidPartitions, updateCountersAndNodesByPartitions, part, nodeId, currentCounter); + process(invalidPartitions, updateCountersAndNodesByPartitions, p, nodeId, currentCounter); } } @@ -237,17 +239,20 @@ public class GridDhtPartitionsStateValidator { if (ignoringNodes.contains(nodeId)) continue; + CachePartitionPartialCountersMap countersMap = e.getValue().partitionUpdateCounters(top.groupId(), partitions); Map<Integer, Long> sizesMap = e.getValue().partitionSizes(top.groupId()); Set<Integer> ignorePartitions = shouldIgnore(top, nodeId, e.getValue()); - for (int part = 0; part < partitions; part++) { - if (ignorePartitions != null && ignorePartitions.contains(part)) + for (int i = 0; i < countersMap.size(); i++) { + int p = countersMap.partitionAt(i); + + if (ignorePartitions != null && ignorePartitions.contains(p)) continue; - long currentSize = sizesMap.containsKey(part) ? sizesMap.get(part) : 0L; + long currentSize = sizesMap.getOrDefault(p, 0L); - process(invalidPartitions, sizesAndNodesByPartitions, part, nodeId, currentSize); + process(invalidPartitions, sizesAndNodesByPartitions, p, nodeId, currentSize); } }