Great! I did not double check the ReadOnlySessionStore interface before, and just assumed it would take a timestamp, too. My bad.
Please update the KIP for ReadOnlyWindowStore and WindowStore. I like the KIP as-is. Feel free to start a VOTE thread. Even if there might be minor follow up comments, we can vote in parallel. -Matthias On 9/12/18 1:06 PM, John Roesler wrote: > Hi Nikolay, > > Yes, the changes we discussed for ReadOnlyXxxStore and XxxStore should be > in this KIP. > > And you're right, it seems like ReadOnlySessionStore is not necessary to > touch, since it doesn't reference any `long` timestamps. > > Thanks, > -John > > On Wed, Sep 12, 2018 at 4:36 AM Nikolay Izhikov <nizhi...@apache.org> wrote: > >> Hello, Matthias. >> >>> His proposal is, to deprecate existing methods on `ReadOnlyWindowStore`> >> and `ReadOnlySessionStore` and add them to `WindowStore` and> `SessionStore` >>> Does this make sense? >> >> You both are experienced Kafka developers, so yes, it does make a sense to >> me :). >> Do we want to make this change in KIP-358 or it required another KIP? >> >>> Btw: the KIP misses `ReadOnlySessionStore` atm. >> >> Sorry, but I don't understand you. >> As far as I can see, there is only 2 methods in `ReadOnlySessionStore`. >> Which method should be migrated to Duration? >> >> >> https://github.com/apache/kafka/blob/trunk/streams/src/main/java/org/apache/kafka/streams/state/ReadOnlySessionStore.java >> >> В Вт, 11/09/2018 в 09:21 -0700, Matthias J. Sax пишет: >>> I talked to John offline about his last suggestions, that I originally >>> did not fully understand. >>> >>> His proposal is, to deprecate existing methods on `ReadOnlyWindowStore` >>> and `ReadOnlySessionStore` and add them to `WindowStore` and >>> `SessionStore` (note, all singular -- not to be confused with classes >>> names plural). >>> >>> Btw: the KIP misses `ReadOnlySessionStore` atm. >>> >>> The argument is, that the `ReadOnlyXxxStore` interfaces are only exposed >>> via Interactive Queries feature and for this part, using `long` is >>> undesired. However, for a `Processor` that reads/writes stores on the >>> hot code path, we would like to avoid the object creation overhead and >>> stay with `long`. Note, that a `Processor` would use the "read-write" >>> interfaces and thus, we can add the more efficient read methods using >>> `long` there. >>> >>> Does this make sense? >>> >>> >>> -Matthias >>> >>> On 9/11/18 12:20 AM, Nikolay Izhikov wrote: >>>> Hello, Guozhang, Bill. >>>> >>>>> 1) I'd suggest keeping `Punctuator#punctuate(long timestamp)` as is >>>> >>>> I am agree with you. >>>> Currently, `Punctuator` edits are not included in KIP. >>>> >>>>> 2) I'm fine with keeping KeyValueStore extending >> ReadOnlyKeyValueStore >>>> >>>> Great, currently, there is no suggested API change in `KeyValueStore` >> or `ReadOnlyKeyValueStore`. >>>> >>>> Seems, you agree with all KIP details. >>>> Can you vote, please? [1] >>>> >>>> [1] >> https://lists.apache.org/thread.html/e976352e7e42d459091ee66ac790b6a0de7064eac0c57760d50c983b@%3Cdev.kafka.apache.org%3E >>>> >>>> >>>> В Пн, 10/09/2018 в 19:49 -0400, Bill Bejeck пишет: >>>>> Hi Nikolay, >>>>> >>>>> I'm a +1 to points 1 and 2 above from Guozhang. >>>>> >>>>> Thanks, >>>>> Bill >>>>> >>>>> On Mon, Sep 10, 2018 at 6:58 PM Guozhang Wang <wangg...@gmail.com> >> wrote: >>>>> >>>>>> Hello Nikolay, >>>>>> >>>>>> Thanks for picking this up! Just sharing my two cents: >>>>>> >>>>>> 1) I'd suggest keeping `Punctuator#punctuate(long timestamp)` as >> is since >>>>>> comparing with other places where we are replacing with Duration >> and >>>>>> Instant, this is not a user specified value as part of the DSL but >> rather a >>>>>> passed-in parameter, plus with high punctuation frequency creating >> a new >>>>>> instance of Instant may be costly. >>>>>> >>>>>> 2) I'm fine with keeping KeyValueStore extending >> ReadOnlyKeyValueStore with >>>>>> APIs of `long` as well as inheriting APIs of `Duration`. >>>>>> >>>>>> >>>>>> Guozhang >>>>>> >>>>>> >>>>>> On Mon, Sep 10, 2018 at 11:11 AM, Nikolay Izhikov < >> nizhi...@apache.org> >>>>>> wrote: >>>>>> >>>>>>> Hello, Matthias. >>>>>>> >>>>>>>> (4) While I agree that we might want to deprecate it, I am not >> sure if >>>>>>> >>>>>>> this should be part of this KIP? >>>>>>>> Seems to be unrelated? >>>>>>>> Should this have been part of KIP-319? >>>>>>>> If yes, we might still want to updated this other KIP? WDYT? >>>>>>> >>>>>>> OK, I removed this deprecation from this KIP. >>>>>>> >>>>>>> Please, tell me, is there anything else that should be improved >> to make >>>>>>> this KIP ready to be implemented. >>>>>>> >>>>>>> В Пт, 07/09/2018 в 17:06 -0700, Matthias J. Sax пишет: >>>>>>>> (1) Sounds good to me, to just use IllegalArgumentException >> for both -- >>>>>>>> and thanks for pointing out that Duration can be negative and >> we need >>>>>> >>>>>> to >>>>>>>> check for this. For the KIP, it would be nice to add to all >> methods >>>>>> >>>>>> than >>>>>>>> (even if we don't do it in the code but only document in >> JavaDocs). >>>>>>>> >>>>>>>> (2) I would argue for a new single method interface. Not sure >> about the >>>>>>>> name though. >>>>>>>> >>>>>>>> (3) Even if `#fetch(K, K, long, long)` and `#fetchAll(long, >> long)` is >>>>>>>> _currently_ not used internally, I would still argue they are >> both dual >>>>>>>> use -- we might all a new DSL operator at any point that uses >> those >>>>>>>> methods. Thus to be "future prove" I would consider them dual >> use. >>>>>>>> >>>>>>>>> Since the ReadOnlyWindowStore is only used by IQ, >>>>>>>> >>>>>>>> This contradicts your other statement: >>>>>>>> >>>>>>>>> org.apache.kafka.streams.state.ReadOnlyWindowStore#fetch(K, >> long) is >>>>>>> >>>>>>> used >>>>>>>>> in KStreamWindowAggregate. >>>>>>>> >>>>>>>> Or do you suggest to move `fetch(K, long)` from >> `ReadOnlyWindowStore` >>>>>> >>>>>> to >>>>>>>> `WindowStore` ? This would not make sense IMHO, as >> `WindowStore extends >>>>>>>> ReadOnlyWindowStore` and thus, we would loose this method for >> IQ. >>>>>>>> >>>>>>>> >>>>>>>> (4) While I agree that we might want to deprecate it, I am not >> sure if >>>>>>>> this should be part of this KIP? Seems to be unrelated? Should >> this >>>>>> >>>>>> have >>>>>>>> been part of KIP-319? If yes, we might still want to updated >> this other >>>>>>>> KIP? WDYT? >>>>>>>> >>>>>>>> >>>>>>>> -Matthias >>>>>>>> >>>>>>>> >>>>>>>> On 9/7/18 12:09 PM, John Roesler wrote: >>>>>>>>> Hey all, >>>>>>>>> >>>>>>>>> (1): Duration can be negative, just like long. We need to >> enforce any >>>>>>>>> bounds that we currently enforce. We don't need the `throws` >>>>>>> >>>>>>> declaration >>>>>>>>> for runtime exceptions, but the potential >> IllegalArgumentException >>>>>>> >>>>>>> should >>>>>>>>> be documented in the javadoc for these methods. I still feel >> that >>>>>>> >>>>>>> surfacing >>>>>>>>> the ArithmeticException directly would not be a great >> experience, so >>>>>> >>>>>> I >>>>>>>>> still advocate for wrapping it in an >> IllegalArgumentException that >>>>>>> >>>>>>> explains >>>>>>>>> our upper bound for Duration is "max-long number of >> milliseconds" >>>>>>>>> >>>>>>>>> (2): I agree with your performance intuition. I don't think >> creating >>>>>>> >>>>>>> one >>>>>>>>> object per call to punctuate is going to substantially >> affect the >>>>>>>>> performance. >>>>>>>>> >>>>>>>>> I think the deeper problem with Punctuator is that it's >> currently a >>>>>> >>>>>> SAM >>>>>>>>> interface. If we add a new method to it, we break the source >> code of >>>>>>> >>>>>>> anyone >>>>>>>>> passing a function. We can add the new method with a default >>>>>>>>> implementation, as Nikolay suggested, but then you get into >> figuring >>>>>>> >>>>>>> out >>>>>>>>> which one to default, and no one's happy. Alternatively, we >> can just >>>>>>> >>>>>>> make a >>>>>>>>> brand new interface that is still a single method (but an >> Instant) >>>>>> >>>>>> and >>>>>>> add >>>>>>>>> the appropriate overloads and deprecate the old ones. >>>>>>>>> >>>>>>>>> (3): I disagree. I think only two methods are dual use, and >> we should >>>>>>>>> separate the internal from external usages. The internal >> usage should >>>>>>> >>>>>>> be >>>>>>>>> added to WindowStore. >>>>>>>>> org.apache.kafka.streams.state.ReadOnlyWindowStore#fetch(K, >> long) is >>>>>>> >>>>>>> used >>>>>>>>> in KStreamWindowAggregate. >>>>>>>>> org.apache.kafka.streams.state.ReadOnlyWindowStore#fetch(K, >> long, >>>>>>> >>>>>>> long) is >>>>>>>>> used in KStreamKStreamJoin. >>>>>>>>> Both of these usages are as WindowStore, so adding these >> interfaces >>>>>> >>>>>> to >>>>>>>>> WindowStore would be transparent. >>>>>>>>> >>>>>>>>> org.apache.kafka.streams.state.ReadOnlyWindowStore#fetch(K, >> K, long, >>>>>>> >>>>>>> long) >>>>>>>>> is only used for IQ >>>>>>>>> >> org.apache.kafka.streams.state.ReadOnlyWindowStore#fetchAll(long, >>>>>>> >>>>>>> long) is >>>>>>>>> only used for IQ >>>>>>>>> >>>>>>>>> Since the ReadOnlyWindowStore is only used by IQ, we can >> safely say >>>>>>> >>>>>>> that >>>>>>>>> *all* of its methods are external use and can be deprecated >> and >>>>>>> >>>>>>> replaced. >>>>>>>>> The first two usages I noted are WindowStore usages, not >>>>>>>>> ReadOnlyWindowStores, and WindowStore is only used >> *internally*, so >>>>>>> >>>>>>> it's >>>>>>>>> free to offer `long` methods if needed for performance >> reasons. >>>>>>>>> >>>>>>>>> Does this make sense? The same reasoning extends to the >> other stores. >>>>>>>>> >>>>>>>>> (4) Yes, that was my suggestion. I'm not sure if anyone is >> actually >>>>>>> >>>>>>> using >>>>>>>>> this variant, so it seemed like a good time to just >> deprecate it and >>>>>>> >>>>>>> see. >>>>>>>>> >>>>>>>>> Thoughts? >>>>>>>>> -John >>>>>>>>> >>>>>>>>> >>>>>>>>> On Fri, Sep 7, 2018 at 10:21 AM Nikolay Izhikov < >> nizhi...@apache.org >>>>>>> >>>>>>> wrote: >>>>>>>>> >>>>>>>>>> Hello, Matthias. >>>>>>>>>> >>>>>>>>>> Thanks, for feedback. >>>>>>>>>> >>>>>>>>>>> (1) Some methods declare `throws >> IllegalArgumentException`, >>>>>> >>>>>> others> >>>>>>>>>> >>>>>>>>>> don't. >>>>>>>>>> >>>>>>>>>> `duration.toMillis()` can throw ArithmeticException. >>>>>>>>>> It can happen if overflow occurs during conversion. >>>>>>>>>> Please, see source of jdk method Duration#toMillis. >>>>>>>>>> Task author suggest to wrap it to IllegalArgumentException. >>>>>>>>>> I think we should add `throws IllegalArgumentException` >> for all >>>>>>> >>>>>>> method >>>>>>>>>> with Duration parameter. >>>>>>>>>> (I updated KIP with this throws) >>>>>>>>>> >>>>>>>>>> What do you think? >>>>>>>>>> >>>>>>>>>>> (3) ReadOnlyWindowStore: All three methods are dual use >> and I >>>>>>> >>>>>>> think we >>>>>>>>>> >>>>>>>>>> should not deprecate them. >>>>>>>>>> >>>>>>>>>> This is my typo, already fixed. >>>>>>>>>> I propose to add new methods to `ReadOnlyWindowStore`. >>>>>>>>>> No methods will become deprecated. >>>>>>>>>> >>>>>>>>>>> (4) Stores: 3 methods are listed as deprecated but only >> 2 new >>>>>>> >>>>>>> methods >>>>>>>>>> >>>>>>>>>> are added. >>>>>>>>>> >>>>>>>>>> My proposal based on John Roesler mail [1]: >>>>>>>>>> "10. Stores: I think we can just deprecate without >> replacement the >>>>>>> >>>>>>> method >>>>>>>>>> that takes `segmentInterval`." >>>>>>>>>> >>>>>>>>>> Is it wrong? >>>>>>>>>> >>>>>>>>>> [1] >>>>>> >>>>>> https://www.mail-archive.com/dev@kafka.apache.org/msg91348.html >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> В Чт, 06/09/2018 в 21:04 -0700, Matthias J. Sax пишет: >>>>>>>>>>> Thanks for updating the KIP! >>>>>>>>>>> >>>>>>>>>>> Couple of minor follow ups: >>>>>>>>>>> >>>>>>>>>>> (1) Some methods declare `throws >> IllegalArgumentException`, >>>>>> >>>>>> others >>>>>>>>>>> don't. It's runtime exception and thus it's not required >> to >>>>>>> >>>>>>> declare it >>>>>>>>>>> -- it just looks inconsistent in the KIP and maybe it's >>>>>>> >>>>>>> inconsistent in >>>>>>>>>>> the code, too. I am not sure if it is possible to >> provide a >>>>>>> >>>>>>> negative >>>>>>>>>>> Duration? If not, we would not need to check the >> provided value >>>>>>> >>>>>>> and can >>>>>>>>>>> remove the declaration. >>>>>>>>>>> >>>>>>>>>>> (2) About punctuations: I still think, it would be ok to >> change >>>>>> >>>>>> the >>>>>>>>>>> callback from `long` to `Instance` -- even if it is >> possible to >>>>>>> >>>>>>> register >>>>>>>>>>> a punctuation on a ms-basis, in practice many people used >>>>>>> >>>>>>> schedules in >>>>>>>>>>> the range of seconds or larger. Thus, I don't think >> there will >>>>>> >>>>>> be a >>>>>>>>>>> performance penalty. Of course, we can still revisit >> this later, >>>>>>> >>>>>>> too. >>>>>>>>>>> John and Bill, you did not comment on this. Would also >> be good to >>>>>>> >>>>>>> get >>>>>>>>>>> feedback from Guozhang about this. >>>>>>>>>>> >>>>>>>>>>> (3) ReadOnlyWindowStore: All three methods are dual use >> and I >>>>>>> >>>>>>> think we >>>>>>>>>>> should not deprecate them. However, we can add the new >> proposed >>>>>>> >>>>>>> methods >>>>>>>>>>> in parallel -- the names can be the same without >> conflict as the >>>>>>>>>>> parameter lists are different. (Or did you just forget >> to remove >>>>>>> >>>>>>> the >>>>>>>>>>> comment line?) >>>>>>>>>>> >>>>>>>>>>> (4) Stores: 3 methods are listed as deprecated but only >> 2 new >>>>>>> >>>>>>> methods >>>>>>>>>>> are added. Maybe this was discussed already, but I can't >> recall >>>>>>> >>>>>>> why? Can >>>>>>>>>>> you elaborate? Or should this deprecation be actually be >> part of >>>>>>> >>>>>>> KIP-328 >>>>>>>>>>> (\cc John)? >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Thanks, >>>>>>>>>>> >>>>>>>>>>> -Matthias >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> ps: there are many KIPs in-flight in parallel, and it >> takes some >>>>>>> >>>>>>> time to >>>>>>>>>>> get around. Please be patient :) >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On 9/5/18 12:25 AM, Nikolay Izhikov wrote: >>>>>>>>>>>> Hello, Guys. >>>>>>>>>>>> >>>>>>>>>>>> I've started a VOTE [1], but seems commiters have no >> chance to >>>>>>> >>>>>>> look at >>>>>>>>>> >>>>>>>>>> KIP for now. >>>>>>>>>>>> >>>>>>>>>>>> Can you tell me, is it OK? >>>>>>>>>>>> Should I wait for feedback? For how long? >>>>>>>>>>>> >>>>>>>>>>>> Or something in KIP should be improved before voting? >>>>>>>>>>>> >>>>>>>>>>>> [1] >>>>>>>>>> >>>>>>>>>> >>>>>> >>>>>> >> https://lists.apache.org/thread.html/e976352e7e42d459091ee66ac790b6 >>>>>>> a0de7064eac0c57760d50c983b@%3Cdev.kafka.apache.org%3E >>>>>>>>>>>> >>>>>>>>>>>> В Пт, 24/08/2018 в 10:36 -0700, Matthias J. Sax пишет: >>>>>>>>>>>>> It's tricky... :) >>>>>>>>>>>>> >>>>>>>>>>>>> Some APIs have "dual use" as I mentioned in my first >> reply. I >>>>>>> >>>>>>> agree >>>>>>>>>> >>>>>>>>>> that >>>>>>>>>>>>> it would be good to avoid abstract class and use >> interfaces >>>>>> >>>>>> if >>>>>>>>>> >>>>>>>>>> possible. >>>>>>>>>>>>> As long as the change is source code compatible, it >> should be >>>>>>> >>>>>>> fine >>>>>>>>>> >>>>>>>>>> IMHO >>>>>>>>>>>>> -- we need to document binary incompatibility of >> course. >>>>>>>>>>>>> >>>>>>>>>>>>> I think it's best, if the KIPs gets update with a >> proposal on >>>>>>> >>>>>>> how to >>>>>>>>>>>>> handle "dual use" parts. It's easier to discuss if >> it's >>>>>>> >>>>>>> written down >>>>>>>>>> >>>>>>>>>> IMHO. >>>>>>>>>>>>> >>>>>>>>>>>>> For `ProcessorContext#schedule()`, you are right >> John: it's >>>>>>> >>>>>>> seems >>>>>>>>>> >>>>>>>>>> fine >>>>>>>>>>>>> to use `Duration`, as it won't be called often >> (usually only >>>>>>> >>>>>>> within >>>>>>>>>>>>> `Processor#init()`) -- I mixed it up with >>>>>>>>>> >>>>>>>>>> `Punctuator#punctuate(long)`. >>>>>>>>>>>>> However, thinking about this twice, we might even >> want to >>>>>>> >>>>>>> update both >>>>>>>>>>>>> methods. Punctuation callbacks don't happen every >> millisecond >>>>>>> >>>>>>> and >>>>>>>>>> >>>>>>>>>> thus >>>>>>>>>>>>> the overhead to use `Instance` should not be a >> problem. >>>>>>>>>>>>> >>>>>>>>>>>>> @Nikolay: it seems the KIP does not mention >>>>>>>>>> >>>>>>>>>> `Punctuator#punctuate(long)` >>>>>>>>>>>>> -- should we add it? >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -Matthias >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> On 8/24/18 10:11 AM, John Roesler wrote: >>>>>>>>>>>>>> Quick afterthought: I guess that `Window` is >> exposed to the >>>>>>> >>>>>>> API via >>>>>>>>>>>>>> `Windowed` keys. I think it would be fine to not >> deprecate >>>>>>> >>>>>>> the >>>>>>>>>> >>>>>>>>>> `long` start >>>>>>>>>>>>>> and end, but add `Instant` variants for people >> preferring >>>>>>> >>>>>>> that >>>>>>>>>> >>>>>>>>>> interface. >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Fri, Aug 24, 2018 at 11:10 AM John Roesler < >>>>>>> >>>>>>> j...@confluent.io> >>>>>>>>>> >>>>>>>>>> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Hey Matthias, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Thanks for pointing that out. I agree that we >> only really >>>>>>> >>>>>>> need >>>>>>>>>> >>>>>>>>>> to change >>>>>>>>>>>>>>> methods that are API-facing, and we probably >> want to >>>>>> >>>>>> avoid >>>>>>> using >>>>>>>>>>>>>>> Duration/Instant for Streams-facing members. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Like I said in my last email, I think the whole >> Windows >>>>>>>>>> >>>>>>>>>> interface is >>>>>>>>>>>>>>> Streams-facing, and the builders we provide are >> otherwise >>>>>>>>>> >>>>>>>>>> API-facing. >>>>>>>>>>>>>>> Likewise, `Window` is Streams-facing, so start >> and end >>>>>>> >>>>>>> should >>>>>>>>>> >>>>>>>>>> not use >>>>>>>>>>>>>>> Duration. In SessionWindows, inactivityGap is >>>>>>> >>>>>>> Streams-facing. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I actually think that >> ProcessorContext#schedule() is >>>>>>> >>>>>>> API-facing, >>>>>>>>>> >>>>>>>>>> so it >>>>>>>>>>>>>>> should use Duration. The rationale is that >> streams >>>>>>> >>>>>>> processing >>>>>>>>>> >>>>>>>>>> doesn't call >>>>>>>>>>>>>>> this method, only implementer of Processor do. >> Does that >>>>>>> >>>>>>> seem >>>>>>>>>> >>>>>>>>>> right? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Also, it seems like ReadOnlyWindowStore#fetch() >> (2x) and >>>>>>>>>> >>>>>>>>>> #fetchAll() are >>>>>>>>>>>>>>> API-facing (for IQ). When we call fetch() during >>>>>>> >>>>>>> processing, >>>>>>>>>> >>>>>>>>>> it's actually >>>>>>>>>>>>>>> `WindowStore#fetch()`. Maybe we should move >>>>>>>>>> >>>>>>>>>> "WindowStoreIterator<V> fetch(K >>>>>>>>>>>>>>> key, long timeFrom, long timeTo)" to the >> WindowStore >>>>>>> >>>>>>> interface >>>>>>>>>> >>>>>>>>>> and make >>>>>>>>>>>>>>> all the ReadOnlyWindowStore methods take >> Durations. And >>>>>>> >>>>>>> likewise >>>>>>>>>> >>>>>>>>>> with the >>>>>>>>>>>>>>> SessionStore interfaces. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> What do you think? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>>> -John >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On Fri, Aug 24, 2018 at 10:51 AM John Roesler < >>>>>>> >>>>>>> j...@confluent.io> >>>>>>>>>> >>>>>>>>>> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Hi Nikolay, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> First: I wanted to let you know that we have >> dropped >>>>>> >>>>>> the >>>>>>>>>> >>>>>>>>>> `grace(long)` >>>>>>>>>>>>>>>> method from the Windows interface, but we do >> still need >>>>>>> >>>>>>> to >>>>>>>>>> >>>>>>>>>> transition the >>>>>>>>>>>>>>>> same method on TimeWindows and JoinWindows ( >>>>>>>>>>>>>>>> https://github.com/apache/kafka/pull/5536) >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I have also been thinking it would be nice to >> replace >>>>>>>>>> >>>>>>>>>> `Windows` with an >>>>>>>>>>>>>>>> interface, but for different reasons. I think >> we can >>>>>>> >>>>>>> even do >>>>>>>>>> >>>>>>>>>> it without >>>>>>>>>>>>>>>> breaking source compatibility (but it would >> break >>>>>> >>>>>> binary >>>>>>>>>> >>>>>>>>>> compatibility): >>>>>>>>>>>>>>>> create a new interface `WindowSpec`, deprecate >>>>>> >>>>>> `Windows` >>>>>>> and >>>>>>>>>> >>>>>>>>>> make it >>>>>>>>>>>>>>>> implement `WindowSpec`, add a new method: >>>>>>>>>>>>>>>> `KGroupedStream#windowedBy(WindowSpec)`, and >> deprecate >>>>>>> >>>>>>> the old >>>>>>>>>> >>>>>>>>>> one. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> However, I don't think this would solve your >> problem, >>>>>>> >>>>>>> since >>>>>>>>>> >>>>>>>>>> the Windows >>>>>>>>>>>>>>>> interface has two audiences: the DSL user and >> the >>>>>>> >>>>>>> implementer >>>>>>>>>> >>>>>>>>>> who wishes to >>>>>>>>>>>>>>>> provide a new kind of windowing. I think we >> want to >>>>>>> >>>>>>> provide >>>>>>>>>> >>>>>>>>>> Duration to the >>>>>>>>>>>>>>>> former, and long or Duration is fine for the >> latter. >>>>>>> >>>>>>> However, >>>>>>>>>> >>>>>>>>>> both of these >>>>>>>>>>>>>>>> audiences are "external", so having an >> "internal" >>>>>>> >>>>>>> interface >>>>>>>>>> >>>>>>>>>> won't fit the >>>>>>>>>>>>>>>> bill. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I think my last PR #5536 actually helps the >> situation >>>>>>> >>>>>>> quite a >>>>>>>>>> >>>>>>>>>> bit. Let's >>>>>>>>>>>>>>>> forget about the deprecated members. Now, all >> the >>>>>> >>>>>> public >>>>>>>>>> >>>>>>>>>> members of Windows >>>>>>>>>>>>>>>> are abstract methods, so Windows is >> effectively an >>>>>>> >>>>>>> interface >>>>>>>>>> >>>>>>>>>> now. Here's >>>>>>>>>>>>>>>> how it looks: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> public abstract class Windows<W extends >> Window> { >>>>>>>>>>>>>>>> public abstract Map<Long, W> windowsFor(final >> long >>>>>>> >>>>>>> timestamp); >>>>>>>>>>>>>>>> public abstract long size(); >>>>>>>>>>>>>>>> public abstract long gracePeriodMs(); >>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Notice that there is no part of this involved >> with the >>>>>>> >>>>>>> DSL. >>>>>>>>>> >>>>>>>>>> When you're >>>>>>>>>>>>>>>> writing a topology, you don't call any of these >>>>>> >>>>>> methods. >>>>>>> It's >>>>>>>>>> >>>>>>>>>> strictly an >>>>>>>>>>>>>>>> interface that tells a Windows implementation >> what >>>>>>> >>>>>>> Streams >>>>>>>>>> >>>>>>>>>> expects from it. >>>>>>>>>>>>>>>> A very simple implementation could have no >> builder >>>>>>> >>>>>>> methods at >>>>>>>>>> >>>>>>>>>> all and just >>>>>>>>>>>>>>>> return fixed answers to these method calls >> (this is >>>>>>> >>>>>>> basically >>>>>>>>>> >>>>>>>>>> what >>>>>>>>>>>>>>>> UnlimitedWindows does). It seems like, if we >> want to >>>>>> >>>>>> use >>>>>>> long >>>>>>>>>> >>>>>>>>>> millis >>>>>>>>>>>>>>>> internally, then we just need to leave Windows >> alone. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> What we do want to change is the builder >> methods in >>>>>>>>>> >>>>>>>>>> TimeWindows, >>>>>>>>>>>>>>>> JoinWindows, and UnlimitedWindows. For example, >>>>>>>>>> >>>>>>>>>> `TimeWindows#of(long)` >>>>>>>>>>>>>>>> would become `TimeWindows#of(Duration)`, etc. >> These are >>>>>>> >>>>>>> the >>>>>>>>>> >>>>>>>>>> DSL methods. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Does that make sense? >>>>>>>>>>>>>>>> -John >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On Thu, Aug 23, 2018 at 8:59 AM Nikolay >> Izhikov < >>>>>>>>>> >>>>>>>>>> nizhi...@apache.org> >>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Hello, Mathias. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Thanks for your feedback. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Thus, it might make sense to keep old and >> just add >>>>>>> >>>>>>> new >>>>>>>>>> >>>>>>>>>> ones? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> As far as I understand, we will keep old >> methods >>>>>>> >>>>>>> anyway to >>>>>>>>>> >>>>>>>>>> prevent >>>>>>>>>>>>>>>>> public API backward compatibility. >>>>>>>>>>>>>>>>> I agree with you, methods that used >> internally >>>>>>> >>>>>>> shouldn't be >>>>>>>>>> >>>>>>>>>> deprecated. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> End users can use the "nicer" new ones, >> while we >>>>>> >>>>>> can >>>>>>> still >>>>>>>>>> >>>>>>>>>> use the >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> existing ones internally? >>>>>>>>>>>>>>>>>> Not sure if it would be possible to keep >> the old >>>>>> >>>>>> ones >>>>>>>>>> >>>>>>>>>> without exposing >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> them as public API? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I think, when we decide to remove methods >> with `long` >>>>>>> >>>>>>> from >>>>>>>>>> >>>>>>>>>> public API, >>>>>>>>>>>>>>>>> we can do the following: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> 1. Create an interface like >> `WindowsInternal`. >>>>>>>>>>>>>>>>> 2. Change Windows to an interface. >>>>>>>>>>>>>>>>> 3. Create package-private implementation >>>>>> >>>>>> `WindowsImpl`. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> ``` >>>>>>>>>>>>>>>>> package org.apache.kafka.streams. >>>>>>> >>>>>>> kstream.internals; >>>>>>>>>>>>>>>>> public interface WindowsInternal { >>>>>>>>>>>>>>>>> public long start(); >>>>>>>>>>>>>>>>> public long end(); >>>>>>>>>>>>>>>>> //etc... >>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> package >> org.apache.kafka.streams.kstream; >>>>>>>>>>>>>>>>> public interface Windows<W extends >> Window> { >>>>>>>>>>>>>>>>> public Instant start(); >>>>>>>>>>>>>>>>> public Instant end(); >>>>>>>>>>>>>>>>> //... >>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> class WindowsImpl<W extends Window> >>>>>> >>>>>> implements >>>>>>>>>> >>>>>>>>>> Windows<W>, >>>>>>>>>>>>>>>>> WindowsInternal { >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>> ``` >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> So, in public API we will expose only >> `Windows` >>>>>>> >>>>>>> interface >>>>>>>>>> >>>>>>>>>> and internally >>>>>>>>>>>>>>>>> we can use `WindowsInternal` >>>>>>>>>>>>>>>>> But, of course, this will be huge changes in >> public >>>>>>> >>>>>>> API. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Let me know what you think about this. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I think in this KIP we shouldn't deprecate >> methods, >>>>>>> >>>>>>> that are >>>>>>>>>> >>>>>>>>>> used >>>>>>>>>>>>>>>>> internally. >>>>>>>>>>>>>>>>> I changed it, now my proposal is just add new >>>>>> >>>>>> methods. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Please, let me know if anything more need to >> be done. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> В Ср, 22/08/2018 в 17:29 -0700, Matthias J. >> Sax >>>>>> >>>>>> пишет: >>>>>>>>>>>>>>>>>> Thanks a lot for the KIP. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> From my understanding, the idea of the KIP >> is to >>>>>>> >>>>>>> improve >>>>>>>>>> >>>>>>>>>> the public API >>>>>>>>>>>>>>>>>> at DSL level. However, not all public >> methods >>>>>> >>>>>> listed >>>>>>> are >>>>>>>>>> >>>>>>>>>> part of DSL >>>>>>>>>>>>>>>>>> level API, but part of runtime API. Those >> methods >>>>>> >>>>>> are >>>>>>>>>> >>>>>>>>>> called during >>>>>>>>>>>>>>>>>> processing and are on the hot code path. I >> am not >>>>>>> >>>>>>> sure, if >>>>>>>>>> >>>>>>>>>> we want to >>>>>>>>>>>>>>>>>> update those methods. We should carefully >> think >>>>>> >>>>>> about >>>>>>>>>> >>>>>>>>>> this, and >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> consider >>>>>>>>>>>>>>>>>> to keep Long/long type to keep runtime >> overhead >>>>>>> >>>>>>> small. >>>>>>>>>> >>>>>>>>>> Note, that the >>>>>>>>>>>>>>>>>> methods I mention are not required to >> specify a >>>>>>> >>>>>>> program >>>>>>>>>> >>>>>>>>>> using the DSL >>>>>>>>>>>>>>>>>> and thus is questionable if the DSL API >> would be >>>>>>> >>>>>>> improved >>>>>>>>>> >>>>>>>>>> if we change >>>>>>>>>>>>>>>>>> the methods. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> It's unfortunate, that some part of the >> public API >>>>>>> >>>>>>> stretch >>>>>>>>>> >>>>>>>>>> the DSL >>>>>>>>>>>>>>>>>> builder part as well as the runtime part... >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> This affects the following methods (please >> double >>>>>>> >>>>>>> check if >>>>>>>>>> >>>>>>>>>> I missed >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> any): >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> - Windows#windowsFor() >>>>>>>>>>>>>>>>>> - Window#start() >>>>>>>>>>>>>>>>>> - Window#end() >>>>>>>>>>>>>>>>>> - JoinWindows#windowFor() >>>>>>>>>>>>>>>>>> - SessionWindows#inactivitiyGap() >>>>>>>>>>>>>>>>>> - TimeWindows#windowFor() >>>>>>>>>>>>>>>>>> - UnlimitedWindows#windowFor() >>>>>>>>>>>>>>>>>> - ProcessorContext#schedule() >>>>>>>>>>>>>>>>>> - ReadOnlyWindowStore#fetch() (2x) and >> #fetchAll() >>>>>>>>>>>>>>>>>> - SessionStore#findSessions() (2x) >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> maybe >>>>>>>>>>>>>>>>>> - >> TimeWindowedDeserializer#getWindowSize() (it's >>>>>>> >>>>>>> unused >>>>>>>>>> >>>>>>>>>> atm, but I >>>>>>>>>>>>>>>>>> could imagine that it might be use on the >> hot code >>>>>>> >>>>>>> path in >>>>>>>>>> >>>>>>>>>> the furture) >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> So methods have "dual" use and might be >> called >>>>>>> >>>>>>> externally >>>>>>>>>> >>>>>>>>>> and >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> internally: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> - Window#start() >>>>>>>>>>>>>>>>>> - Window#end() >>>>>>>>>>>>>>>>>> - ReadOnlyWindowStore#fetch() (2x) and >> #fetchAll() >>>>>>>>>>>>>>>>>> - SessionStore#findSessions() (2x) >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Thus, it might make sense to keep old and >> just add >>>>>>> >>>>>>> new >>>>>>>>>> >>>>>>>>>> ones? End users >>>>>>>>>>>>>>>>>> can use the "nicer" new ones, while we can >> still >>>>>> >>>>>> use >>>>>>> the >>>>>>>>>> >>>>>>>>>> existing ones >>>>>>>>>>>>>>>>>> internally? Not sure if it would be >> possible to >>>>>> >>>>>> keep >>>>>>> the >>>>>>>>>> >>>>>>>>>> old ones >>>>>>>>>>>>>>>>>> without exposing them as public API? >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Let me know what you think about this. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> -Matthias >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On 8/21/18 11:41 PM, Nikolay Izhikov wrote: >>>>>>>>>>>>>>>>>>> Dear, commiters. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Please, pay attention to this KIP and >> share your >>>>>>> >>>>>>> opinion. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> В Вт, 21/08/2018 в 11:14 -0500, John >> Roesler >>>>>> >>>>>> пишет: >>>>>>>>>>>>>>>>>>>> I'll solicit more reviews. Let's get >> at least >>>>>> >>>>>> one >>>>>>>>>> >>>>>>>>>> committer to >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> chime in >>>>>>>>>>>>>>>>>>>> before we start a vote (since we need >> their >>>>>>> >>>>>>> approval >>>>>>>>>> >>>>>>>>>> anyway). >>>>>>>>>>>>>>>>>>>> -John >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> On Mon, Aug 20, 2018 at 12:39 PM >> Nikolay >>>>>> >>>>>> Izhikov >>>>>>> < >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> nizhi...@apache.org> >>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Hello, Ted. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Thanks for the comment. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> I've edit KIP and change proposal to >>>>>>> >>>>>>> `windowSize`. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Guys, any other comments? >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> В Вс, 19/08/2018 в 14:57 -0700, Ted >> Yu пишет: >>>>>>>>>>>>>>>>>>>>>> bq. // or just Duration >> windowSize(); >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> +1 to the above choice. >>>>>>>>>>>>>>>>>>>>>> The duration is obvious from the >> return >>>>>>> >>>>>>> type. For >>>>>>>>>> >>>>>>>>>> getter >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> methods, we >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> don't >>>>>>>>>>>>>>>>>>>>>> use get as prefix (as least for >> new code). >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> Cheers >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> On Sun, Aug 19, 2018 at 8:03 AM >> Nikolay >>>>>>> >>>>>>> Izhikov < >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> nizhi...@apache.org> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Hello, John. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Thank you very much for your >> feedback! >>>>>>>>>>>>>>>>>>>>>>> I've addressed all your comments. >>>>>>>>>>>>>>>>>>>>>>> Please, see my answers and let >> my know is >>>>>>>>>> >>>>>>>>>> anything in KIP >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> [1] needs to >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> be >>>>>>>>>>>>>>>>>>>>>>> improved. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> The correct choice is actually >>>>>>> >>>>>>> "Instant", not> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "LocalDateTime" >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> I've changed the methods >> proposed in KIP >>>>>>> >>>>>>> [1] to >>>>>>>>>> >>>>>>>>>> use Instant. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> I noticed some recent APIs >> are> missing >>>>>>> >>>>>>> (see >>>>>>>>>> >>>>>>>>>> KIP-328) >>>>>>>>>>>>>>>>>>>>>>>> those APIs were just added and >> have >>>>>>> >>>>>>> never been >>>>>>>>>> >>>>>>>>>> released... >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> you can >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> just >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> replace them. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> I've added new methods to KIP >> [1]. >>>>>>>>>>>>>>>>>>>>>>> Not released methods marked for >> remove. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> any existing method that's >> already >>>>>>> >>>>>>> deprecated, >>>>>>>>>> >>>>>>>>>> don't bother >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> transitioning it to Duration. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Fixed. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> IllegalArgumentException... we >> should >>>>>>> >>>>>>> plan to >>>>>>>>>> >>>>>>>>>> mention this >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> in the >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> javadoc for those methods. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Got it. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> In Stores, windowSize and >>>>>> >>>>>> segmentInterval >>>>>>>>>> >>>>>>>>>> should also be >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> durations. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Fixed. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> StreamsMetrics, recordLatency >> ... this >>>>>>> >>>>>>> one is >>>>>>>>>> >>>>>>>>>> better left >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> alone. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> OK. I removed this method from >> KIP [1]. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Two more questions question about >>>>>>> >>>>>>> implementation: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> 1. We have serveral methods >> without >>>>>>> >>>>>>> parameters. >>>>>>>>>>>>>>>>>>>>>>> In java we can't have two >> methods with >>>>>>>>>> >>>>>>>>>> parameters with the >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> same name. >>>>>>>>>>>>>>>>>>>>>>> It wouldn't compile. >>>>>>>>>>>>>>>>>>>>>>> So we have to rename new >> methods. Please, >>>>>>> >>>>>>> see >>>>>>>>>> >>>>>>>>>> suggested >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> names and share >>>>>>>>>>>>>>>>>>>>>>> your thoughts: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Windows { >>>>>>>>>>>>>>>>>>>>>>> long size() -> Duration >> windowSize(); >>>>>>>>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Window { >>>>>>>>>>>>>>>>>>>>>>> long start() -> Instant >> startTime(); >>>>>>>>>>>>>>>>>>>>>>> long end() -> Instant >> endTime(); >>>>>>>>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> SessionWindows { >>>>>>>>>>>>>>>>>>>>>>> long inactivityGap() -> >> Duration >>>>>>>>>> >>>>>>>>>> inactivityGapDuration(); >>>>>>>>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> TimeWindowedDeserializer { >>>>>>>>>>>>>>>>>>>>>>> Long getWindowSize() -> >> Duration >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> getWindowSizeDuration(); // or >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> just >>>>>>>>>>>>>>>>>>>>>>> Duration windowSize(); >>>>>>>>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> SessionBytesStoreSupplier { >>>>>>>>>>>>>>>>>>>>>>> long retentionPeriod() -> >> Duration >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> retentionPeriodDuration(); >>>>>>>>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> WindowBytesStoreSupplier { >>>>>>>>>>>>>>>>>>>>>>> long windowSize() -> Duration >>>>>>>>>> >>>>>>>>>> windowSizeDuration(); >>>>>>>>>>>>>>>>>>>>>>> long retentionPeriod() -> >> Duration >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> retentionPeriodDuration(); >>>>>>>>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> 2. Do we want to use Duration >> and Instant >>>>>>> >>>>>>> inside >>>>>>>>>> >>>>>>>>>> API >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> implementations? >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> IGNITE-7277: "Durations >> potentially >>>>>> >>>>>> worsen >>>>>>>>>> >>>>>>>>>> memory pressure >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> and gc >>>>>>>>>>>>>>>>>>>>>>> performance, so internally, we >> will still >>>>>>> >>>>>>> use >>>>>>>>>> >>>>>>>>>> longMs as the >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> representation." >>>>>>>>>>>>>>>>>>>>>>> IGNITE-7222: Duration used to >> store >>>>>>> >>>>>>> retention. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> [1] >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP- >>>>>>> >>>>>>> 358%3A+Migrate+Streams+API+to+Duration+instead+of+long+ms+times >>>>>>>>>>>>>>>>>>>>>>> [2] >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> https://github.com/apache/kafka/commit/ >>>>>>> >>>>>>> b3771ba22acad7870e38ff7f58820c5b50946787#diff- >>>>>>> 47289575d3e3e2449f27b3a7b6788e1aR64 >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> В Пт, 17/08/2018 в 14:46 -0500, >> John >>>>>>> >>>>>>> Roesler >>>>>>>>>> >>>>>>>>>> пишет: >>>>>>>>>>>>>>>>>>>>>>>> Hi Nikolay, >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> Thanks for this very nice KIP! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> To answer your questions: >>>>>>>>>>>>>>>>>>>>>>>> 1. Correct, we should not >> delete >>>>>> >>>>>> existing >>>>>>>>>> >>>>>>>>>> methods that >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> have been >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> released, >>>>>>>>>>>>>>>>>>>>>>>> but ... >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> 2. Yes, we should deprecate >> the 'long' >>>>>>>>>> >>>>>>>>>> variants so that we >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> can drop >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> them >>>>>>>>>>>>>>>>>>>>>>>> later on. Personally, I like >> to mention >>>>>>> >>>>>>> which >>>>>>>>>> >>>>>>>>>> version >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> deprecated the >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> method >>>>>>>>>>>>>>>>>>>>>>>> so everyone can see later on >> how long >>>>>>> >>>>>>> it's been >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> deprecated, but this >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> may >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> be >>>>>>>>>>>>>>>>>>>>>>>> controversial, so let's let >> other weigh >>>>>>> >>>>>>> in. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> 3. I think you're asking >> whether it's >>>>>>>>>> >>>>>>>>>> appropriate to drop >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> the "Ms" >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> suffix, >>>>>>>>>>>>>>>>>>>>>>>> and I think yes. So "long >>>>>>> >>>>>>> inactivityGapMs" >>>>>>>>>> >>>>>>>>>> would become >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "Duration >>>>>>>>>>>>>>>>>>>>>>>> inactivityGap". >>>>>>>>>>>>>>>>>>>>>>>> In the places where the >> parameter's >>>>>> >>>>>> name >>>>>>> is >>>>>>>>>> >>>>>>>>>> just >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "duration", I think >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> we >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> can >>>>>>>>>>>>>>>>>>>>>>>> pick something more >> descriptive (I >>>>>>> >>>>>>> realize it >>>>>>>>>> >>>>>>>>>> was already >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> "durationMs"; >>>>>>>>>>>>>>>>>>>>>>>> this is just a good time to >> improve >>>>>> >>>>>> it). >>>>>>>>>>>>>>>>>>>>>>>> Also, you're correct that we >> shouldn't >>>>>>> >>>>>>> use a >>>>>>>>>> >>>>>>>>>> Duration to >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> represent a >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> moment >>>>>>>>>>>>>>>>>>>>>>>> in time, like "startTime". The >> correct >>>>>>> >>>>>>> choice >>>>>>>>>> >>>>>>>>>> is actually >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "Instant", >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> not >>>>>>>>>>>>>>>>>>>>>>>> "LocalDateTime", though. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> https://stackoverflow.com/questions/32437550/whats-the- >>>>>>> >>>>>>> difference-between-instant-and-localdatetime >>>>>>>>>>>>>>>>>>>>>>>> explains why. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> I also had a few notes on the >> KIP >>>>>> >>>>>> itself: >>>>>>>>>>>>>>>>>>>>>>>> 4. You might want to pull >> trunk again. >>>>>> >>>>>> I >>>>>>>>>> >>>>>>>>>> noticed some >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> recent APIs are >>>>>>>>>>>>>>>>>>>>>>>> missing (see KIP-328). >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> 5. Speaking of KIP-328: those >> APIs were >>>>>>> >>>>>>> just >>>>>>>>>> >>>>>>>>>> added and >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> have never >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> been >>>>>>>>>>>>>>>>>>>>>>>> released, so there's no need to >>>>>>> >>>>>>> deprecate the >>>>>>>>>> >>>>>>>>>> methods, you >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> can just >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> replace >>>>>>>>>>>>>>>>>>>>>>>> them. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> 6. For any existing method >> that's >>>>>> >>>>>> already >>>>>>>>>> >>>>>>>>>> deprecated, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> don't bother >>>>>>>>>>>>>>>>>>>>>>>> transitioning it to Duration. >> I think >>>>>> >>>>>> the >>>>>>>>>> >>>>>>>>>> examples I >>>>>>>>>>>>>>>>> >>>>>>>>>>> >
signature.asc
Description: OpenPGP digital signature