You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mrunit.apache.org by es...@apache.org on 2011/05/27 02:20:26 UTC

svn commit: r1128128 - /incubator/mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/mock/MockReduceContextWrapper.java

Author: esammer
Date: Fri May 27 00:20:26 2011
New Revision: 1128128

URL: http://svn.apache.org/viewvc?rev=1128128&view=rev
Log:
MRUNIT-9: Fix failing testDoubleIteration test

Modified:
    incubator/mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/mock/MockReduceContextWrapper.java

Modified: incubator/mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/mock/MockReduceContextWrapper.java
URL: http://svn.apache.org/viewvc/incubator/mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/mock/MockReduceContextWrapper.java?rev=1128128&r1=1128127&r2=1128128&view=diff
==============================================================================
--- incubator/mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/mock/MockReduceContextWrapper.java (original)
+++ incubator/mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/mock/MockReduceContextWrapper.java Fri May 27 00:20:26 2011
@@ -83,13 +83,26 @@ public class MockReduceContextWrapper<KE
     private class InspectableIterable implements Iterable<VALUEIN> {
       private Iterable<VALUEIN> base;
       private VALUEIN lastVal;
+      private boolean used;
 
       public InspectableIterable(final Iterable<VALUEIN> baseCollection) {
         this.base = baseCollection;
+        this.used = false;
       }
 
       public Iterator<VALUEIN> iterator() {
-        return new InspectableIterator(this.base.iterator());
+        /*
+         * The iterator() method is called by the runtime to get an iterator
+         * over an Iteratable. If we always returned a new InspectableIterator,
+         * successive for each loops would pass over the data multiple times
+         * which is not Hadoop's normal behavior.
+         */
+        if (used) {
+          return new NullIterator();
+        } else {
+          used = true;
+          return new InspectableIterator(this.base.iterator());
+        }
       }
 
       public VALUEIN getLastVal() {
@@ -119,6 +132,27 @@ public class MockReduceContextWrapper<KE
       }
     }
 
+    /*
+     * An iterator implementation that never returns data. This is to preserve
+     * Hadoop's behavior where iterating over the same reducer data more than
+     * once yields no data.
+     */
+    private class NullIterator extends
+        ReduceContext<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.ValueIterator implements
+        Iterator<VALUEIN> {
+
+      public VALUEIN next() {
+        return null;
+      }
+
+      public boolean hasNext() {
+        return false;
+      }
+
+      public void remove() {
+      }
+    }
+
     @Override
     public boolean nextKey() {
       if (inputIter.hasNext()) {