|
23 | 23 | import org.apache.kafka.common.utils.Time; |
24 | 24 | import org.apache.kafka.streams.KeyValue; |
25 | 25 | import org.apache.kafka.streams.errors.ProcessorStateException; |
26 | | -import org.apache.kafka.streams.internals.metrics.OpenIterators; |
27 | 26 | import org.apache.kafka.streams.kstream.internals.Change; |
28 | 27 | import org.apache.kafka.streams.kstream.internals.WrappingNullableUtils; |
29 | 28 | import org.apache.kafka.streams.processor.StateStore; |
|
49 | 48 | import org.apache.kafka.streams.state.internals.metrics.StateStoreMetrics; |
50 | 49 |
|
51 | 50 | import java.util.ArrayList; |
| 51 | +import java.util.Comparator; |
52 | 52 | import java.util.List; |
53 | 53 | import java.util.Map; |
| 54 | +import java.util.NavigableSet; |
| 55 | +import java.util.NoSuchElementException; |
54 | 56 | import java.util.Objects; |
| 57 | +import java.util.concurrent.ConcurrentSkipListSet; |
| 58 | +import java.util.concurrent.atomic.LongAdder; |
55 | 59 | import java.util.function.Function; |
56 | 60 |
|
57 | 61 | import static org.apache.kafka.common.utils.Utils.mkEntry; |
@@ -93,7 +97,9 @@ public class MeteredKeyValueStore<K, V> |
93 | 97 | private TaskId taskId; |
94 | 98 | private Sensor restoreSensor; |
95 | 99 |
|
96 | | - protected OpenIterators openIterators; |
| 100 | + protected LongAdder numOpenIterators = new LongAdder(); |
| 101 | + protected NavigableSet<MeteredIterator> openIterators = new ConcurrentSkipListSet<>(Comparator.comparingLong(MeteredIterator::startTimestamp)); |
| 102 | + |
97 | 103 |
|
98 | 104 | @SuppressWarnings("rawtypes") |
99 | 105 | private final Map<Class, QueryHandler> queryHandlers = |
@@ -148,10 +154,15 @@ private void registerMetrics() { |
148 | 154 | e2eLatencySensor = StateStoreMetrics.e2ELatencySensor(taskId.toString(), metricsScope, name(), streamsMetrics); |
149 | 155 | iteratorDurationSensor = StateStoreMetrics.iteratorDurationSensor(taskId.toString(), metricsScope, name(), streamsMetrics); |
150 | 156 | StateStoreMetrics.addNumOpenIteratorsGauge(taskId.toString(), metricsScope, name(), streamsMetrics, |
151 | | - (config, now) -> openIterators.sum()); |
152 | | - openIterators = new OpenIterators(); |
| 157 | + (config, now) -> numOpenIterators.sum()); |
153 | 158 | StateStoreMetrics.addOldestOpenIteratorGauge(taskId.toString(), metricsScope, name(), streamsMetrics, |
154 | | - (config, now) -> openIterators.oldestStartTimestamp()); |
| 159 | + (config, now) -> { |
| 160 | + try { |
| 161 | + return openIterators.isEmpty() ? 0L : openIterators.first().startTimestamp(); |
| 162 | + } catch (final NoSuchElementException ignore) { |
| 163 | + return 0L; |
| 164 | + } |
| 165 | + }); |
155 | 166 | } |
156 | 167 |
|
157 | 168 | @Override |
@@ -442,6 +453,7 @@ private MeteredKeyValueIterator(final KeyValueIterator<Bytes, byte[]> iter, |
442 | 453 | this.sensor = sensor; |
443 | 454 | this.startTimestamp = time.milliseconds(); |
444 | 455 | this.startNs = time.nanoseconds(); |
| 456 | + numOpenIterators.increment(); |
445 | 457 | openIterators.add(this); |
446 | 458 | } |
447 | 459 |
|
@@ -471,6 +483,7 @@ public void close() { |
471 | 483 | final long duration = time.nanoseconds() - startNs; |
472 | 484 | sensor.record(duration); |
473 | 485 | iteratorDurationSensor.record(duration); |
| 486 | + numOpenIterators.decrement(); |
474 | 487 | openIterators.remove(this); |
475 | 488 | } |
476 | 489 | } |
@@ -499,6 +512,7 @@ private MeteredKeyValueTimestampedIterator( |
499 | 512 | this.valueDeserializer = valueDeserializer; |
500 | 513 | this.startTimestamp = time.milliseconds(); |
501 | 514 | this.startNs = time.nanoseconds(); |
| 515 | + numOpenIterators.increment(); |
502 | 516 | openIterators.add(this); |
503 | 517 | } |
504 | 518 |
|
@@ -528,6 +542,7 @@ public void close() { |
528 | 542 | final long duration = time.nanoseconds() - startNs; |
529 | 543 | sensor.record(duration); |
530 | 544 | iteratorDurationSensor.record(duration); |
| 545 | + numOpenIterators.decrement(); |
531 | 546 | openIterators.remove(this); |
532 | 547 | } |
533 | 548 | } |
|
0 commit comments