You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2008/12/16 22:11:54 UTC
svn commit: r727154 - in
/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver:
HRegion.java HRegionServer.java
Author: stack
Date: Tue Dec 16 13:11:54 2008
New Revision: 727154
URL: http://svn.apache.org/viewvc?rev=727154&view=rev
Log:
HBASE-900 Regionserver memory leak causing OOME during relatively modest bulk importing; part 3
Modified:
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=727154&r1=727153&r2=727154&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java Tue Dec 16 13:11:54 2008
@@ -839,13 +839,14 @@
long sequenceId = -1L;
long completeSequenceId = -1L;
this.updatesLock.writeLock().lock();
+ // Get current size of memcaches.
+ final long currentMemcacheSize = this.memcacheSize.get();
try {
for (HStore s: stores.values()) {
s.snapshot();
}
sequenceId = log.startCacheFlush();
completeSequenceId = this.getCompleteCacheFlushSequenceId(sequenceId);
- this.memcacheSize.set(0);
} finally {
this.updatesLock.writeLock().unlock();
}
@@ -865,6 +866,8 @@
compactionRequested = true;
}
}
+ // Set down the memcache size by amount of flush.
+ this.memcacheSize.addAndGet(-currentMemcacheSize);
} catch (Throwable t) {
// An exception here means that the snapshot was not persisted.
// The hlog needs to be replayed so its content is restored to memcache.
@@ -896,12 +899,12 @@
}
if (LOG.isDebugEnabled()) {
- String timeTaken = StringUtils.formatTimeDiff(System.currentTimeMillis(),
- startTime);
- LOG.debug("Finished memcache flush for region " + this +
- " in " +
- (System.currentTimeMillis() - startTime) + "ms, sequence id=" +
- sequenceId + ", compaction requested=" + compactionRequested);
+ long now = System.currentTimeMillis();
+ String timeTaken = StringUtils.formatTimeDiff(now, startTime);
+ LOG.debug("Finished memcache flush of ~" +
+ StringUtils.humanReadableInt(currentMemcacheSize) + " for region " +
+ this + " in " + (now - startTime) + "ms, sequence id=" + sequenceId +
+ ", compaction requested=" + compactionRequested);
if (!regionInfo.isMetaRegion()) {
this.historian.addRegionFlush(regionInfo, timeTaken);
}
@@ -1274,8 +1277,6 @@
/*
* Check if resources to support an update.
*
- * For now, just checks memcache saturation.
- *
* Here we synchronize on HRegion, a broad scoped lock. Its appropriate
* given we're figuring in here whether this region is able to take on
* writes. This is only method with a synchronize (at time of writing),
Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=727154&r1=727153&r2=727154&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Tue Dec 16 13:11:54 2008
@@ -847,7 +847,7 @@
for (Map.Entry<Integer, HRegion> e: this.onlineRegions.entrySet()) {
HRegion r = e.getValue();
memcacheSize += r.memcacheSize.get();
- synchronized(r.stores) {
+ synchronized (r.stores) {
stores += r.stores.size();
for(Map.Entry<Integer, HStore> ee: r.stores.entrySet()) {
HStore store = ee.getValue();