Skip to content

Commit

Permalink
Issue #6974 - improve testMaxMemory for Array & Mapped ByteBufferPools
Browse files Browse the repository at this point in the history
Signed-off-by: Lachlan Roberts <lachlan@webtide.com>
  • Loading branch information
lachlan-roberts committed Dec 3, 2021
1 parent 51dd155 commit be067a3
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,9 @@
import org.junit.jupiter.api.Test;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.lessThan;
import static org.hamcrest.Matchers.lessThanOrEqualTo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertSame;
Expand Down Expand Up @@ -202,7 +201,7 @@ public void testMaxQueue()
public void testMaxMemory()
{
int factor = 1024;
int maxMemory = 11 * 1024;
int maxMemory = 11 * factor;
ArrayByteBufferPool bufferPool = new ArrayByteBufferPool(-1, factor, -1, -1, -1, maxMemory);
Bucket[] buckets = bufferPool.bucketsFor(true);

Expand All @@ -212,26 +211,38 @@ public void testMaxMemory()
{
int capacity = factor * i;
ByteBuffer buffer = bufferPool.acquire(capacity, true);
assertThat(buffer.capacity(), equalTo(capacity));
bufferPool.release(buffer);
}

// Check state of buckets.
assertThat(bufferPool.getMemory(true), equalTo(10L * factor));
assertThat(buckets[1].size(), equalTo(1));
assertThat(buckets[2].size(), equalTo(1));
assertThat(buckets[3].size(), equalTo(1));
assertThat(buckets[4].size(), equalTo(1));

// Create and release a buffer to exceed the max memory.
ByteBuffer buffer = bufferPool.newByteBuffer(2 * factor, true);
int capacity = 2 * factor;
ByteBuffer buffer = bufferPool.newByteBuffer(capacity, true);
assertThat(buffer.capacity(), equalTo(capacity));
bufferPool.release(buffer);

// Now the oldest buffer should be gone and we have: 1+2x2+3=8
long memory = bufferPool.getMemory(true);
assertThat(memory, lessThan((long)maxMemory));
assertTrue(buckets[3].isEmpty());
assertThat(bufferPool.getMemory(true), equalTo(8L * factor));
assertThat(buckets[1].size(), equalTo(1));
assertThat(buckets[2].size(), equalTo(2));
assertThat(buckets[3].size(), equalTo(1));

// Create and release a large buffer.
// Max memory is exceeded and buckets 3 and 1 are cleared.
// We will have 2x2+7=11.
buffer = bufferPool.newByteBuffer(7 * factor, true);
capacity = 7 * factor;
buffer = bufferPool.newByteBuffer(capacity, true);
bufferPool.release(buffer);
memory = bufferPool.getMemory(true);
assertThat(memory, lessThanOrEqualTo((long)maxMemory));
assertTrue(buckets[0].isEmpty());
assertTrue(buckets[2].isEmpty());

assertThat(bufferPool.getMemory(true), equalTo(11L * factor));
assertThat(buckets[2].size(), equalTo(2));
assertThat(buckets[7].size(), equalTo(1));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,9 @@

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.lessThan;
import static org.hamcrest.Matchers.lessThanOrEqualTo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertTrue;

Expand Down Expand Up @@ -144,7 +142,7 @@ public void testMaxQueue()
public void testMaxMemory()
{
int factor = 1024;
int maxMemory = 11 * 1024;
int maxMemory = 11 * factor;
MappedByteBufferPool bufferPool = new MappedByteBufferPool(factor, -1, null, -1, maxMemory);
ConcurrentMap<Integer, Bucket> buckets = bufferPool.bucketsFor(true);

Expand All @@ -154,26 +152,39 @@ public void testMaxMemory()
{
int capacity = factor * i;
ByteBuffer buffer = bufferPool.acquire(capacity, true);
assertThat(buffer.capacity(), equalTo(capacity));
bufferPool.release(buffer);
}

// Check state of buckets.
assertThat(bufferPool.getMemory(true), equalTo(10L * factor));
assertThat(buckets.get(1).size(), equalTo(1));
assertThat(buckets.get(2).size(), equalTo(1));
assertThat(buckets.get(3).size(), equalTo(1));
assertThat(buckets.get(4).size(), equalTo(1));

// Create and release a buffer to exceed the max memory.
ByteBuffer buffer = bufferPool.newByteBuffer(2 * factor, true);
int capacity = 2 * factor;
ByteBuffer buffer = bufferPool.newByteBuffer(capacity, true);
assertThat(buffer.capacity(), equalTo(capacity));
bufferPool.release(buffer);

// Now the oldest buffer should be gone and we have: 1+2x2+3=8
long memory = bufferPool.getMemory(true);
assertThat(memory, lessThan((long)maxMemory));
assertNull(buckets.get(4));
assertThat(bufferPool.getMemory(true), equalTo(8L * factor));
assertThat(buckets.get(1).size(), equalTo(1));
assertThat(buckets.get(2).size(), equalTo(2));
assertThat(buckets.get(3).size(), equalTo(1));

// Create and release a large buffer.
// Max memory is exceeded and buckets 3 and 1 are cleared.
// We will have 2x2+7=11.
buffer = bufferPool.newByteBuffer(7 * factor, true);
capacity = 7 * factor;
buffer = bufferPool.newByteBuffer(capacity, true);
assertThat(buffer.capacity(), equalTo(capacity));
bufferPool.release(buffer);
memory = bufferPool.getMemory(true);
assertThat(memory, lessThanOrEqualTo((long)maxMemory));
assertNull(buckets.get(1));
assertNull(buckets.get(3));

assertThat(bufferPool.getMemory(true), equalTo(11L * factor));
assertThat(buckets.get(2).size(), equalTo(2));
assertThat(buckets.get(7).size(), equalTo(1));
}
}

0 comments on commit be067a3

Please sign in to comment.