Steven Schlansker created KAFKA-18689: -----------------------------------------
Summary: NoSuchElementException in state store iterator metrics Key: KAFKA-18689 URL: https://issues.apache.org/jira/browse/KAFKA-18689 Project: Kafka Issue Type: Bug Components: metrics, streams Affects Versions: 3.9.0 Reporter: Steven Schlansker We are standing up a new Kafka Streams app that collects metrics and extensively uses state store iterators. Occasionally, we see the following exception in our logs: {code:java} java.util.NoSuchElementException: null at java.base/java.util.concurrent.ConcurrentSkipListMap.firstKey(ConcurrentSkipListMap.java:1863) at java.base/java.util.concurrent.ConcurrentSkipListSet.first(ConcurrentSkipListSet.java:398) at org.apache.kafka.streams.state.internals.MeteredKeyValueStore.lambda$registerMetrics$5(MeteredKeyValueStore.java:176) at org.apache.kafka.common.metrics.KafkaMetric.metricValue(KafkaMetric.java:81) at com.paywholesail.service.search.core.streams.KafkaStreamsMetricsManager$1.getValue(KafkaStreamsMetricsManager.java:53) at io.dropwizard.metrics5.graphite.GraphiteReporter.reportGauge(GraphiteReporter.java:480) at io.dropwizard.metrics5.graphite.GraphiteReporter.report(GraphiteReporter.java:378) {code} Looking at the implementation of state store metrics (MeteredKeyValueStore.registerMetrics), {code:java} StateStoreMetrics.addOldestOpenIteratorGauge(taskId.toString(), metricsScope, name(), streamsMetrics, (config, now) -> openIterators.isEmpty() ? null : openIterators.first().startTimestamp() );{code} OpenIterators is a ConcurrentSkipListSet and is not protected by any lock while the metric is read. Therefore, checking isEmpty and calling first has a natural check-then-use race condition, and throws an exception if the last open iterator is removed concurrently. It might be safer to always take an iterator, like: {code:java} var openIterIter = openIterators.iterator(); return openIterIter.hasNext() ? openIterIter.next().startTimestamp() : null; {code} -- This message was sent by Atlassian Jira (v8.20.10#820010)