fix progress counting in wide row iterator
patch by Piotr Koalczkowski; reviewed by jbellis for CASSANDRA-4803


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/0bb3a064
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/0bb3a064
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/0bb3a064

Branch: refs/heads/trunk
Commit: 0bb3a064f3dd34823145124360c049f5d29b91ad
Parents: 72dcc29
Author: Jonathan Ellis <[email protected]>
Authored: Fri Oct 19 17:59:09 2012 -0500
Committer: Jonathan Ellis <[email protected]>
Committed: Fri Oct 19 18:00:25 2012 -0500

----------------------------------------------------------------------
 .../cassandra/hadoop/ColumnFamilyRecordReader.java |   23 +++++++++++++-
 1 files changed, 21 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/0bb3a064/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java 
b/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java
index fc90e5c..73f9786 100644
--- a/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java
+++ b/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java
@@ -106,7 +106,9 @@ public class ColumnFamilyRecordReader extends 
RecordReader<ByteBuffer, SortedMap
 
     public float getProgress()
     {
-        // TODO this is totally broken for wide rows
+        if (!iter.hasNext())
+            return 1.0F;
+
         // the progress is likely to be reported slightly off the actual but 
close enough
         float progress = ((float) iter.rowsRead() / totalRowCount);
         return progress > 1.0F ? 1.0F : progress;
@@ -423,6 +425,7 @@ public class ColumnFamilyRecordReader extends 
RecordReader<ByteBuffer, SortedMap
     {
         private PeekingIterator<Pair<ByteBuffer, SortedMap<ByteBuffer, 
IColumn>>> wideColumns;
         private ByteBuffer lastColumn = ByteBufferUtil.EMPTY_BYTE_BUFFER;
+        private ByteBuffer lastCountedKey = ByteBufferUtil.EMPTY_BYTE_BUFFER;
 
         private void maybeInit()
         {
@@ -476,12 +479,28 @@ public class ColumnFamilyRecordReader extends 
RecordReader<ByteBuffer, SortedMap
             if (rows == null)
                 return endOfData();
 
-            totalRead++;
             Pair<ByteBuffer, SortedMap<ByteBuffer, IColumn>> next = 
wideColumns.next();
             lastColumn = next.right.values().iterator().next().name();
+
+            maybeCountRow(next);
             return next;
         }
 
+
+        /**
+         * Increases the row counter only if we really moved to the next row.
+         * @param next just fetched row slice
+         */
+        private void maybeCountRow(Pair<ByteBuffer, SortedMap<ByteBuffer, 
IColumn>> next)
+        {
+            ByteBuffer currentKey = next.left;
+            if (!currentKey.equals(lastCountedKey))
+            {
+                totalRead++;
+                lastCountedKey = currentKey;
+            }
+        }
+
         private class WideColumnIterator extends 
AbstractIterator<Pair<ByteBuffer, SortedMap<ByteBuffer, IColumn>>>
         {
             private final Iterator<KeySlice> rows;

Reply via email to