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;
