Thanks! LGTM.

On 2/22/26 2:27 PM, Siddhartha Devineni wrote:
Hi Matthias,

Thank you for the feedback. I appreciate you taking the time to review this.

MJS1 - Helper methods deprecation:

You are right about maintaining backward compatibility. I have updated the
KIP to follow the proper deprecation path:


    - Helper methods will remain in their current location but be marked as d
    eprecated
    - Duplicate helpers will be added in
    "org.apache.kafka.common.utils.internals.BytesUtils" for internal Kafka use
    - The deprecated public helpers will be removed only in version 5.0

This ensures we don't break any existing user code, however unlikely the
usage might be.

MJS2 - Time API:

Agreed. I will work on a separate KIP for the Time API. Your suggestion
about deprecating the KafkaStreams constructors that accept "Time" and
eventually using a KafkaStreamsMock approach makes sense.

Here is the updated KIP:
https://cwiki.apache.org/confluence/display/KAFKA/KIP-1247%3A+Make+Bytes+utils+class+part+of+the+public+API

Please let me know if the updated KIP addresses your concerns.

Best regards,
Siddhartha


On Sun, Feb 22, 2026 at 8:27 PM Matthias J. Sax <[email protected]> wrote:

Hello Siddhartha,

Thanks for this KIP. Wanted to catch up on it for a long time... Overall
the KIP make sense to me. Two comments:

MJS1: While I agree that we should put the helpers into an internal
package, I don't think we can move them -- we would rather need to
duplicate them, and mark the current ones as deprecated for now and
remove them only in 5.0 release. Even if it's very unlikely that users
would rely on these helpers, we should not just move them to internal
packages and potentially break user code.


MJS2: About `Time` -- looking forward to a follow up KIP. In
KafkaStreams we only use `Time` for testing, so it make sense to
deprecate the corresponding constructors IMHO. -- Later on, ie, AK 5.0
release, I believe the right way to handle it would be to make these
constructors package private and add a new `KafkaStreamsMock` sub-class
(or similar) in our testing code to still allow us to pass in a mock time.


-Matthias



On 12/29/25 9:48 AM, Siddhartha Devineni wrote:
Hi all,

(Apologies for posting this mistakenly in a separate thread - resending
here to keep the discussion organized)

I have updated the KIP-1247 based on feedback from Chia-Ping.

Key changes:

     - The KIP now proposes to make only the core *Bytes* methods
officially
     public (Bytes, wrap, get, compareTo, equals, hashCode, toString)
     - Helper methods/fields (increment(), ByteArrayComparator,
     BYTES_LEXICO_COMPARATOR) will be moved to
     "org.apache.kafka.common.utils.internals package"
     - This approach keeps the public API minimal while allowing internal
     Kafka code to continue using the helpers

Updated KIP:

https://cwiki.apache.org/confluence/display/KAFKA/KIP-1247%3A+Make+Bytes+utils+class+part+of+the+public+API

Please review the changes and let me know if you have any concerns. If
there are no objections in the next few days, then I would like to call
for
a vote.

Thank you.

Best regards,
Siddhartha


On Mon, Dec 29, 2025 at 12:17 AM Siddhartha Devineni <
[email protected]> wrote:

Hi Chia-Ping,

My apologies for the confusion, as I misunderstood your suggestion.

You were suggesting moving helpers like increment(),
ByteArrayComparator,
and BYTES_LEXICO_COMPARATOR to the
"org.apache.kafka.common.utils.internals" package while keeping them
public
in Java visibility terms so that they can have their current
characteristics such as the other internal packages can use them, they
are
not exposed to the users and no burden of maintaining them for backward
compatilibility.

This is a much cleaner approach. I will update the KIP to reflect these:

1. Make only the core Bytes methods (Bytes, wrap, get, compareTo,
equals,
hashCode, toString) officially part of the public API
2. Move the helper methods/fields to
"org.apache.kafka.common.utils.internals"

Thank you for your patience in explaining this.

Best regards,
Siddhartha

On Sun, Dec 28, 2025 at 1:54 PM Chia-Ping Tsai <[email protected]>
wrote:

hi Siddhartha

However, I have found that the method increment() is used in
"org.apache.kafka.streams.test", which is the public test utilities
package
(https://kafka.apache.org/38/javadoc/index.html). This means external
users
writing Kafka Streams tests might already be depending on this method.

I double-checked streams/test-utils but couldn't find any usage of
`increment` there. Could you point me to the specific class that uses
it?

Similarly, BYTES_LEXICO_COMPARATOR (of type ByteArrayComparator) is
used
in
a different package like "org.apache.kafka.streams.state.internals".
Making
it package-private would require extensive refactoring.

It is totally fine to keep the method public in teams of Java
visibility
(so other packages can use it).

My point is that we should not expose it as a public Kafka API
contract.
By
moving it to an internal package, we indicate to users that this is not
for
external use. This saves us from the burden of maintaining strict
backward
compatibility in the future
Best,
Chia-Ping

Siddhartha Devineni <[email protected]> 於 2025年12月28日週日
下午3:17寫道:

Hi Chia-Ping,

I understand your concern about these appearing to be internal
utilities -
you are absolutely right that, ideally, we would have a cleaner, more
minimal public API.

However, I have found that the method increment() is used in
"org.apache.kafka.streams.test", which is the public test utilities
package
(https://kafka.apache.org/38/javadoc/index.html). This means external
users
writing Kafka Streams tests might already be depending on this method.

Given this constraint, making increment() package-private would
potentially
break existing user code.

Similarly, BYTES_LEXICO_COMPARATOR (of type ByteArrayComparator) is
used in
a different package like "org.apache.kafka.streams.state.internals".
Making
it package-private would require extensive refactoring.

So while I agree these seem like internal utilities, they are already
being
used in ways that make them effectively part of the public contract.

I think the most pragmatic path forward is to accept them as part of
the
public API and ensure they are well-documented.

However, I am open to other approaches if you have suggestions -
perhaps
there's a better way to handle this that I haven't considered?

What are your thoughts?

Best regards,
Siddhartha

On Sun, Dec 28, 2025 at 10:13 AM Chia-Ping Tsai <[email protected]>
wrote:

hi Siddhartha

chia_0: Sorry for the confusion. My concern is that both
`ByteArrayComparator` and `increment` are being exposed as Kafka
public
APIs, even though they appear to be intended as Kafka internal APIs

Best,
Chia-Ping


Siddhartha Devineni <[email protected]> 於 2025年12月28日週日
上午2:13寫道:

Hi Chia-Ping,

Thank you for the feedback.

chia_0: You raised a valid concern about exposing all helper
methods. I
investigated the usage of each:

1. increment(Bytes input): Used in "org.apache.kafka.streams.test"
(the
public test utilities package for Kafka Streams), so it must remain
public.
2. BYTES_LEXICO_COMPARATOR: Used in
"org.apache.kafka.streams.state.internals package". Since this is a
different package from "org.apache.kafka.common.utils" where Bytes
resides,
it must remain public (package-private access wouldn't work across
different packages).
3. ByteArrayComparator interface: Must remain public since
BYTES_LEXICO_COMPARATOR is public and has this type.

So while I agree it would be cleaner to minimize the API surface,
these
helpers are already being used across different packages and by
public
test
utilities. Making them package-private would break existing internal
code
and they are already effectively part of the public contract.

chia_1: Good suggestion.
BytesSerializer in "org.apache.kafka.common.serialization" is
indeed a
strong example since serialization is explicitly listed as a public
API
package. I have added this to the motivation section to strengthen
the
rationale.

Best regards,
Siddhartha

On Sat, Dec 27, 2025 at 10:28 AM Chia-Ping Tsai <[email protected]

wrote:

hi Siddhartha

Thanks for the KIP. The motivation makes sense to me. I have a few
comments below.

chia_0: do we need to expose all helpers, such as
ByteArrayComparator
and
increment?

chia_1: the bytes class is also part of serialization API. Maybe
you
could
mention that in the motivation to strengthen the rationale.

Best,
Chia-Ping

Siddhartha Devineni <[email protected]> 於
2025年12月27日
上午11:47 寫道:

Hi all,

I would like to send a gentle reminder about KIP-1247, which
proposes
to
make the Bytes class officially part of the public API.

KIP link:






https://cwiki.apache.org/confluence/display/KAFKA/KIP-1247%3A+Make+Bytes+utils+class+part+of+the+public+API

Following the earlier discussion, the KIP has been updated to
focus
only
on
Bytes (the Time API will be addressed separately, as it needs
more
detailed
assessment).

If there are no further concerns or feedback, I would like to
call
for
a
vote in the next few days.

Please let me know if you have any feedback.
Thank you.

Best regards,
Siddhartha

On Thu, Dec 18, 2025 at 12:15 PM Siddhartha Devineni <
[email protected]> wrote:

Hi Sean,

Thank you for the detailed analysis of the Time interface -
this
is
an
invaluable context for when we address it in a future KIP.

Your breakdown of the different responsibilities (wall clock,
monotonic
clock, thread yielding, and Timer instantiation) clearly shows
why
it
needs
more careful consideration before making it public.
I agree that a more focused interface would be preferable.

As discussed, KIP-1247 now focuses only on Bytes, which is
straightforward
and uncontroversial. We shall address Time in a separate KIP
where
we
can
properly evaluate these design concerns you have raised.

When that discussion happens, your points about:

1. Separating the different time-related responsibilities
2. The fact that many classes only need (1) or (2)
3. The possibility of splitting out Timer instantiation
entirely

will be valuable input for designing a cleaner public API.

Thanks again for the feedback!

Best regards,
Siddhartha

On Wed, Dec 17, 2025 at 9:49 PM Sean Quah via dev <
[email protected]

wrote:

Hi Siddartha and Kirk,

Thank you for your thoughts. For future discussions, my issue
with
making
the `Time` interface public is that it tries to do 3-4
different
things
related to time depending on how you count them:
1. Provide a wall clock (`milliseconds`)
2. Provide a high resolution monotonic clock (`nanoseconds`,
`hiResClockMs`)
3. Provide methods for yielding the current thread (`sleep`,
`waitObject`,
`waitForFuture`)
4. Provide convenience methods for instantiating `Timer`s
(`timer`,
`timer`)

Many of the classes which take a `Time` only need (1),
especially
in
the
broker side, though it is arguable some of them ought to be
using
(2)
(eg.
KAFKA-19888 <
https://issues.apache.org/jira/browse/KAFKA-19888
).
I
would
be more supportive if `Time` was more focused and limited to
(1)
and
maybe
(2). I appreciate this is easier said than done since we have
to
mock
(1),
(2) and (3) together in tests. (4) could be split out entirely
since
we
don't mock `Timer`s at all. `KafkaStreams` in particular
seems to
mainly
use (1) with some occasional usage of (2).

Kind regards,
Sean

On Wed, Dec 17, 2025 at 6:38 AM Siddhartha Devineni <
[email protected]> wrote:

Hi all,

The KIP has been updated to include only the Bytes API to be
part
of
the
public API.

Here is the KIP's link again:








https://cwiki.apache.org/confluence/display/KAFKA/KIP-1247%3A+Make+Bytes+utils+class+part+of+the+public+API

Thanks and best regards,
Siddhartha

On Wed, Dec 17, 2025 at 11:36 AM Siddhartha Devineni <
[email protected]> wrote:

Hi Kirk,

Thank you for your suggestion.
Yes, that seems to be so.

Then, I will update the KIP to include only the Bytes API
to be
public.

Best regards,
Siddhartha

On Wed, Dec 17, 2025 at 6:44 AM Kirk True <
[email protected]>
wrote:

Hi Siddhartha,

It seems prudent to refocus this KIP on promoting the Bytes
API
to
be
public and then file a separate KIP for the Time API. It's
more
overhead,
but it unblock Bytes since Time seems to need a little more
work.

Thanks,
Kirk

On Tue, Dec 16, 2025, at 3:07 AM, Siddhartha Devineni
wrote:
Hi all,

Thank you for the feedback.

@Sean, I understand your concern about "Time" not being
suitable
for a
public API in its current state.
Could you elaborate on what specific issues make it a
"dumping
ground"?

Regarding your suggestion to exclude the Streams
constructors
accepting
"Time" from the public API - I want to clarify the
implications:
The constructor KafkaStreams(Topology, Properties, Time)
is
currently
public and has been available for several releases.
Making it non-public or removing it would be a breaking
change
that
would
affect any users currently using this constructor.

What do you have in mind?

1. Deprecate the constructor now and remove it in a future
major
version, or
2. Make it package-private (which would break existing
code
immediately)?

@Kirk, Thank you for pointing that out.
You're absolutely right that making "Time" public would
require
making
"Timer" public as well, since Time.timer() returns Timer
objects.
This does expand the scope considerably.

Given this expanding scope and Sean's concerns about the
Time
API
design,
would it make sense to split this KIP into two parts or
create
a
separate KIP for the "Time" API and its implications?

Best regards,
Siddhartha


On Tue, Dec 16, 2025 at 6:18 AM Kirk True <
[email protected]

wrote:

Hi all,

Sean: which parts of the Time API are the most clunky?
The
waitForFuture()
and waitObject() methods seem like they could be moved
elsewhere,
but
the
others seem OK.

Siddhartha: because the Time API creates Timer objects,
we'd
need to
promote Timer to the public API, too.

Thanks,
Kirk

On Fri, Dec 12, 2025, at 7:12 AM, Sean Quah via dev
wrote:
Hi Siddhartha,

Thanks for the KIP! I'm okay making `Bytes` public.
However,
the
`Time`
interface is a bit of a dumping ground for time-related
things
and I
would
not be in favor of making it public in its current
state.
Is it possible to exclude the streams constructors
accepting
`Time`s from
the public API instead?

Kind regards,
Sean Quah

On Sun, Dec 7, 2025 at 1:53 PM Siddhartha Devineni <
[email protected]> wrote:

Hello Kafka Community,

I would like to start a discussion on KIP-1247, which
proposes
to
officially make the "Bytes" and "Time" utils classes
part
of
Kafka's
public
API.

*KIP Link:*











https://cwiki.apache.org/confluence/display/KAFKA/KIP-1247%3A+Make+Bytes+and+Time+utils+classes+part+of+the+public+API

*Background:*

Currently, "org.apache.kafka.common.utils.Bytes" and
"org.apache.kafka.common.utils.Time" are exposed
through
numerous
public
API interfaces in Kafka Streams and other components,
yet
they
are not
officially designated as public API since the utils
package
is
not
included
in Javadoc generation.

This creates confusion for users who cannot determine
if
these
classes
are
officially supported, and causes broken Javadoc
references.

*Proposal:*

This KIP proposes to:

    1. Include "Bytes" and "Time" in Javadoc generation,
officially
making
    them part of the public API
    2. Move other internal utility classes to an
"internals"
subpackage
to
    prevent similar issues in the future



*Impact:*This change has no compatibility impact - all
classes
remain
in
their current locations and no user code changes are
required.

You can find more details in the attached KIP link.
Looking forward to your thoughts.

Thank you.

Best regards.
Siddhartha




















Reply via email to