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