mirror of https://github.com/apache/druid.git
fix local cache byte counting on object removal
This commit is contained in:
parent
9756b18f9b
commit
df0d81baa8
|
@ -24,6 +24,7 @@ import com.metamx.common.logger.Logger;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
|
@ -74,8 +75,7 @@ class ByteCountingLRUMap extends LinkedHashMap<ByteBuffer, byte[]>
|
||||||
public byte[] put(ByteBuffer key, byte[] value)
|
public byte[] put(ByteBuffer key, byte[] value)
|
||||||
{
|
{
|
||||||
numBytes += key.remaining() + value.length;
|
numBytes += key.remaining() + value.length;
|
||||||
byte[] retVal = super.put(key, value);
|
return super.put(key, value);
|
||||||
return retVal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -98,4 +98,31 @@ class ByteCountingLRUMap extends LinkedHashMap<ByteBuffer, byte[]>
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] remove(Object key)
|
||||||
|
{
|
||||||
|
byte[] value = super.remove(key);
|
||||||
|
if(value != null) {
|
||||||
|
numBytes -= ((ByteBuffer)key).remaining() + value.length;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We want keySet().iterator().remove() to account for object removal
|
||||||
|
* The underlying Map calls this.remove(key) so we do not need to override this
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Set<ByteBuffer> keySet()
|
||||||
|
{
|
||||||
|
return super.keySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clear()
|
||||||
|
{
|
||||||
|
numBytes = 0;
|
||||||
|
super.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
|
@ -65,6 +66,18 @@ public class ByteCountingLRUMapTest
|
||||||
assertMapValues(2, 101, 2);
|
assertMapValues(2, 101, 2);
|
||||||
Assert.assertEquals(ByteBuffer.wrap(eightyEightVal), ByteBuffer.wrap(map.get(tenKey)));
|
Assert.assertEquals(ByteBuffer.wrap(eightyEightVal), ByteBuffer.wrap(map.get(tenKey)));
|
||||||
Assert.assertEquals(oneByte, ByteBuffer.wrap(map.get(twoByte)));
|
Assert.assertEquals(oneByte, ByteBuffer.wrap(map.get(twoByte)));
|
||||||
|
|
||||||
|
Iterator<ByteBuffer> it = map.keySet().iterator();
|
||||||
|
while(it.hasNext()) {
|
||||||
|
ByteBuffer buf = it.next();
|
||||||
|
if(buf.remaining() == 10) {
|
||||||
|
it.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertMapValues(1, 3, 2);
|
||||||
|
|
||||||
|
map.remove(twoByte);
|
||||||
|
assertMapValues(0, 0, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertMapValues(final int size, final int numBytes, final int evictionCount)
|
private void assertMapValues(final int size, final int numBytes, final int evictionCount)
|
||||||
|
|
Loading…
Reference in New Issue