diff --git a/src/java/org/apache/hadoop/hbase/regionserver/MinorCompactingStoreScanner.java b/src/java/org/apache/hadoop/hbase/regionserver/MinorCompactingStoreScanner.java index 24f960a..7572794 100644 --- a/src/java/org/apache/hadoop/hbase/regionserver/MinorCompactingStoreScanner.java +++ b/src/java/org/apache/hadoop/hbase/regionserver/MinorCompactingStoreScanner.java @@ -22,6 +22,7 @@ package org.apache.hadoop.hbase.regionserver; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.io.hfile.HFile; import org.apache.hadoop.hbase.util.Bytes; import java.util.List; @@ -82,6 +83,17 @@ public class MinorCompactingStoreScanner implements KeyValueScanner, InternalSca throw new UnsupportedOperationException("Can't seek a MinorCompactingStoreScanner"); } + public boolean next(HFile.Writer writer) throws IOException { + KeyValue peeked = heap.peek(); + if (peeked == null) { + close(); + return false; + } + + writer.append(heap.next()); + return true; + } + @Override public boolean next(List results) throws IOException { KeyValue peeked = heap.peek(); diff --git a/src/java/org/apache/hadoop/hbase/regionserver/Store.java b/src/java/org/apache/hadoop/hbase/regionserver/Store.java index 9f89a9a..4fa22c7 100644 --- a/src/java/org/apache/hadoop/hbase/regionserver/Store.java +++ b/src/java/org/apache/hadoop/hbase/regionserver/Store.java @@ -834,30 +834,35 @@ public class Store implements HConstants { scanners[i] = new StoreFileScanner(filesToCompact.get(i).getReader().getScanner()); } - InternalScanner scanner; if (majorCompaction) { Scan scan = new Scan(); scan.setMaxVersions(family.getMaxVersions()); // TODO pass in the scanners/store files. - scanner = new StoreScanner(this, scan, null); + InternalScanner scanner = new StoreScanner(this, scan, null); + + // since scanner.next() can return 'false' but still be delivering data, + // we have to use a do/while loop. + ArrayList row = new ArrayList(); + boolean more = true; + while ( more ) { + more = scanner.next(row); + // output to writer: + for (KeyValue kv : row) { + writer.append(kv); + } + row.clear(); + } + + scanner.close(); + } else { - scanner = new MinorCompactingStoreScanner(this, scanners); - } + MinorCompactingStoreScanner scanner = new MinorCompactingStoreScanner(this, scanners); - // since scanner.next() can return 'false' but still be delivering data, - // we have to use a do/while loop. - ArrayList row = new ArrayList(); - boolean more = true; - while ( more ) { - more = scanner.next(row); - // output to writer: - for (KeyValue kv : row) { - writer.append(kv); - } - row.clear(); + while ( scanner.next(writer) ) { } + + scanner.close(); } - scanner.close(); } /*