HBASE-790 During import, single region blocks requests for >10 minutes, thread dumps, throws out pending requests, and continues
git-svn-id: https://svn.apache.org/repos/asf/hadoop/hbase/trunk@682874 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
13d0f9c527
commit
942c54cf56
|
@ -224,6 +224,9 @@ Release 0.2.0
|
||||||
HBASE-751 dfs exception and regionserver stuck during heavy write load
|
HBASE-751 dfs exception and regionserver stuck during heavy write load
|
||||||
HBASE-793 HTable.getStartKeys() ignores table names when matching columns
|
HBASE-793 HTable.getStartKeys() ignores table names when matching columns
|
||||||
(Andrew Purtell and Dru Jensen via Stack)
|
(Andrew Purtell and Dru Jensen via Stack)
|
||||||
|
HBASE-790 During import, single region blocks requests for >10 minutes,
|
||||||
|
thread dumps, throws out pending requests, and continues
|
||||||
|
(Jonathan Gray via Stack)
|
||||||
|
|
||||||
IMPROVEMENTS
|
IMPROVEMENTS
|
||||||
HBASE-559 MR example job to count table rows
|
HBASE-559 MR example job to count table rows
|
||||||
|
|
|
@ -237,7 +237,6 @@ class Flusher extends Thread implements FlushRequester {
|
||||||
if (!regionsInQueue.contains(r)) {
|
if (!regionsInQueue.contains(r)) {
|
||||||
regionsInQueue.add(r);
|
regionsInQueue.add(r);
|
||||||
flushQueue.add(r);
|
flushQueue.add(r);
|
||||||
r.setLastFlushTime(now);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -317,7 +317,6 @@ public class HRegion implements HConstants {
|
||||||
new ConcurrentHashMap<Integer, byte []>();
|
new ConcurrentHashMap<Integer, byte []>();
|
||||||
private final Map<Integer, TreeMap<HStoreKey, byte []>> targetColumns =
|
private final Map<Integer, TreeMap<HStoreKey, byte []>> targetColumns =
|
||||||
new ConcurrentHashMap<Integer, TreeMap<HStoreKey, byte []>>();
|
new ConcurrentHashMap<Integer, TreeMap<HStoreKey, byte []>>();
|
||||||
private volatile boolean flushRequested = false;
|
|
||||||
// Default access because read by tests.
|
// Default access because read by tests.
|
||||||
final Map<Integer, HStore> stores = new ConcurrentHashMap<Integer, HStore>();
|
final Map<Integer, HStore> stores = new ConcurrentHashMap<Integer, HStore>();
|
||||||
final AtomicLong memcacheSize = new AtomicLong(0);
|
final AtomicLong memcacheSize = new AtomicLong(0);
|
||||||
|
@ -337,6 +336,8 @@ public class HRegion implements HConstants {
|
||||||
static class WriteState {
|
static class WriteState {
|
||||||
// Set while a memcache flush is happening.
|
// Set while a memcache flush is happening.
|
||||||
volatile boolean flushing = false;
|
volatile boolean flushing = false;
|
||||||
|
// Set when a flush has been requested.
|
||||||
|
volatile boolean flushRequested = false;
|
||||||
// Set while a compaction is running.
|
// Set while a compaction is running.
|
||||||
volatile boolean compacting = false;
|
volatile boolean compacting = false;
|
||||||
// Gets set in close. If set, cannot compact or flush again.
|
// Gets set in close. If set, cannot compact or flush again.
|
||||||
|
@ -355,6 +356,10 @@ public class HRegion implements HConstants {
|
||||||
boolean isReadOnly() {
|
boolean isReadOnly() {
|
||||||
return this.readOnly;
|
return this.readOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean isFlushRequested() {
|
||||||
|
return this.flushRequested;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private volatile WriteState writestate = new WriteState();
|
private volatile WriteState writestate = new WriteState();
|
||||||
|
@ -689,11 +694,6 @@ public class HRegion implements HConstants {
|
||||||
return this.lastFlushTime;
|
return this.lastFlushTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param t the lastFlushTime */
|
|
||||||
void setLastFlushTime(long t) {
|
|
||||||
this.lastFlushTime = t;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
// HRegion maintenance.
|
// HRegion maintenance.
|
||||||
//
|
//
|
||||||
|
@ -946,7 +946,7 @@ public class HRegion implements HConstants {
|
||||||
}
|
}
|
||||||
synchronized (writestate) {
|
synchronized (writestate) {
|
||||||
if (!writestate.flushing && writestate.writesEnabled) {
|
if (!writestate.flushing && writestate.writesEnabled) {
|
||||||
writestate.flushing = true;
|
this.writestate.flushing = true;
|
||||||
} else {
|
} else {
|
||||||
if(LOG.isDebugEnabled()) {
|
if(LOG.isDebugEnabled()) {
|
||||||
LOG.debug("NOT flushing memcache for region " + this +
|
LOG.debug("NOT flushing memcache for region " + this +
|
||||||
|
@ -968,6 +968,7 @@ public class HRegion implements HConstants {
|
||||||
} finally {
|
} finally {
|
||||||
synchronized (writestate) {
|
synchronized (writestate) {
|
||||||
writestate.flushing = false;
|
writestate.flushing = false;
|
||||||
|
this.writestate.flushRequested = false;
|
||||||
writestate.notifyAll();
|
writestate.notifyAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1008,7 +1009,6 @@ public class HRegion implements HConstants {
|
||||||
private boolean internalFlushcache() throws IOException {
|
private boolean internalFlushcache() throws IOException {
|
||||||
final long startTime = System.currentTimeMillis();
|
final long startTime = System.currentTimeMillis();
|
||||||
// Clear flush flag.
|
// Clear flush flag.
|
||||||
this.flushRequested = false;
|
|
||||||
// Record latest flush time
|
// Record latest flush time
|
||||||
this.lastFlushTime = startTime;
|
this.lastFlushTime = startTime;
|
||||||
// If nothing to flush, return and avoid logging start/stop flush.
|
// If nothing to flush, return and avoid logging start/stop flush.
|
||||||
|
@ -1605,8 +1605,7 @@ public class HRegion implements HConstants {
|
||||||
size = this.memcacheSize.addAndGet(
|
size = this.memcacheSize.addAndGet(
|
||||||
getStore(key.getColumn()).add(key, e.getValue()));
|
getStore(key.getColumn()).add(key, e.getValue()));
|
||||||
}
|
}
|
||||||
flush = this.flushListener != null && !this.flushRequested &&
|
flush = isFlushSize(size);
|
||||||
isFlushSize(size);
|
|
||||||
} finally {
|
} finally {
|
||||||
this.updatesLock.readLock().unlock();
|
this.updatesLock.readLock().unlock();
|
||||||
}
|
}
|
||||||
|
@ -1617,11 +1616,16 @@ public class HRegion implements HConstants {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void requestFlush() {
|
private void requestFlush() {
|
||||||
if (this.flushListener == null || this.flushRequested) {
|
if (this.flushListener == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
synchronized (writestate) {
|
||||||
|
if (this.writestate.isFlushRequested()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
writestate.flushRequested = true;
|
||||||
this.flushListener.request(this);
|
this.flushListener.request(this);
|
||||||
this.flushRequested = true;
|
}
|
||||||
if (LOG.isDebugEnabled()) {
|
if (LOG.isDebugEnabled()) {
|
||||||
LOG.debug("Flush requested on " + this);
|
LOG.debug("Flush requested on " + this);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue