Skip to content

Commit 08b24cd

Browse files
committed
add test for overflow of the ring buffer read/write counters
1 parent 46cd583 commit 08b24cd

2 files changed

Lines changed: 28 additions & 10 deletions

File tree

caffeine/src/test/java/com/github/benmanes/caffeine/cache/BoundedBufferTest.java

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static com.google.common.truth.Truth.assertThat;
1919

20+
import java.util.ArrayList;
2021
import java.util.concurrent.atomic.AtomicInteger;
2122
import java.util.concurrent.locks.ReentrantLock;
2223

@@ -31,28 +32,27 @@
3132
* @author ben.manes@gmail.com (Ben Manes)
3233
*/
3334
public final class BoundedBufferTest {
34-
static final String DUMMY = "test";
3535

3636
@DataProvider
3737
public Object[][] buffer() {
38-
return new Object[][] {{ new BoundedBuffer<String>() }};
38+
return new Object[][] {{ new BoundedBuffer<Boolean>() }};
3939
}
4040

4141
@Test(dataProvider = "buffer")
42-
public void offer(BoundedBuffer<String> buffer) {
42+
public void offer(BoundedBuffer<Boolean> buffer) {
4343
ConcurrentTestHarness.timeTasks(10, () -> {
4444
for (int i = 0; i < 100; i++) {
45-
buffer.offer(DUMMY);
45+
buffer.offer(Boolean.TRUE);
4646
}
4747
});
4848
assertThat(buffer.writes()).isGreaterThan(0);
4949
assertThat(buffer.writes()).isEqualTo(buffer.size());
5050
}
5151

5252
@Test(dataProvider = "buffer")
53-
public void drain(BoundedBuffer<String> buffer) {
53+
public void drain(BoundedBuffer<Boolean> buffer) {
5454
for (int i = 0; i < BoundedBuffer.BUFFER_SIZE; i++) {
55-
buffer.offer(DUMMY);
55+
buffer.offer(Boolean.TRUE);
5656
}
5757
long[] read = new long[1];
5858
buffer.drainTo(e -> read[0]++);
@@ -62,12 +62,12 @@ public void drain(BoundedBuffer<String> buffer) {
6262

6363
@Test(dataProvider = "buffer")
6464
@SuppressWarnings("ThreadPriorityCheck")
65-
public void offerAndDrain(BoundedBuffer<String> buffer) {
65+
public void offerAndDrain(BoundedBuffer<Boolean> buffer) {
6666
var lock = new ReentrantLock();
6767
var reads = new AtomicInteger();
6868
ConcurrentTestHarness.timeTasks(10, () -> {
6969
for (int i = 0; i < 1000; i++) {
70-
boolean shouldDrain = (buffer.offer(DUMMY) == Buffer.FULL);
70+
boolean shouldDrain = (buffer.offer(Boolean.TRUE) == Buffer.FULL);
7171
if (shouldDrain && lock.tryLock()) {
7272
buffer.drainTo(e -> reads.incrementAndGet());
7373
lock.unlock();
@@ -79,4 +79,22 @@ public void offerAndDrain(BoundedBuffer<String> buffer) {
7979
assertThat(reads.longValue()).isEqualTo(buffer.reads());
8080
assertThat(reads.longValue()).isEqualTo(buffer.writes());
8181
}
82+
83+
@Test
84+
public void overflow() {
85+
var buffer = new BoundedBuffer.RingBuffer<Boolean>(null);
86+
buffer.writeCounter = Long.MAX_VALUE;
87+
buffer.readCounter = Long.MAX_VALUE;
88+
89+
buffer.offer(Boolean.TRUE);
90+
var data = new ArrayList<>();
91+
buffer.drainTo(data::add);
92+
93+
for (var e : buffer.buffer) {
94+
assertThat(e).isNull();
95+
}
96+
assertThat(data).containsExactly(Boolean.TRUE);
97+
assertThat(buffer.readCounter).isEqualTo(Long.MIN_VALUE);
98+
assertThat(buffer.writeCounter).isEqualTo(Long.MIN_VALUE);
99+
}
82100
}

caffeine/src/test/java/com/github/benmanes/caffeine/cache/BoundedLocalCacheTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ public void evict_admit(BoundedLocalCache<Int, Int> cache, CacheContext context)
687687
assertThat(cache.admit(candidate, victim)).isFalse();
688688
}
689689

690-
// Allow
690+
// Admit a small, random percentage of warm candidates to protect against hash flooding
691691
while (cache.frequencySketch().frequency(candidate) < ADMIT_HASHDOS_THRESHOLD) {
692692
cache.frequencySketch().increment(candidate);
693693
}
@@ -701,8 +701,8 @@ public void evict_admit(BoundedLocalCache<Int, Int> cache, CacheContext context)
701701
}
702702
}
703703
assertThat(allow).isGreaterThan(0);
704-
assertThat(reject).isGreaterThan(0);
705704
assertThat(reject).isGreaterThan(allow);
705+
assertThat(100.0 * allow / (allow + reject)).isIn(Range.open(0.2, 2.0));
706706
}
707707

708708
@Test(groups = "isolated")

0 commit comments

Comments
 (0)