Author: maja
Date: Thu Nov 29 23:59:10 2012
New Revision: 1415464
URL: http://svn.apache.org/viewvc?rev=1415464&view=rev
Log:
GIRAPH-424: Fix hashCode modulo computation
Modified:
giraph/trunk/CHANGELOG
giraph/trunk/giraph/src/main/java/org/apache/giraph/comm/aggregators/AggregatorUtils.java
giraph/trunk/giraph/src/main/java/org/apache/giraph/graph/InputSplitPathOrganizer.java
giraph/trunk/giraph/src/main/java/org/apache/giraph/graph/partition/HashRangeWorkerPartitioner.java
giraph/trunk/giraph/src/main/java/org/apache/giraph/graph/partition/HashWorkerPartitioner.java
Modified: giraph/trunk/CHANGELOG
URL:
http://svn.apache.org/viewvc/giraph/trunk/CHANGELOG?rev=1415464&r1=1415463&r2=1415464&view=diff
==============================================================================
--- giraph/trunk/CHANGELOG (original)
+++ giraph/trunk/CHANGELOG Thu Nov 29 23:59:10 2012
@@ -1,6 +1,8 @@
Giraph Change Log
Release 0.2.0 - unreleased
+ GIRAPH-424: Fix hashCode modulo computation (majakabiljo)
+
GIRAPH-396: HcatalogVertexInputFormat outputs a bit too often. (aching)
GIRAPH-435: Serialize server messages for memory and less GC. (aching)
Modified:
giraph/trunk/giraph/src/main/java/org/apache/giraph/comm/aggregators/AggregatorUtils.java
URL:
http://svn.apache.org/viewvc/giraph/trunk/giraph/src/main/java/org/apache/giraph/comm/aggregators/AggregatorUtils.java?rev=1415464&r1=1415463&r2=1415464&view=diff
==============================================================================
---
giraph/trunk/giraph/src/main/java/org/apache/giraph/comm/aggregators/AggregatorUtils.java
(original)
+++
giraph/trunk/giraph/src/main/java/org/apache/giraph/comm/aggregators/AggregatorUtils.java
Thu Nov 29 23:59:10 2012
@@ -102,7 +102,7 @@ public class AggregatorUtils {
*/
public static WorkerInfo getOwner(String aggregatorName,
List<WorkerInfo> workers) {
- int index = Math.abs(aggregatorName.hashCode()) % workers.size();
+ int index = Math.abs(aggregatorName.hashCode() % workers.size());
return workers.get(index);
}
Modified:
giraph/trunk/giraph/src/main/java/org/apache/giraph/graph/InputSplitPathOrganizer.java
URL:
http://svn.apache.org/viewvc/giraph/trunk/giraph/src/main/java/org/apache/giraph/graph/InputSplitPathOrganizer.java?rev=1415464&r1=1415463&r2=1415464&view=diff
==============================================================================
---
giraph/trunk/giraph/src/main/java/org/apache/giraph/graph/InputSplitPathOrganizer.java
(original)
+++
giraph/trunk/giraph/src/main/java/org/apache/giraph/graph/InputSplitPathOrganizer.java
Thu Nov 29 23:59:10 2012
@@ -119,8 +119,7 @@ public class InputSplitPathOrganizer imp
// and place the local blocks into the list at that index, if any
final int temp = hostName.hashCode() + (19 * port);
if (pathList.size() != 0) {
- baseOffset =
- Math.abs(temp == Integer.MIN_VALUE ? 0 : temp) % pathList.size();
+ baseOffset = Math.abs(temp % pathList.size());
}
// re-insert local paths at "adjusted index zero" for caller to iterate on
pathList.addAll(baseOffset, sortedList);
Modified:
giraph/trunk/giraph/src/main/java/org/apache/giraph/graph/partition/HashRangeWorkerPartitioner.java
URL:
http://svn.apache.org/viewvc/giraph/trunk/giraph/src/main/java/org/apache/giraph/graph/partition/HashRangeWorkerPartitioner.java?rev=1415464&r1=1415463&r2=1415464&view=diff
==============================================================================
---
giraph/trunk/giraph/src/main/java/org/apache/giraph/graph/partition/HashRangeWorkerPartitioner.java
(original)
+++
giraph/trunk/giraph/src/main/java/org/apache/giraph/graph/partition/HashRangeWorkerPartitioner.java
Thu Nov 29 23:59:10 2012
@@ -21,6 +21,8 @@ package org.apache.giraph.graph.partitio
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;
+import com.google.common.primitives.UnsignedInts;
+
/**
* Implements range-based partitioning from the id hash code.
*
@@ -33,10 +35,16 @@ import org.apache.hadoop.io.WritableComp
public class HashRangeWorkerPartitioner<I extends WritableComparable,
V extends Writable, E extends Writable, M extends Writable>
extends HashWorkerPartitioner<I, V, E, M> {
+ /** A transformed hashCode() must be strictly smaller than this. */
+ private static final long HASH_LIMIT = 2L * Integer.MAX_VALUE + 2L;
+
@Override
public PartitionOwner getPartitionOwner(I vertexId) {
- int rangeSize = Integer.MAX_VALUE / getPartitionOwners().size();
- int index = Math.abs(vertexId.hashCode()) / rangeSize;
+ long unsignedHashCode = UnsignedInts.toLong(vertexId.hashCode());
+ // The reader can verify that unsignedHashCode of HASH_LIMIT - 1 yields
+ // index of size - 1, and unsignedHashCode of 0 yields index of 0.
+ int index = (int)
+ ((unsignedHashCode * getPartitionOwners().size()) / HASH_LIMIT);
return partitionOwnerList.get(index);
}
}
Modified:
giraph/trunk/giraph/src/main/java/org/apache/giraph/graph/partition/HashWorkerPartitioner.java
URL:
http://svn.apache.org/viewvc/giraph/trunk/giraph/src/main/java/org/apache/giraph/graph/partition/HashWorkerPartitioner.java?rev=1415464&r1=1415463&r2=1415464&view=diff
==============================================================================
---
giraph/trunk/giraph/src/main/java/org/apache/giraph/graph/partition/HashWorkerPartitioner.java
(original)
+++
giraph/trunk/giraph/src/main/java/org/apache/giraph/graph/partition/HashWorkerPartitioner.java
Thu Nov 29 23:59:10 2012
@@ -57,8 +57,8 @@ public class HashWorkerPartitioner<I ext
@Override
public PartitionOwner getPartitionOwner(I vertexId) {
- return partitionOwnerList.get(Math.abs(vertexId.hashCode()) %
- partitionOwnerList.size());
+ return partitionOwnerList.get(
+ Math.abs(vertexId.hashCode() % partitionOwnerList.size()));
}
@Override