This is an automated email from the ASF dual-hosted git repository.

mjsax pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git


The following commit(s) were added to refs/heads/trunk by this push:
     new e7cba22471f KAFKA-20849: Update the headers-aware store docs on 
suppress() (#23007)
e7cba22471f is described below

commit e7cba22471f0d2833b850e2b0085c1cfff2efed5
Author: Alieh Saeedi <[email protected]>
AuthorDate: Sat Aug 1 02:09:41 2026 +0200

    KAFKA-20849: Update the headers-aware store docs on suppress() (#23007)
    
    KAFKA-20413 made the `suppress()` buffer headers-aware when
    `dsl.store.format=HEADERS` is configured
    (`InMemoryTimeOrderedKeyValueChangeBuffer`), but four
    documentation locations still claim that `suppress()` loses headers:
    
    - `dsl-api.md` "Note on headers-aware state stores" on `suppress()`
    - `dsl-api.md` KIP-1285 current-behavior bullets
    - `config-streams.md` `dsl.store.format` "Current limitations"
    - `upgrade-guide.md` KIP-1285 "Current limitations"
    
    Docs only -- no code changes.
    
    Reviewers: Matthias J. Sax <[email protected]>
---
 docs/streams/developer-guide/config-streams.md | 2 +-
 docs/streams/developer-guide/dsl-api.md        | 4 +---
 docs/streams/upgrade-guide.md                  | 2 ++
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/docs/streams/developer-guide/config-streams.md 
b/docs/streams/developer-guide/config-streams.md
index 5c006ddaf8a..ec31bb4222c 100644
--- a/docs/streams/developer-guide/config-streams.md
+++ b/docs/streams/developer-guide/config-streams.md
@@ -1407,7 +1407,7 @@ Serde for the inner class of a windowed record. Must 
implement the `Serde` inter
 >
 > See [KIP-1271](https://cwiki.apache.org/confluence/x/QIM8G) for migration 
 > procedures, changelog compatibility, restore behavior, and per-record 
 > overhead.
 >
-> **Current limitations**: `dsl.store.format=HEADERS` changes the state store 
format. It does not define how DSL operators create headers for output records. 
Some operators write empty headers to their materialized stores, and the buffer 
stores used by `suppress()` and left/outer stream-stream joins are not 
headers-aware. See [Stateful 
transformations](/{version}/streams/developer-guide/dsl-api.html#stateful-transformations)
 and the [Streams upgrade guide](/{version}/streams/upgrade-guid [...]
+> **Current limitations**: `dsl.store.format=HEADERS` changes the state store 
format. It does not define how DSL operators create headers for output records. 
Some operators write empty headers to their materialized stores, and the buffer 
store used by left/outer stream-stream joins for not-yet-matched records is not 
headers-aware. See [Stateful 
transformations](/{version}/streams/developer-guide/dsl-api.html#stateful-transformations)
 and the [Streams upgrade guide](/{version}/streams/upg [...]
 
 ### ensure.explicit.internal.resource.naming
 
diff --git a/docs/streams/developer-guide/dsl-api.md 
b/docs/streams/developer-guide/dsl-api.md
index 6ed4e375784..34f18db6e70 100644
--- a/docs/streams/developer-guide/dsl-api.md
+++ b/docs/streams/developer-guide/dsl-api.md
@@ -931,7 +931,7 @@ This config only changes the state store format. It does 
not define how DSL oper
 
   * aggregations, KTable-KTable joins, materialized `KTable.mapValues`, 
`KStream.toTable()`, and `StreamsBuilder.table()` write empty headers to their 
materialized stores
   * KStream-KStream join window stores keep source-record headers, but join 
result records do not get computed or merged headers; they may carry the 
headers from the record that triggered the result
-  * `suppress()` and left/outer [KStream-KStream joins](#kstream-kstream-join) 
use non-headers-aware buffer stores, so records passing through those buffers 
lose their headers
+  * left/outer [KStream-KStream joins](#kstream-kstream-join) use a 
non-headers-aware buffer store for not-yet-matched records, so records passing 
through that buffer lose their headers
 
 A follow-up KIP will define how DSL result headers are computed.
 
@@ -4673,8 +4673,6 @@ The key parts of this program are:
 
 One thing to note is that suppression is just like any other Kafka Streams 
operator, so you can build a topology with two branches emerging from the 
`count`, one suppressed, and one not, or even multiple differently configured 
suppressions. This allows you to apply suppressions where they are needed and 
otherwise rely on the default continuous update behavior. 
 
-**Note on headers-aware state stores:** `suppress()` uses an in-memory buffer 
that is not headers-aware. Record headers attached to upstream records are not 
preserved across the suppression boundary, even when 
[`dsl.store.format=HEADERS`](../config-streams#dsl-store-format) is set 
globally per [KIP-1285](https://cwiki.apache.org/confluence/x/4ow8G).
-
 For more detailed information, see the JavaDoc on the `Suppressed` config 
object and [KIP-328](https://cwiki.apache.org/confluence/x/sQU0BQ "KIP-328"). 
 
 Applying processors (Processor API integration)
diff --git a/docs/streams/upgrade-guide.md b/docs/streams/upgrade-guide.md
index fa6222fc55d..b4bd4c90482 100644
--- a/docs/streams/upgrade-guide.md
+++ b/docs/streams/upgrade-guide.md
@@ -77,6 +77,8 @@ For applications using the Streams Rebalance Protocol 
(`group.protocol=streams`)
 
 For applications using the Streams Rebalance Protocol 
(`group.protocol=streams`), the broker-side task assignor is now pluggable 
([KIP-1357](https://cwiki.apache.org/confluence/x/NoSnGQ)). Operators register 
assignors with the new broker configuration `group.streams.assignors`, which 
accepts a list of built-in assignor names and fully qualified class names of 
custom `TaskAssignor` implementations; the first entry is the default for 
groups that do not select one. An individual group picks [...]
 
+The buffer used by `suppress()` is now headers-aware, closing one of the gaps 
listed under the [KIP-1285 current limitations](#current-limitations) in 4.3.0. 
With 
[`dsl.store.format=HEADERS`](/{version}/streams/developer-guide/config-streams.html#dsl-store-format),
 each buffered value is stored together with the headers of the record it came 
from, so record headers are preserved across the suppression boundary: the 
record emitted when a buffered row is evicted carries the headers of the  [...]
+
 ## Streams API changes in 4.3.0
 
 **Note:** Kafka Streams 4.3.0 contains a critical native memory leak in the 
RocksDB state store layer 
([KAFKA-20616](https://issues.apache.org/jira/browse/KAFKA-20616)). The 
`ColumnFamilyOptions` for the offsets column family is not closed, and column 
family handles can leak on close-path exceptions, which under cascading task 
closes (e.g., rebalances or error-triggered recoveries) leads to unbounded 
off-heap memory growth and eventual OOM. Users running Kafka Streams should 
consider upg [...]

Reply via email to