diff --git a/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java b/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java index 9cf2a65..034690e 100644 --- a/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java +++ b/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java @@ -1520,7 +1520,7 @@ public class HLog implements HConstants, Syncable { queue = new LinkedList(); splitLogsMap.put(region, queue); } - queue.addFirst(entry); + queue.addLast(entry); editsCount++; } LOG.debug("Pushed=" + editsCount + " entries from " + path); @@ -1552,11 +1552,7 @@ public class HLog implements HConstants, Syncable { try { int editsCount = 0; WriterAndPath wap = logWriters.get(region); - // We put edits onto the Stack ordered oldest sequence id to newest. - // Pop them off starting with the oldest. - for (ListIterator iterator = entries.listIterator(entries.size()); - iterator.hasPrevious();) { - Entry logEntry = iterator.previous(); + for (Entry logEntry: entries) { if (wap == null) { Path logFile = getRegionLogPath(logEntry, rootDir); if (fs.exists(logFile)) { diff --git a/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java b/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java index 9b2ffa7..86cf4ea 100644 --- a/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java +++ b/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java @@ -28,13 +28,10 @@ import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; -import java.util.LinkedList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; -import javax.naming.InsufficientResourcesException; - import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; @@ -42,13 +39,11 @@ import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.regionserver.HRegion; -import org.apache.hadoop.hbase.regionserver.wal.HLog; -import org.apache.hadoop.hbase.regionserver.wal.HLogKey; -import org.apache.hadoop.hbase.regionserver.wal.WALEdit; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Threads; import org.apache.hadoop.hdfs.MiniDFSCluster; @@ -161,7 +156,23 @@ public class TestHLogSplit { } } - //TODO: check the edits order is respected (scenarios) + + @Test + public void testSplitPreservesEdits() throws IOException{ + final String REGION = "region__1"; + regions.removeAll(regions); + regions.add(REGION); + + generateHLogs(1, 10, -1); + fs.initialize(fs.getUri(), conf); + HLog.splitLog(hbaseDir, hlogDir, oldLogDir, fs, conf); + + Path originalLog = (fs.listStatus(oldLogDir))[0].getPath(); + Path splitLog = getLogForRegion(hbaseDir, TABLE_NAME, REGION); + + assertEquals("edits differ after split", true, logsAreEqual(originalLog, splitLog)); + } + @Test public void testEmptyLogFiles() throws IOException { @@ -458,7 +469,7 @@ public class TestHLogSplit { public void testSplittingLargeNumberOfRegionsConsistency() throws IOException { regions.removeAll(regions); - for (int i=0; i<500; i++) { + for (int i=0; i<100; i++) { regions.add("region__"+i); } @@ -476,23 +487,11 @@ public class TestHLogSplit { fs.initialize(fs.getUri(), conf); HLog.splitLog(hbaseDir, hlogDir, oldLogDir, fs, conf); - FileStatus[] f1 = fs.listStatus(firstSplitPath); - FileStatus[] f2 = fs.listStatus(splitPath); + assertEquals(0, compareHLogSplitDirs(firstSplitPath, splitPath)); + } + - for (int i=0; i