You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@kafka.apache.org by "Lucy Liu (Jira)" <ji...@apache.org> on 2026/07/12 21:35:00 UTC
[jira] [Created] (KAFKA-20798) Add readOnly(IsolationLevel) to TimestampedWindowStoreWithHeaders and SessionStoreWithHeaders
Lucy Liu created KAFKA-20798:
--------------------------------
Summary: Add readOnly(IsolationLevel) to TimestampedWindowStoreWithHeaders and SessionStoreWithHeaders
Key: KAFKA-20798
URL: https://issues.apache.org/jira/browse/KAFKA-20798
Project: Kafka
Issue Type: Bug
Components: streams
Reporter: Lucy Liu
Similar to KAFKA-20497, MeteredTimestampedWindowStoreWithHeaders and MeteredSessionStoreWithHeaders never override readOnly(IsolationLevel). KAFKA-20497 added this override to `MeteredKeyValueStore`, `MeteredWindowStore`, and `MeteredSessionStore` (PRs [#22316|https://github.com/apache/kafka/pull/22316]/[#22318|https://github.com/apache/kafka/pull/22318]/[#22317|https://github.com/apache/kafka/pull/22317]), but never extended it to their WithHeaders subclasses, which were added separately.
Since Kafka Streams' Interactive Query path always calls `.readOnly(level)` on a store before querying it (`CompositeReadOnlyWindowStore`/`CompositeReadOnlySessionStore` unconditionally wrap every underlying store this way), both WithHeaders classes silently fall back to their superclass's generic ReadOnlyView, which deserializes the key before the value. That ordering is wrong for headers-aware stores specifically: the key's schema-ID header can only be recovered from the value's embedded headers (`ValueTimestampHeaders`/`AggregationWithHeaders`), so the key must be deserialized after the value, not before.
The result is that any IQ read against a headers-aware windowed or session store — most reliably reproduced after a restart-and-restore-from-changelog. It throws:
"org.apache.kafka.common.errors.SerializationException: Error deserializing schema ID
Caused by: java.lang.IllegalArgumentException: Unknown magic byte!"
Fix: add a readOnly(IsolationLevel) override to both classes, returning a headers-aware read-only view that reuses the existing correct value-then-key iterator, matching the pattern KAFKA-20497 established for the non-headers store classes.
{{}}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)