[#5520] Correctly include all PoolSubpage metrics
Motivation: Because of a bug we missed to include the first PoolSubpage when collection metrics. Modifications: - Correctly include all subpages - Add unit test Result: Correctly include all subpages
This commit is contained in:
parent
9380fdeb43
commit
196540ca1d
@ -433,7 +433,7 @@ abstract class PoolArena<T> implements PoolArenaMetric {
|
|||||||
|
|
||||||
private static List<PoolSubpageMetric> subPageMetricList(PoolSubpage<?>[] pages) {
|
private static List<PoolSubpageMetric> subPageMetricList(PoolSubpage<?>[] pages) {
|
||||||
List<PoolSubpageMetric> metrics = new ArrayList<PoolSubpageMetric>();
|
List<PoolSubpageMetric> metrics = new ArrayList<PoolSubpageMetric>();
|
||||||
for (int i = 1; i < pages.length; i ++) {
|
for (int i = 0; i < pages.length; i ++) {
|
||||||
PoolSubpage<?> head = pages[i];
|
PoolSubpage<?> head = pages[i];
|
||||||
if (head.next == head) {
|
if (head.next == head) {
|
||||||
continue;
|
continue;
|
||||||
@ -589,49 +589,36 @@ abstract class PoolArena<T> implements PoolArenaMetric {
|
|||||||
.append(q100)
|
.append(q100)
|
||||||
.append(StringUtil.NEWLINE)
|
.append(StringUtil.NEWLINE)
|
||||||
.append("tiny subpages:");
|
.append("tiny subpages:");
|
||||||
for (int i = 1; i < tinySubpagePools.length; i ++) {
|
appendPoolSubPages(buf, tinySubpagePools);
|
||||||
PoolSubpage<T> head = tinySubpagePools[i];
|
|
||||||
if (head.next == head) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf.append(StringUtil.NEWLINE)
|
|
||||||
.append(i)
|
|
||||||
.append(": ");
|
|
||||||
PoolSubpage<T> s = head.next;
|
|
||||||
for (;;) {
|
|
||||||
buf.append(s);
|
|
||||||
s = s.next;
|
|
||||||
if (s == head) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buf.append(StringUtil.NEWLINE)
|
buf.append(StringUtil.NEWLINE)
|
||||||
.append("small subpages:");
|
.append("small subpages:");
|
||||||
for (int i = 1; i < smallSubpagePools.length; i ++) {
|
appendPoolSubPages(buf, smallSubpagePools);
|
||||||
PoolSubpage<T> head = smallSubpagePools[i];
|
|
||||||
if (head.next == head) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf.append(StringUtil.NEWLINE)
|
|
||||||
.append(i)
|
|
||||||
.append(": ");
|
|
||||||
PoolSubpage<T> s = head.next;
|
|
||||||
for (;;) {
|
|
||||||
buf.append(s);
|
|
||||||
s = s.next;
|
|
||||||
if (s == head) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buf.append(StringUtil.NEWLINE);
|
buf.append(StringUtil.NEWLINE);
|
||||||
|
|
||||||
return buf.toString();
|
return buf.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void appendPoolSubPages(StringBuilder buf, PoolSubpage<?>[] subpages) {
|
||||||
|
for (int i = 0; i < subpages.length; i ++) {
|
||||||
|
PoolSubpage<?> head = subpages[i];
|
||||||
|
if (head.next == head) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf.append(StringUtil.NEWLINE)
|
||||||
|
.append(i)
|
||||||
|
.append(": ");
|
||||||
|
PoolSubpage<?> s = head.next;
|
||||||
|
for (;;) {
|
||||||
|
buf.append(s);
|
||||||
|
s = s.next;
|
||||||
|
if (s == head) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static final class HeapArena extends PoolArena<byte[]> {
|
static final class HeapArena extends PoolArena<byte[]> {
|
||||||
|
|
||||||
HeapArena(PooledByteBufAllocator parent, int pageSize, int maxOrder, int pageShifts, int chunkSize) {
|
HeapArena(PooledByteBufAllocator parent, int pageSize, int maxOrder, int pageShifts, int chunkSize) {
|
||||||
|
@ -94,6 +94,32 @@ public class PooledByteBufAllocatorTest {
|
|||||||
assertEquals(max, m.maxUsage());
|
assertEquals(max, m.maxUsage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSmallSubpageMetric() {
|
||||||
|
PooledByteBufAllocator allocator = new PooledByteBufAllocator(true, 1, 1, 8192, 11, 0, 0, 0);
|
||||||
|
ByteBuf buffer = allocator.heapBuffer(500);
|
||||||
|
try {
|
||||||
|
PoolArenaMetric metric = allocator.heapArenas().get(0);
|
||||||
|
PoolSubpageMetric subpageMetric = metric.smallSubpages().get(0);
|
||||||
|
assertEquals(1, subpageMetric.maxNumElements() - subpageMetric.numAvailable());
|
||||||
|
} finally {
|
||||||
|
buffer.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTinySubpageMetric() {
|
||||||
|
PooledByteBufAllocator allocator = new PooledByteBufAllocator(true, 1, 1, 8192, 11, 0, 0, 0);
|
||||||
|
ByteBuf buffer = allocator.heapBuffer(1);
|
||||||
|
try {
|
||||||
|
PoolArenaMetric metric = allocator.heapArenas().get(0);
|
||||||
|
PoolSubpageMetric subpageMetric = metric.tinySubpages().get(0);
|
||||||
|
assertEquals(1, subpageMetric.maxNumElements() - subpageMetric.numAvailable());
|
||||||
|
} finally {
|
||||||
|
buffer.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFreePoolChunk() {
|
public void testFreePoolChunk() {
|
||||||
int chunkSize = 16 * 1024 * 1024;
|
int chunkSize = 16 * 1024 * 1024;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user