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)