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
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> noticed were
>>>>>>>>>>>>>>>>>>>>> deprecated in KIP-328, so you'll see
>>>>
>>>> what I'm
>>>>>>>
>>>>>>> talking
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> about when you
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> pull
>>>>>>>>>>>>>>>>>>>>> trunk again.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> 7. Any method taking a Duration
>>>
>>> argument
>>>> may
>>>>>>>
>>>>>>> throw an
>>>>>>>>>>>>>>>>>>>>> IllegalArgumentException (we choose to
>>>>
>>>> convert
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> ArithmeticException to
>>>>>>>>>>>>>>>>>>>>> IllegalArgumentException, as I
>>>
>>> mentioned
>>>> in
>>>>>>>
>>>>>>> the Jira
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> ticket). We
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> don't
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> need
>>>>>>>>>>>>>>>>>>>>> a "throws" declaration, but we should
>>>>
>>>> plan to
>>>>>>>
>>>>>>> mention this
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> in the
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> javadoc
>>>>>>>>>>>>>>>>>>>>> for those methods.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> 8. In Stores, windowSize and
>>>>
>>>> segmentInterval
>>>>>>>
>>>>>>> should also be
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> durations.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> 9. In StreamsMetrics, recordLatency
>>>>
>>>> could be
>>>>>>>
>>>>>>> just a
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Duration, but I
>>>>>>>>>>>>>>>>>>>>> actually think this one is better left
>>>>
>>>> alone.
>>>>>>>
>>>>>>> IMO, it's
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> more effort
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>> little gain to require users to
>>>>
>>>> construct a
>>>>>>>
>>>>>>> Duration
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> before they
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> call the
>>>>>>>>>>>>>>>>>>>>> method, since they vary likely call
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> System.currentTimeNanos before
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>> after the code in question.
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> These are quite a few notes, but
>>>
>>> they're
>>>> all
>>>>>>>
>>>>>>> minor.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Overall the KIP
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> looks
>>>>>>>>>>>>>>>>>>>>> really good to me. Thanks for picking
>>>>
>>>> this up!
>>>>>>>>>>>>>>>>>>>>> -John
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> On Thu, Aug 16, 2018 at 9:55 AM Nikolay
>>>>>>>
>>>>>>> Izhikov <
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> nizhi...@apache.org
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Hello, Kafka developers.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> I would like to start a discussion of
>>>>>>>
>>>>>>> KIP-358 [1].
>>>>>>>>>>>>>>>>>>>>>> It based on a ticket KAFKA-7277 [2].
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> I crawled through Stream API and made
>>>>
>>>> my
>>>>>>>
>>>>>>> suggestions for
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> API
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> changes.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> I have several questions about
>>>
>>> changes.
>>>>>>>>>>>>>>>>>>>>>> Please, share your comments:
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> 1. I propose do not remove existing
>>>
>>> API
>>>>>>>
>>>>>>> methods with
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> long ms
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> parameters.
>>>>>>>>>>>>>>>>>>>>>> Is it correct?
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> 2. Should we mark existing methods as
>>>>>>>
>>>>>>> deprecated?
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> 3. Suggested changes in ticket
>>>>
>>>> description
>>>>>>>
>>>>>>> are `long
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> durationMs` to
>>>>>>>>>>>>>>>>>>>>>> `Duration duration` and similar.
>>>>>>>>>>>>>>>>>>>>>> I suggest to change 'long
>>>
>>> startTimeMs`
>>>> to
>>>>>>>
>>>>>>> `LocalDateTime
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> startTime`
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> also.
>>>>>>>>>>>>>>>>>>>>>> Should we do it?
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Please, note, it very first KIP for
>>>>
>>>> me, so
>>>>>>>
>>>>>>> tell me if I
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> miss
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> something
>>>>>>>>>>>>>>>>>>>>>> obvious for experienced Kafka
>>>>
>>>> developers.
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> [1]
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>
>>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-
>>>>
>>>> 358%3A+Migrate+Streams+API+to+Duration+instead+of+long+ms+times
>>>>>>>>>>>>>>>>>>>>>> [2]
>>>>>>>
>>>>>>> https://issues.apache.org/jira/browse/KAFKA-7277
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>
>>>>>
>>>
>>>
>>>
>>> --
>>> -- Guozhang

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to