Author: brandonwilliams Date: Fri Nov 4 21:23:25 2011 New Revision: 1197786
URL: http://svn.apache.org/viewvc?rev=1197786&view=rev Log: Fix empty row filtering and check if there are no rows returned. Patch by Lanny Ripple, reviewed by brandonwilliams for CASSANDRA-3450 Modified: cassandra/branches/cassandra-0.8/CHANGES.txt cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java Modified: cassandra/branches/cassandra-0.8/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/CHANGES.txt?rev=1197786&r1=1197785&r2=1197786&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/CHANGES.txt (original) +++ cassandra/branches/cassandra-0.8/CHANGES.txt Fri Nov 4 21:23:25 2011 @@ -37,7 +37,7 @@ * CFMetaData.convertToThrift method to set RowCacheProvider (CASSANDRA-3405) * acquire compactionlock during truncate (CASSANDRA-3399) * fix displaying cfdef entries for super columnfamilies (CASSANDRA-3415) - + * (Hadoop) Fix empty row filtering (CASSANDRA-3450) 0.8.7 * Kill server on wrapped OOME such as from FileChannel.map (CASSANDRA-3201) Modified: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java?rev=1197786&r1=1197785&r2=1197786&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java (original) +++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordReader.java Fri Nov 4 21:23:25 2011 @@ -235,50 +235,55 @@ public class ColumnFamilyRecordReader ex { startToken = split.getStartToken(); } - else if (startToken.equals(split.getEndToken())) - { - rows = null; - return; - } - - KeyRange keyRange = new KeyRange(batchRowCount) - .setStart_token(startToken) - .setEnd_token(split.getEndToken()); - try - { - rows = client.get_range_slices(new ColumnParent(cfName), - predicate, - keyRange, - consistencyLevel); - - // nothing new? reached the end - if (rows.isEmpty()) + + // The removal of empty CF rows could result in an empty List<KeySlice> rows. + // Keep trying until we return on reaching the end of the range or rows is nonEmpty. + while (rows == null || rows.isEmpty()) { + if (startToken.equals(split.getEndToken())) { rows = null; return; } - // Pre-compute the last row key, before removing empty rows - ByteBuffer lastRowKey = rows.get(rows.size() - 1).key; + KeyRange keyRange = new KeyRange(batchRowCount) + .setStart_token(startToken) + .setEnd_token(split.getEndToken()); + try + { + rows = client.get_range_slices(new ColumnParent(cfName), + predicate, + keyRange, + consistencyLevel); + + // nothing new? reached the end + if (rows.isEmpty()) + { + rows = null; + return; + } + + // Pre-compute the last row key, before removing empty rows + ByteBuffer lastRowKey = rows.get(rows.size() - 1).key; + + // only remove empty rows if the slice predicate is empty + if (isPredicateEmpty(predicate)) + { + Iterator<KeySlice> rowsIterator = rows.iterator(); + while (rowsIterator.hasNext()) + if (rowsIterator.next().columns.isEmpty()) + rowsIterator.remove(); + } + + // reset to iterate through the new batch + i = 0; - // only remove empty rows if the slice predicate is empty - if (isPredicateEmpty(predicate)) + // prepare for the next slice to be read + startToken = partitioner.getTokenFactory().toString(partitioner.getToken(lastRowKey)); + } + catch (Exception e) { - Iterator<KeySlice> rowsIterator = rows.iterator(); - while (rowsIterator.hasNext()) - if (rowsIterator.next().columns.isEmpty()) - rowsIterator.remove(); + throw new RuntimeException(e); } - - // reset to iterate through the new batch - i = 0; - - // prepare for the next slice to be read - startToken = partitioner.getTokenFactory().toString(partitioner.getToken(lastRowKey)); - } - catch (Exception e) - { - throw new RuntimeException(e); } } @@ -354,8 +359,10 @@ public class ColumnFamilyRecordReader ex { if (predicate != null) if (predicate.isSetSlice_range()) - if (predicate.getSlice_range().getStart() != null && predicate.getSlice_range().getFinish() != null) + { + if (predicate.getSlice_range().getStart() != null || predicate.getSlice_range().getFinish() != null) return false; + } else if (predicate.isSetColumn_names()) return false;
