Yes, Sean’s approach LGTM Would you mind updating the KIP?
Thanks! > Siddhartha Devineni <[email protected]> 於 2026年7月21日 下午3:21 寫道: > > Hi Chia-Ping, > > You are right that @SuppressWarnings is just a temporary workaround. > The fundamental issue remains: in version 5.0, when constructors become > package-private, internal Kafka code in other packages (KafkaProducer, > KafkaAdminClient, etc.) will lose access. > > Given these constraints, Sean's minimal public Time interface seems to be > the cleanest solution. > > Thanks. > >> On Tue, Jul 21, 2026 at 8:25 AM Chia-Ping Tsai <[email protected]> wrote: >> >> hi Siddhartha >> >> I might be misunderstanding the approach of this PR. The >> @SuppressWarnings("deprecation") annotation is just a temporary workaround >> for now, right? We will eventually face the same issue in version 5.0: how >> to create a Metrics instance with a specific Time object from another >> package. >> >> Best, >> Chia-Ping >> >>> On 2026/07/20 21:34:15 Siddhartha Devineni wrote: >>> Hi Chia-Ping and Sean, >>> >>> To clarify the earlier discussion, after further investigation, "Metrics" >>> doesn't call any "Time" methods directly, rather it just stores and >> passes >>> it to internal components (this.time = time on line 174). >>> >>> This means no officially public Javadoc class actually needs to call any >>> "Time" methods. >>> >>> So, we could simply: >>> 1. Deprecate Time-accepting constructors in "Metrics" and "KafkaStreams" >>> 2. Keep "Time" as internal API >>> 3. No new public interface needed >>> >>> I have already created a PR implementing this approach after >>> withdrawing the KIP >>> >>> https://github.com/apache/kafka/pull/22689 >>> >>> WDYT? >>> >>> Thanks and Best regards, >>> Siddhartha >>> >>> On Mon, Jul 20, 2026 at 8:02 PM Chia-Ping Tsai <[email protected]> >> wrote: >>> >>>> hi Alieh >>>> >>>> We could keep discussing on this mail thread. >>>> >>>> The solution provided by Sean is pretty good. Except for KafkaStreams, >> the >>>> others only use the `milliseconds` so we could have a new simple >> interface >>>> Time, which could be located at org.apache.kafka.common, to replace >> origin >>>> Time-accepting constructor >>>> >>>> Best, >>>> Chia-Ping >>>> >>>> On 2026/07/20 14:27:00 Alieh Saeedi via dev wrote: >>>>> Hi >>>>> >>>>> Why is the KIP marked as withdrawn if the discussion is still >> ongoing in >>>>> the same thread? >>>>> >>>>> -Alieh >>>>> >>>>> On Mon, Jul 20, 2026 at 3:31 PM Sean Quah via dev < >> [email protected]> >>>>> wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>> I was hoping we could avoid making Time public. Failing that, is it >>>>>> possible to reduce the public API surface further? I looked at >> Metrics >>>>>> before and it only wanted the wall clock (milliseconds()). Perhaps >>>>>> the other constructors are the same? >>>>>> We could perhaps have a very simple public Time interface only >> exposing >>>>>> milliseconds (effectively a wall clock interface) and an internal >> Time >>>>>> interface which extends it with other methods. >>>>>> >>>>>> Thanks, >>>>>> Sean >>>>>> >>>>>> On Mon, Jul 20, 2026 at 8:51 AM Chia-Ping Tsai < >> [email protected]> >>>>>> wrote: >>>>>> >>>>>>> hi all, >>>>>>> >>>>>>> I re-read the constructors, and I think deprecating the >>>> time-accepting >>>>>>> constructors will introduce huge changes to the codebase. >>>>>>> >>>>>>> Maybe we could just make Time public with a few methods, such as >>>>>>> milliseconds, nanoseconds, and sleep. Since Timer is not public, >> we >>>> could >>>>>>> add a helper method to Timer, like Timer.create(Time, ...), to >>>> replace >>>>>>> Time#timer(). >>>>>>> >>>>>>> WDYT? >>>>>>> >>>>>>> On 2026/04/23 20:57:19 Siddhartha Devineni wrote: >>>>>>>> Hi Chia-Ping, Kirk and Matthias, >>>>>>>> >>>>>>>> @Chia-Ping: You were right - after investigating, Time doesn't >>>> need to >>>>>> be >>>>>>>> public. >>>>>>>> >>>>>>>> @Kirk: You are right - the OAuth examples are instantiated via >>>>>>> reflection, >>>>>>>> not direct user code. >>>>>>>> >>>>>>>> @Matthias: Good points. I investigated whether Metrics can be >>>> changed >>>>>> to >>>>>>>> not expose Time. >>>>>>>> >>>>>>>> Findings: >>>>>>>> >>>>>>>> - new Metrics() - users call this (internally uses Time.SYSTEM) >>>>>>>> - new Metrics(Time time) and other variants - only called by >>>> internal >>>>>>> Kafka >>>>>>>> code (KafkaProducer, KafkaAdminClient, etc) and tests >>>>>>>> >>>>>>>> Proposed approach: >>>>>>>> >>>>>>>> - Withdraw KIP-1311 (Make Time public) >>>>>>>> - Create JIRA: "Deprecate Time-accepting constructors" >>>>>>>> - Deprecate Time constructors in both KafkaStreams and Metrics: >>>>>>>> - KafkaStreams(Topology, Properties, Time) >>>>>>>> - KafkaStreams(Topology, StreamsConfig, Time) >>>>>>>> - KafkaStreams(Topology, Properties, KafkaClientSupplier, >>>> Time) >>>>>>>> - Metrics(Time) >>>>>>>> - Metrics(MetricConfig, Time) >>>>>>>> - Metrics(MetricConfig, List<MetricsReporter>, Time) >>>>>>>> - (and other Metrics variants accepting Time) >>>>>>>> - In version 5.0, make these constructors package-private >>>>>>>> - Internal Kafka code continues using them >>>>>>>> >>>>>>>> Result: Time remains internal. >>>>>>>> >>>>>>>> Does this approach work? If so, I'll withdraw KIP-1311 and >> create >>>> the >>>>>>> JIRA. >>>>>>>> >>>>>>>> Thank you, >>>>>>>> Siddhartha >>>>>>>> >>>>>>>> On Tue, Apr 21, 2026 at 5:22 AM Matthias J. Sax < >> [email protected]> >>>>>>> wrote: >>>>>>>> >>>>>>>>> Thanks for the KIP. I am not sure if I understand why >>>>>>> `KafkaStreamsMock` >>>>>>>>> would be anything public? >>>>>>>>> >>>>>>>>> Also, why would we put it into some new `...test...` >> package? If >>>> we >>>>>>>>> change the package, we need to have `protected` access, >> which is >>>>>>> already >>>>>>>>> "semi-public"... >>>>>>>>> >>>>>>>>> If we want to keep `Time` internal, we would eventually make >> the >>>>>>>>> constructors that are marked deprecated, package-private, >> what >>>> allows >>>>>>> us >>>>>>>>> to add `org.apache.kafka.streams.KafkaStreamsMock` (same >> package >>>>>> name, >>>>>>>>> but int `test/` module) to still use these constructors, and >> the >>>>>>>>> corresponding unit test would use the new mock-factory >> instead of >>>>>>>>> calling `new`? >>>>>>>>> >>>>>>>>> For this case, the KIP does not need to mention anything >> about >>>>>>>>> `KafkaStreamsMock` as it's an helper in our `test/` module >> only, >>>> but >>>>>>> not >>>>>>>>> public API. -- If we want, we can still mention this plan on >> the >>>> KIP, >>>>>>>>> but atm the KIP is written in a way as if `KafkaStreamsMock` >>>> would >>>>>>>>> become public API, but to my understanding it should be an >>>>>> impl/testing >>>>>>>>> details only? >>>>>>>>> >>>>>>>>> Or did I misunderstand something? >>>>>>>>> >>>>>>>>> >>>>>>>>> Also wondering, if we could also change `Metrics` in a way, >> that >>>> we >>>>>>>>> would not need to make `Time` public to begin with? >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -Matthias >>>>>>>>> >>>>>>>>> On 4/20/26 4:53 PM, Kirk True wrote: >>>>>>>>>> Hi Siddhartha, >>>>>>>>>> >>>>>>>>>> The OAuth examples use Time in their constructors for unit >>>> tests. >>>>>>>>> They're not intended to be instantiated by any user code >> since >>>>>> they're >>>>>>> in >>>>>>>>> an internals package. >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> Kirk >>>>>>>>>> >>>>>>>>>> On Wed, Apr 15, 2026, at 8:52 AM, Siddhartha Devineni >> wrote: >>>>>>>>>>> Hi Chia-Ping, >>>>>>>>>>> >>>>>>>>>>> Sorry that i didn't mention the following examples in the >> KIP >>>>>>> earlier. >>>>>>>>>>> Now, I have updated the KIP with the following public >> packages >>>>>>> examples, >>>>>>>>>>> where "Time" is exposed in the public constructors: >>>>>>>>>>> >>>>>>>>>>> // couple of examples from multiple >>>>>>>>>>> "org.apache.kafka.common.metrics.Metrics.java" >> constructors >>>>>>>>>>> public Metrics(Time time) {} >>>>>>>>>>> public Metrics(MetricConfig defaultConfig, Time time) {} >>>>>>>>>>> >>>>>>>>>>> // in the public package >>>>>>> "org.apache.kafka.common.security.oauthbearer" >>>>>>>>>>> public JwtBearerJwtRetriever(Time time) {} >>>>>>>>>>> public ClientCredentialsJwtRetriever(Time time) {} >>>>>>>>>>> >>>>>>>>>>> Now, it should be clear. >>>>>>>>>>> Thanks for your time. >>>>>>>>>>> >>>>>>>>>>> Best regards, >>>>>>>>>>> Siddhartha >>>>>>>>>>> >>>>>>>>>>> On Tue, Apr 14, 2026 at 11:14 AM Chia-Ping Tsai < >>>>>> [email protected] >>>>>>>> >>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> hi Siddhartha >>>>>>>>>>>> >>>>>>>>>>>> Thanks for this KIP. >>>>>>>>>>>> >>>>>>>>>>>> What is the exact benefit of exposing Time as a public >> API? >>>> Since >>>>>>> this >>>>>>>>> KIP >>>>>>>>>>>> proposes deprecating KafkaStreams(Topology, Properties, >>>> Time), it >>>>>>> seems >>>>>>>>>>>> there are no public interfaces relying on it anymore. >>>>>>>>>>>> >>>>>>>>>>>> Thus, it should be fine to just keep Time as an internal >> API, >>>>>>> right? >>>>>>>>>>>> >>>>>>>>>>>> Best, >>>>>>>>>>>> Chia-Ping >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Siddhartha Devineni <[email protected]> 於 >>>>>> 2026年4月7日週二 >>>>>>>>>>>> 下午2:19寫道: >>>>>>>>>>>> >>>>>>>>>>>>> Apologies, as I forgot to add the link to the KIP: >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>> >>>>>>> >>>>>> >>>> >> https://urldefense.com/v3/__https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=406623925__;!!Ayb5sqE7!o-ar2zzpALvIzp5wF7s2E77bUw9C8CxXLU1JxqxsiiliVfUFzl_M8gIOcFoy3T1nFx5L78W0vA8d7XV_enMH$ >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> On Tue, Apr 7, 2026 at 9:13 AM Siddhartha Devineni < >>>>>>>>>>>>> [email protected]> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Hello everyone, >>>>>>>>>>>>>> >>>>>>>>>>>>>> I would like to start a discussion on [DISCUSS] >> KIP-1311: >>>> Make >>>>>>>>>>>> Time/Timer >>>>>>>>>>>>>> public API. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Following KIP-1247 (Make Bytes part of public API), the >>>> Time >>>>>>>>> interface >>>>>>>>>>>>> and >>>>>>>>>>>>>> Timer class are the next candidates from >>>>>>>>>>>> "org.apache.kafka.common.utils" >>>>>>>>>>>>> to >>>>>>>>>>>>>> be made officially public. Time is currently exposed >>>> through >>>>>>> public >>>>>>>>>>>> APIs >>>>>>>>>>>>>> (e.g., in clients, KafkaStreams constructors, etc) but >> not >>>>>>> officially >>>>>>>>>>>>>> designated as a public API. >>>>>>>>>>>>>> >>>>>>>>>>>>>> An earlier version of this KIP explored splitting Time >> into >>>>>>> focused >>>>>>>>>>>>>> interfaces (Clock, MonotonicClock, etc.), but this >> would >>>>>> require >>>>>>>>>>>>> rewriting >>>>>>>>>>>>>> thousands of method signatures across the Kafka >> codebase. >>>> The >>>>>>> simpler >>>>>>>>>>>>>> approach of making Time public as-is seems more >>>> appropriate to >>>>>>> avoid >>>>>>>>>>>>>> breaking changes. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Looking forward to your feedback. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Thank you, >>>>>>>>>>>>>> Siddhartha >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >>
