diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 3959519..38d6695 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -2172,8 +2172,8 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi long trxId = 0; try { + writeEntry = mvcc.begin(); try { - writeEntry = mvcc.begin(); if (wal != null) { Long earliestUnflushedSequenceIdForTheRegion = wal.startCacheFlush(encodedRegionName, flushedFamilyNames); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.java index d101f7b..0779926 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.java @@ -26,6 +26,7 @@ import com.google.common.annotations.VisibleForTesting; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.ClassSize; +import org.mortbay.log.Log; /** * Manages the read/write consistency. This provides an interface for readers to determine what @@ -201,10 +202,16 @@ public class MultiVersionConcurrencyControl { */ void waitForRead(WriteEntry e) { boolean interrupted = false; + int count = 0; synchronized (readWaiters) { while (readPoint.get() < e.getWriteNumber()) { + if (count % 100 == 0 && count > 0) { + Log.warn("STUCK: readPoint=" + this.readPoint.get() + ", writeNumber=" + + e.getWriteNumber() + ", queueSize=" + this.writeQueue.size()); + } + count++; try { - readWaiters.wait(0); + readWaiters.wait(10); } catch (InterruptedException ie) { // We were interrupted... finish the loop -- i.e. cleanup --and then // on our way out, reset the interrupt flag. diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALUtil.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALUtil.java index 2718295..0b78eeb 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALUtil.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALUtil.java @@ -85,8 +85,12 @@ public class WALUtil { TableName tn = TableName.valueOf(f.getTableName().toByteArray()); // we use HLogKey here instead of WALKey directly to support legacy coprocessors. WALKey key = new HLogKey(info.getEncodedNameAsBytes(), tn, System.currentTimeMillis(), mvcc); - long trx = log.append(htd, info, key, WALEdit.createFlushWALEdit(info, f), false); - mvcc.complete(key.getWriteEntry()); + long trx; + try { + trx = log.append(htd, info, key, WALEdit.createFlushWALEdit(info, f), false); + } finally { + mvcc.complete(key.getWriteEntry()); + } if (sync) log.sync(trx); if (LOG.isTraceEnabled()) { LOG.trace("Appended flush marker " + TextFormat.shortDebugString(f));