bug fix: concurrent increase by CounterWindow may cause PriorityQueue broken (#12505)
This commit is contained in:
parent
1111f8985d
commit
5c33ee016d
|
|
@ -47,6 +47,7 @@
|
|||
* BanyanDB: stream sort-by `time` query, use internal time-series rather than `index` to improve the query performance.
|
||||
* Bump up graphql-java to 21.5.
|
||||
* Add Unknown Node when receive Kubernetes peer address is not aware in current cluster.
|
||||
* Fix CounterWindow concurrent increase cause NPE by PriorityQueue
|
||||
|
||||
#### UI
|
||||
|
||||
|
|
|
|||
|
|
@ -48,25 +48,27 @@ public class CounterWindow {
|
|||
public Tuple2<Long, Double> increase(String name, ImmutableMap<String, String> labels, Double value, long windowSize, long now) {
|
||||
ID id = new ID(name, labels);
|
||||
Queue<Tuple2<Long, Double>> window = windows.computeIfAbsent(id, unused -> new PriorityQueue<>());
|
||||
window.offer(Tuple.of(now, value));
|
||||
long waterLevel = now - windowSize;
|
||||
Tuple2<Long, Double> peek = window.peek();
|
||||
if (peek._1 > waterLevel) {
|
||||
synchronized (window) {
|
||||
window.offer(Tuple.of(now, value));
|
||||
long waterLevel = now - windowSize;
|
||||
Tuple2<Long, Double> peek = window.peek();
|
||||
if (peek._1 > waterLevel) {
|
||||
return peek;
|
||||
}
|
||||
|
||||
Tuple2<Long, Double> result = peek;
|
||||
while (peek._1 < waterLevel) {
|
||||
result = window.poll();
|
||||
peek = window.element();
|
||||
}
|
||||
|
||||
// Choose the closed slot to the expected timestamp
|
||||
if (waterLevel - result._1 <= peek._1 - waterLevel) {
|
||||
return result;
|
||||
}
|
||||
|
||||
return peek;
|
||||
}
|
||||
|
||||
Tuple2<Long, Double> result = peek;
|
||||
while (peek._1 < waterLevel) {
|
||||
result = window.poll();
|
||||
peek = window.element();
|
||||
}
|
||||
|
||||
// Choose the closed slot to the expected timestamp
|
||||
if (waterLevel - result._1 <= peek._1 - waterLevel) {
|
||||
return result;
|
||||
}
|
||||
|
||||
return peek;
|
||||
}
|
||||
|
||||
public Tuple2<Long, Double> pop(String name, ImmutableMap<String, String> labels, Double value, long now) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue