Repository: ignite Updated Branches: refs/heads/ignite-4154-opt2 db93ec4ba -> 6be7fd302
ignite-4154 Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6be7fd30 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6be7fd30 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6be7fd30 Branch: refs/heads/ignite-4154-opt2 Commit: 6be7fd302a5c425a41603dc4d14b4cb0ff322e5d Parents: db93ec4 Author: sboikov <[email protected]> Authored: Mon Nov 14 15:32:20 2016 +0300 Committer: sboikov <[email protected]> Committed: Mon Nov 14 15:32:20 2016 +0300 ---------------------------------------------------------------------- .../rendezvous/RendezvousAffinityFunction.java | 55 ++++++++++++++------ .../GridCachePartitionedAffinitySpreadTest.java | 7 ++- 2 files changed, 45 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/6be7fd30/modules/core/src/main/java/org/apache/ignite/cache/affinity/rendezvous/RendezvousAffinityFunction.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/cache/affinity/rendezvous/RendezvousAffinityFunction.java b/modules/core/src/main/java/org/apache/ignite/cache/affinity/rendezvous/RendezvousAffinityFunction.java index ec12973..f32aadd 100644 --- a/modules/core/src/main/java/org/apache/ignite/cache/affinity/rendezvous/RendezvousAffinityFunction.java +++ b/modules/core/src/main/java/org/apache/ignite/cache/affinity/rendezvous/RendezvousAffinityFunction.java @@ -17,7 +17,6 @@ package org.apache.ignite.cache.affinity.rendezvous; -import java.io.ByteArrayOutputStream; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; @@ -355,29 +354,43 @@ public class RendezvousAffinityFunction implements AffinityFunction, Externaliza /** * Returns collection of nodes (primary first) for specified partition. */ - public List<ClusterNode> assignPartition(int part, List<ClusterNode> nodes, int backups, + public List<ClusterNode> assignPartition(MessageDigest d, + int part, + List<ClusterNode> nodes, + Map<ClusterNode, byte[]> nodesHash, + int backups, @Nullable Map<UUID, Collection<ClusterNode>> neighborhoodCache) { if (nodes.size() <= 1) return nodes; - List<IgniteBiTuple<Long, ClusterNode>> lst = new ArrayList<>(); + if (d == null) + d = digest.get(); - MessageDigest d = digest.get(); + List<IgniteBiTuple<Long, ClusterNode>> lst = new ArrayList<>(nodes.size()); + + try { + for (int i = 0; i < nodes.size(); i++) { + ClusterNode node = nodes.get(i); - for (ClusterNode node : nodes) { - Object nodeHash = resolveNodeHash(node); + Object nodeHash = resolveNodeHash(node); - try { - ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] nodeHashBytes = nodesHash.get(node); + + if (nodeHashBytes == null) { + byte[] nodeHashBytes0 = U.marshal(ignite.configuration().getMarshaller(), nodeHash); + + nodeHashBytes = new byte[nodeHashBytes0.length + 4]; + + System.arraycopy(nodeHashBytes0, 0, nodeHashBytes, 4, nodeHashBytes0.length); - byte[] nodeHashBytes = U.marshal(ignite.configuration().getMarshaller(), nodeHash); + nodesHash.put(node, nodeHashBytes0); + } - out.write(U.intToBytes(part), 0, 4); // Avoid IOException. - out.write(nodeHashBytes, 0, nodeHashBytes.length); // Avoid IOException. + U.intToBytes(part, nodeHashBytes, 0); d.reset(); - byte[] bytes = d.digest(out.toByteArray()); + byte[] bytes = d.digest(nodeHashBytes); long hash = (bytes[0] & 0xFFL) @@ -391,9 +404,9 @@ public class RendezvousAffinityFunction implements AffinityFunction, Externaliza lst.add(F.t(hash, node)); } - catch (IgniteCheckedException e) { - throw new IgniteException(e); - } + } + catch (IgniteCheckedException e) { + throw new IgniteException(e); } Collections.sort(lst, COMPARATOR); @@ -474,8 +487,18 @@ public class RendezvousAffinityFunction implements AffinityFunction, Externaliza Map<UUID, Collection<ClusterNode>> neighborhoodCache = exclNeighbors ? GridCacheUtils.neighbors(affCtx.currentTopologySnapshot()) : null; + MessageDigest d = digest.get(); + + List<ClusterNode> nodes = affCtx.currentTopologySnapshot(); + + Map<ClusterNode, byte[]> nodesHash = U.newHashMap(nodes.size()); + for (int i = 0; i < parts; i++) { - List<ClusterNode> partAssignment = assignPartition(i, affCtx.currentTopologySnapshot(), affCtx.backups(), + List<ClusterNode> partAssignment = assignPartition(d, + i, + nodes, + nodesHash, + affCtx.backups(), neighborhoodCache); assignments.add(partAssignment); http://git-wip-us.apache.org/repos/asf/ignite/blob/6be7fd30/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCachePartitionedAffinitySpreadTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCachePartitionedAffinitySpreadTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCachePartitionedAffinitySpreadTest.java index a59ca8b..2d46cf4 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCachePartitionedAffinitySpreadTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCachePartitionedAffinitySpreadTest.java @@ -76,7 +76,12 @@ public class GridCachePartitionedAffinitySpreadTest extends GridCommonAbstractTe Map<ClusterNode, Integer> parts = new HashMap<>(nodes.size()); for (int part = 0; part < aff.getPartitions(); part++) { - Collection<ClusterNode> affNodes = aff.assignPartition(part, new ArrayList(nodes), 0, null); + Collection<ClusterNode> affNodes = aff.assignPartition(null, + part, + new ArrayList<>(nodes), + new HashMap<ClusterNode, byte[]>(), + 0, + null); assertEquals(1, affNodes.size());
