You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mapreduce-commits@hadoop.apache.org by sc...@apache.org on 2011/03/02 22:48:30 UTC

svn commit: r1076411 - in /hadoop/mapreduce/trunk: ./ src/contrib/raid/src/java/org/apache/hadoop/raid/ src/contrib/raid/src/test/org/apache/hadoop/raid/

Author: schen
Date: Wed Mar  2 21:48:30 2011
New Revision: 1076411

URL: http://svn.apache.org/viewvc?rev=1076411&view=rev
Log:
MAPREDUCE-2302. Add static factory methods in GaloisField. (schen)

Modified:
    hadoop/mapreduce/trunk/CHANGES.txt
    hadoop/mapreduce/trunk/src/contrib/raid/src/java/org/apache/hadoop/raid/GaloisField.java
    hadoop/mapreduce/trunk/src/contrib/raid/src/java/org/apache/hadoop/raid/ReedSolomonCode.java
    hadoop/mapreduce/trunk/src/contrib/raid/src/test/org/apache/hadoop/raid/TestGaloisField.java

Modified: hadoop/mapreduce/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/trunk/CHANGES.txt?rev=1076411&r1=1076410&r2=1076411&view=diff
==============================================================================
--- hadoop/mapreduce/trunk/CHANGES.txt (original)
+++ hadoop/mapreduce/trunk/CHANGES.txt Wed Mar  2 21:48:30 2011
@@ -49,6 +49,8 @@ Trunk (unreleased changes)
     MAPREDUCE-993. bin/hadoop job -events <jobid> <from-event-#> <#-of-events>
     help message is confusing. (Harsh J Chouraria via tomwhite)
 
+    MAPREDUCE-2302. Add static factory methods in GaloisField. (schen)
+
   OPTIMIZATIONS
     
     MAPREDUCE-2026. Make JobTracker.getJobCounters() and

Modified: hadoop/mapreduce/trunk/src/contrib/raid/src/java/org/apache/hadoop/raid/GaloisField.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/trunk/src/contrib/raid/src/java/org/apache/hadoop/raid/GaloisField.java?rev=1076411&r1=1076410&r2=1076411&view=diff
==============================================================================
--- hadoop/mapreduce/trunk/src/contrib/raid/src/java/org/apache/hadoop/raid/GaloisField.java (original)
+++ hadoop/mapreduce/trunk/src/contrib/raid/src/java/org/apache/hadoop/raid/GaloisField.java Wed Mar  2 21:48:30 2011
@@ -18,6 +18,9 @@
 
 package org.apache.hadoop.raid;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * Implementation of Galois field arithmetics with 2^p elements.
  * The input must be unsigned integers.
@@ -34,15 +37,42 @@ public class GaloisField {
 
   // Field size 256 is good for byte based system
   private static final int DEFAULT_FIELD_SIZE = 256;
-  // primitive polynomial 1 + X + X^2 + X^4 + X^8
+  // primitive polynomial 1 + X^2 + X^3 + X^4 + X^8
   private static final int DEFAULT_PRIMITIVE_POLYNOMIAL = 285;
 
+  static private final Map<Integer, GaloisField> instances =
+    new HashMap<Integer, GaloisField>();
+
   /**
-   * An object can perform Galois field arithmetics
+   * Get the object performs Galois field arithmetics
    * @param fieldSize size of the field
    * @param primitivePolynomial a primitive polynomial corresponds to the size
    */
-  public GaloisField(int fieldSize, int primitivePolynomial) {
+  public static GaloisField getInstance(int fieldSize,
+      int primitivePolynomial) {
+    int key = ((fieldSize << 16) & 0xFFFF0000) + (primitivePolynomial & 0x0000FFFF);
+    GaloisField gf;
+    synchronized (instances) {
+      gf = instances.get(key);
+      if (gf == null) {
+        gf = new GaloisField(fieldSize, primitivePolynomial);
+        instances.put(key, gf);
+      }
+    }
+    return gf;
+  }
+
+  /**
+   * Get the object performs Galois field arithmetics with default setting
+   */
+  public static GaloisField getInstance() {
+    return getInstance(DEFAULT_FIELD_SIZE, DEFAULT_PRIMITIVE_POLYNOMIAL);
+  }
+
+  private GaloisField(int fieldSize, int primitivePolynomial) {
+    assert fieldSize > 0;
+    assert primitivePolynomial > 0;
+
     this.fieldSize = fieldSize;
     this.primitivePeriod = fieldSize - 1;
     this.primitivePolynomial = primitivePolynomial;
@@ -88,13 +118,6 @@ public class GaloisField {
   }
 
   /**
-   * An object can perform Galois field arithmetics
-   */
-  public GaloisField() {
-    this(DEFAULT_FIELD_SIZE, DEFAULT_PRIMITIVE_POLYNOMIAL);
-  }
-
-  /**
    * Return number of elements in the field
    * @return number of elements in the field
    */

Modified: hadoop/mapreduce/trunk/src/contrib/raid/src/java/org/apache/hadoop/raid/ReedSolomonCode.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/trunk/src/contrib/raid/src/java/org/apache/hadoop/raid/ReedSolomonCode.java?rev=1076411&r1=1076410&r2=1076411&view=diff
==============================================================================
--- hadoop/mapreduce/trunk/src/contrib/raid/src/java/org/apache/hadoop/raid/ReedSolomonCode.java (original)
+++ hadoop/mapreduce/trunk/src/contrib/raid/src/java/org/apache/hadoop/raid/ReedSolomonCode.java Wed Mar  2 21:48:30 2011
@@ -25,7 +25,7 @@ public class ReedSolomonCode implements 
   private final int[] generatingPolynomial;
   private final int PRIMITIVE_ROOT = 2;
   private final int[] primitivePower;
-  private final GaloisField GF = new GaloisField();
+  private final GaloisField GF = GaloisField.getInstance();
   private int[] errSignature;
   private final int[] paritySymbolLocations;
   private final int[] dataBuff;

Modified: hadoop/mapreduce/trunk/src/contrib/raid/src/test/org/apache/hadoop/raid/TestGaloisField.java
URL: http://svn.apache.org/viewvc/hadoop/mapreduce/trunk/src/contrib/raid/src/test/org/apache/hadoop/raid/TestGaloisField.java?rev=1076411&r1=1076410&r2=1076411&view=diff
==============================================================================
--- hadoop/mapreduce/trunk/src/contrib/raid/src/test/org/apache/hadoop/raid/TestGaloisField.java (original)
+++ hadoop/mapreduce/trunk/src/contrib/raid/src/test/org/apache/hadoop/raid/TestGaloisField.java Wed Mar  2 21:48:30 2011
@@ -27,7 +27,7 @@ public class TestGaloisField extends Tes
 
   final int TEST_TIMES = 10000;
   final Random RAND = new Random();
-  final static GaloisField GF = new GaloisField();
+  final static GaloisField GF = GaloisField.getInstance();
 
   private int randGF() {
     return 0x000000FF & RAND.nextInt(GF.getFieldSize());
@@ -40,6 +40,18 @@ public class TestGaloisField extends Tes
     return result;
   }
 
+  public void testGetInstance() {
+    GaloisField gf1 = GaloisField.getInstance(256, 285);
+    GaloisField gf2 = GaloisField.getInstance();
+    GaloisField gf3 = GaloisField.getInstance(128, 137);
+    GaloisField gf4 = GaloisField.getInstance(128, 137);
+    GaloisField gf5 = GaloisField.getInstance(512, 529);
+    GaloisField gf6 = GaloisField.getInstance(512, 529);
+    assertTrue(gf1 == gf2);
+    assertTrue(gf3 == gf4);
+    assertTrue(gf5 == gf6);
+  }
+
   public void testDistributivity() {
     for (int i = 0; i < TEST_TIMES; i++) {
       int a = RAND.nextInt(GF.getFieldSize());