in geronimo-microprofile-reporter/src/main/java/org/apache/geronimo/microprofile/reporter/storage/data/InMemoryDatabase.java [70:94]
public void add(final T value) {
ensureUpToDate();
final long now = System.currentTimeMillis();
final Lock lock = this.lock.readLock();
lock.lock();
try {
final Value<T> sample = new Value<>(value, now, Math.exp(alpha * (TimeUnit.MILLISECONDS.toSeconds(now) - startTime)));
final double priority = sample.weight / Math.random();
final long size = count.incrementAndGet();
if (size <= bucketSize) {
bucket.put(priority, sample);
} else { // iterate through the bucket until we need removing low priority entries to get a new space
double first = bucket.firstKey();
if (first < priority && bucket.putIfAbsent(priority, sample) == null) {
while (bucket.remove(first) == null) {
first = bucket.firstKey();
}
}
}
} finally {
lock.unlock();
}
}