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


Reply via email to