HBASE-1547 atomicIncrement doesnt increase hregion.memcacheSize
git-svn-id: https://svn.apache.org/repos/asf/hadoop/hbase/trunk@786693 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
9c5c2d32db
commit
6c10644a10
|
@ -209,6 +209,7 @@ Release 0.20.0 - Unreleased
|
||||||
HBASE-1387 Before release verify all object sizes using Ryans' instrumented
|
HBASE-1387 Before release verify all object sizes using Ryans' instrumented
|
||||||
JVM trick (Erik Holstad via Stack)
|
JVM trick (Erik Holstad via Stack)
|
||||||
HBASE-1545 atomicIncrements creating new values with Long.MAX_VALUE
|
HBASE-1545 atomicIncrements creating new values with Long.MAX_VALUE
|
||||||
|
HBASE-1547 atomicIncrement doesnt increase hregion.memcacheSize
|
||||||
|
|
||||||
IMPROVEMENTS
|
IMPROVEMENTS
|
||||||
HBASE-1089 Add count of regions on filesystem to master UI; add percentage
|
HBASE-1089 Add count of regions on filesystem to master UI; add percentage
|
||||||
|
|
|
@ -2275,16 +2275,29 @@ public class HRegion implements HConstants { // , Writable{
|
||||||
byte [] qualifier, long amount)
|
byte [] qualifier, long amount)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
checkRow(row);
|
checkRow(row);
|
||||||
|
|
||||||
|
boolean flush = false;
|
||||||
// Lock row
|
// Lock row
|
||||||
Integer lid = obtainRowLock(row);
|
Integer lid = obtainRowLock(row);
|
||||||
long result = 0L;
|
long result = 0L;
|
||||||
try {
|
try {
|
||||||
Store store = stores.get(family);
|
Store store = stores.get(family);
|
||||||
result = store.incrementColumnValue(row, family, qualifier, amount);
|
|
||||||
|
Store.ValueAndSize vas =
|
||||||
|
store.incrementColumnValue(row, family, qualifier, amount);
|
||||||
|
|
||||||
|
result = vas.value;
|
||||||
|
long size = this.memcacheSize.addAndGet(vas.sizeAdded);
|
||||||
|
flush = isFlushSize(size);
|
||||||
} finally {
|
} finally {
|
||||||
releaseRowLock(lid);
|
releaseRowLock(lid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flush) {
|
||||||
|
// Request a cache flush. Do it outside update lock.
|
||||||
|
requestFlush();
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1494,6 +1494,15 @@ public class Store implements HConstants {
|
||||||
// Run a GET scan and put results into the specified list
|
// Run a GET scan and put results into the specified list
|
||||||
scanner.get(result);
|
scanner.get(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class ValueAndSize {
|
||||||
|
public long value;
|
||||||
|
public long sizeAdded;
|
||||||
|
public ValueAndSize(long value, long sizeAdded) {
|
||||||
|
this.value = value;
|
||||||
|
this.sizeAdded = sizeAdded;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Increments the value for the given row/family/qualifier
|
* Increments the value for the given row/family/qualifier
|
||||||
|
@ -1504,7 +1513,7 @@ public class Store implements HConstants {
|
||||||
* @return The new value.
|
* @return The new value.
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public long incrementColumnValue(byte [] row, byte [] family,
|
public ValueAndSize incrementColumnValue(byte [] row, byte [] family,
|
||||||
byte [] qualifier, long amount) throws IOException {
|
byte [] qualifier, long amount) throws IOException {
|
||||||
long value = 0;
|
long value = 0;
|
||||||
List<KeyValue> result = new ArrayList<KeyValue>();
|
List<KeyValue> result = new ArrayList<KeyValue>();
|
||||||
|
@ -1527,9 +1536,8 @@ public class Store implements HConstants {
|
||||||
value = Bytes.toLong(buffer, valueOffset, Bytes.SIZEOF_LONG) + amount;
|
value = Bytes.toLong(buffer, valueOffset, Bytes.SIZEOF_LONG) + amount;
|
||||||
Bytes.putBytes(buffer, valueOffset, Bytes.toBytes(value), 0,
|
Bytes.putBytes(buffer, valueOffset, Bytes.toBytes(value), 0,
|
||||||
Bytes.SIZEOF_LONG);
|
Bytes.SIZEOF_LONG);
|
||||||
return value;
|
return new ValueAndSize(value, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if we even have storefiles
|
// Check if we even have storefiles
|
||||||
if(this.storefiles.isEmpty()) {
|
if(this.storefiles.isEmpty()) {
|
||||||
return addNewKeyValue(row, family, qualifier, value, amount);
|
return addNewKeyValue(row, family, qualifier, value, amount);
|
||||||
|
@ -1552,14 +1560,13 @@ public class Store implements HConstants {
|
||||||
return addNewKeyValue(row, family, qualifier, value, amount);
|
return addNewKeyValue(row, family, qualifier, value, amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
private long addNewKeyValue(byte [] row, byte [] family, byte [] qualifier,
|
private ValueAndSize addNewKeyValue(byte [] row, byte [] family, byte [] qualifier,
|
||||||
long value, long amount) {
|
long value, long amount) {
|
||||||
long newValue = value + amount;
|
long newValue = value + amount;
|
||||||
KeyValue newKv = new KeyValue(row, family, qualifier,
|
KeyValue newKv = new KeyValue(row, family, qualifier,
|
||||||
System.currentTimeMillis(),
|
System.currentTimeMillis(),
|
||||||
Bytes.toBytes(newValue));
|
Bytes.toBytes(newValue));
|
||||||
add(newKv);
|
add(newKv);
|
||||||
return newValue;
|
return new ValueAndSize(newValue, newKv.heapSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue