diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 2e377b0..a2cd44b 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -2269,16 +2269,8 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi long trxId = 0; try { try { + mvcc.waitForPreviousTransactionsComplete(); writeEntry = mvcc.beginMemstoreInsert(); - // wait for all in-progress transactions to commit to WAL before - // we can start the flush. This prevents - // uncommitted transactions from being written into HFiles. - // We have to block before we start the flush, otherwise keys that - // were removed via a rollbackMemstore could be written to Hfiles. - mvcc.waitForPreviousTransactionsComplete(writeEntry); - // set w to null to prevent mvcc.advanceMemstore from being called again inside finally block - writeEntry = null; - if (wal != null) { Long earliestUnflushedSequenceIdForTheRegion = wal.startCacheFlush(encodedRegionName, flushedFamilyNames); @@ -2355,6 +2347,16 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi throw ioe; } } + + // wait for all in-progress transactions to commit to WAL before + // we can start the flush. This prevents + // uncommitted transactions from being written into HFiles. + // We have to block before we start the flush, otherwise keys that + // were removed via a rollbackMemstore could be written to Hfiles. + writeEntry.setWriteNumber(flushOpSeqId); + mvcc.waitForPreviousTransactionsComplete(writeEntry); + // set w to null to prevent mvcc.advanceMemstore from being called again inside finally block + writeEntry = null; } finally { if (writeEntry != null) { // in case of failure just mark current writeEntry as complete