Thanks Jorge,

This KIP looks good to me!

-John

On Fri, Jul 3, 2020, at 03:19, Jorge Esteban Quilcate Otoya wrote:
> Hi John,
> 
> Thanks for the feedback.
> 
> I'd be happy to take the third option and consider moving methods to
> ReadOnlySessionStore as part of the KIP.
> Docs is updated to reflect these changes.
> 
> Cheers,
> Jorge.
> 
> On Thu, Jul 2, 2020 at 10:06 PM John Roesler <vvcep...@apache.org> wrote:
> 
> > Hey Jorge,
> >
> > Thanks for the details. That sounds like a mistake to me on both counts.
> >
> > I don’t think you need to worry about those depreciations. If the
> > interface methods aren’t deprecated, then the methods are not deprecated.
> > We should remove the annotations, but it doesn’t need to be in the kip.
> >
> > I think any query methods should have been in the ReadOnly interface. I
> > guess it’s up to you whether you want to:
> > 1. Add the reverse methods next to the existing methods (what you have in
> > the kip right now)
> > 2. Partially fix it by adding your new methods to the ReadOnly interface
> > 3. Fully fix the problem by moving the existing methods as well as your
> > new ones. Since  SessionStore extends ReadOnlySessionStore, it’s ok just to
> > move the definitions.
> >
> > I’m ok with whatever you prefer.
> >
> > Thanks,
> > John
> >
> > On Thu, Jul 2, 2020, at 11:29, Jorge Esteban Quilcate Otoya wrote:
> > > (sorry for the spam)
> > >
> > > Actually `findSessions` are only deprecated on `InMemorySessionStore`,
> > > which seems strange as RocksDB and interfaces haven't marked these
> > methods
> > > as deprecated.
> > >
> > > Any hint on how to handle this?
> > >
> > > Cheers,
> > >
> > > On Thu, Jul 2, 2020 at 4:57 PM Jorge Esteban Quilcate Otoya <
> > > quilcate.jo...@gmail.com> wrote:
> > >
> > > > @John: I can see there are some deprecations in there as well. Will
> > update
> > > > the KIP.
> > > >
> > > > Thanks,
> > > > Jorge
> > > >
> > > >
> > > > On Thu, Jul 2, 2020 at 3:29 PM Jorge Esteban Quilcate Otoya <
> > > > quilcate.jo...@gmail.com> wrote:
> > > >
> > > >> Thanks John.
> > > >>
> > > >> > it looks like there’s a revision error in which two methods are
> > > >> proposed for SessionStore, but seem like they should be in
> > > >> ReadOnlySessionStore. Do I read that right?
> > > >>
> > > >> Yes, I've opted to keep the new methods alongside the existing ones.
> > In
> > > >> the case of SessionStore, `findSessions` are in `SessionStore`, and
> > `fetch`
> > > >> are in `ReadOnlySessionStore`. If it makes more sense, I can move all
> > of
> > > >> them to ReadOnlySessionStore.
> > > >> Let me know what you think.
> > > >>
> > > >> Thanks,
> > > >> Jorge.
> > > >>
> > > >> On Thu, Jul 2, 2020 at 2:36 PM John Roesler <vvcep...@apache.org>
> > wrote:
> > > >>
> > > >>> Hi Jorge,
> > > >>>
> > > >>> Thanks for the update. I think this is a good plan.
> > > >>>
> > > >>> I just took a look at the KIP again, and it looks like there’s a
> > > >>> revision error in which two methods are proposed for SessionStore,
> > but seem
> > > >>> like they should be in ReadOnlySessionStore. Do I read that right?
> > > >>>
> > > >>> Otherwise, I’m happy with your proposal.
> > > >>>
> > > >>> Thanks,
> > > >>> John
> > > >>>
> > > >>> On Wed, Jul 1, 2020, at 17:01, Jorge Esteban Quilcate Otoya wrote:
> > > >>> > Quick update: KIP is updated with latest changes now.
> > > >>> > Will leave it open this week while working on the PR.
> > > >>> >
> > > >>> > Hope to open a new vote thread over the next few days if no
> > additional
> > > >>> > feedback is provided.
> > > >>> >
> > > >>> > Cheers,
> > > >>> > Jorge.
> > > >>> >
> > > >>> > On Mon, Jun 29, 2020 at 11:30 AM Jorge Esteban Quilcate Otoya <
> > > >>> > quilcate.jo...@gmail.com> wrote:
> > > >>> >
> > > >>> > > Thanks, John!
> > > >>> > >
> > > >>> > > Make sense to reconsider the current approach. I was heading in a
> > > >>> similar
> > > >>> > > direction while drafting the implementation. Metered, Caching,
> > and
> > > >>> other
> > > >>> > > layers will also have to get duplicated to build up new methods
> > in
> > > >>> `Stores`
> > > >>> > > factory, and class casting issues would appear on stores created
> > by
> > > >>> DSL.
> > > >>> > >
> > > >>> > > I will draft a proposal with new methods (move methods from
> > proposed
> > > >>> > > interfaces to existing ones) with default implementation in a KIP
> > > >>> update
> > > >>> > > and wait for Matthias to chime in to validate this approach.
> > > >>> > >
> > > >>> > > Jorge.
> > > >>> > >
> > > >>> > >
> > > >>> > > On Sat, Jun 27, 2020 at 4:01 PM John Roesler <
> > vvcep...@apache.org>
> > > >>> wrote:
> > > >>> > >
> > > >>> > >> Hi Jorge,
> > > >>> > >>
> > > >>> > >> Sorry for my silence, I've been absorbed with the 2.6 and 2.5.1
> > > >>> releases.
> > > >>> > >>
> > > >>> > >> The idea to separate the new methods into "mixin" interfaces
> > seems
> > > >>> > >> like a good one, but as we've discovered in KIP-614, it doesn't
> > work
> > > >>> > >> out that way in practice. The problem is that the store
> > > >>> implementations
> > > >>> > >> are just the base layer that get composed with other layers in
> > > >>> Streams
> > > >>> > >> before they can be accessed in the DSL. This is extremely
> > subtle, so
> > > >>> > >> I'm going to put everyone to sleep with a detailed explanation:
> > > >>> > >>
> > > >>> > >> For example, this is the mechanism by which all KeyValueStore
> > > >>> > >> implementations get added to Streams:
> > > >>> > >>
> > org.apache.kafka.streams.state.internals.KeyValueStoreBuilder#build
> > > >>> > >> return new MeteredKeyValueStore<>(
> > > >>> > >>   maybeWrapCaching(maybeWrapLogging(storeSupplier.get())),
> > > >>> > >>   storeSupplier.metricsScope(),
> > > >>> > >>   time,
> > > >>> > >>   keySerde,
> > > >>> > >>   valueSerde
> > > >>> > >> );
> > > >>> > >>
> > > >>> > >> In the DSL, the store that a processor gets from the context
> > would
> > > >>> be
> > > >>> > >> the result of this composition. So even if the
> > storeSupplier.get()
> > > >>> returns
> > > >>> > >> a store that implements the "reverse" interface, when you try to
> > > >>> use it
> > > >>> > >> from a processor like:
> > > >>> > >> org.apache.kafka.streams.kstream.ValueTransformerWithKey#init
> > > >>> > >> ReadOnlyBackwardWindowStore<K, V> store =
> > > >>> > >>   (ReadOnlyBackwardWindowStore<K, V>) context.getStateStore(..)
> > > >>> > >>
> > > >>> > >> You'd just get a ClassCastException because it's actually a
> > > >>> > >> MeteredKeyValueStore, which doesn't implement
> > > >>> > >> ReadOnlyBackwardWindowStore.
> > > >>> > >>
> > > >>> > >> The only way to make this work would be to make the Metered,
> > > >>> > >> Caching, and Logging layers also implement the new interfaces,
> > > >>> > >> but this effectively forces implementations to also implement
> > > >>> > >> the interface. Otherwise, the intermediate layers would have to
> > > >>> > >> cast the store in each method, like this:
> > > >>> > >> MeteredWindowStore#backwardFetch {
> > > >>> > >>   ((ReadOnlyBackwardWindowStore<K, V>)
> > innerStore).backwardFetch(..)
> > > >>> > >> }
> > > >>> > >>
> > > >>> > >> And then if the implementation doesn't "opt in" by implementing
> > > >>> > >> the interface, you'd get a ClassCastException, not when you get
> > the
> > > >>> > >> store, but when you try to use it.
> > > >>> > >>
> > > >>> > >> The fact that we get ClassCastExceptions no matter which way we
> > > >>> > >> turn here indicates that we're really not getting any benefit
> > from
> > > >>> the
> > > >>> > >> type system, which makes the extra interfaces seem not worth
> > all the
> > > >>> > >> code involved.
> > > >>> > >>
> > > >>> > >> Where we landed in KIP-614 is that, unless we want to completely
> > > >>> > >> revamp the way that StateStores work in the DSL, you might as
> > > >>> > >> well just add the new methods to the existing interfaces. To
> > prevent
> > > >>> > >> compilation errors, we can add default implementations that
> > throw
> > > >>> > >> UnsupportedOperationException. If a store doesn't opt in by
> > > >>> > >> implementing the methods, you'd get an
> > > >>> UnsupportedOperationException,
> > > >>> > >> which seems no worse, and maybe better, than the
> > ClassCastException
> > > >>> > >> you'd get if we go with the "mixin interface" approach.
> > > >>> > >>
> > > >>> > >> A quick note: This entire discussion focuses on the DSL. If
> > you're
> > > >>> just
> > > >>> > >> using the Processor API by directly adding the a custom store
> > to the
> > > >>> > >> Topology:
> > > >>> > >> org.apache.kafka.streams.Topology#addStateStore
> > > >>> > >> and then retrieving it in the processor via:
> > > >>> > >>
> > org.apache.kafka.streams.processor.ProcessorContext#getStateStore
> > > >>> > >> in
> > > >>> > >> org.apache.kafka.streams.processor.Processor#init
> > > >>> > >>
> > > >>> > >> Then, you can both register and retrieve _any_ StateStore
> > > >>> implementation.
> > > >>> > >> There's no need to use KeyValueStore or any other built-in
> > > >>> interface.
> > > >>> > >> In other words, KeyValueStore and company are only part of the
> > DSL,
> > > >>> > >> not the PAPI. So, discussions about the build-in store
> > interfaces
> > > >>> are only
> > > >>> > >> really relevant in the context of the DSL, Transformers, and
> > > >>> Materialized.
> > > >>> > >>
> > > >>> > >> So, in conclusion, I'd really recommend just adding any new
> > methods
> > > >>> to
> > > >>> > >> the existing store interfaces. We might be able to revamp the
> > API
> > > >>> in the
> > > >>> > >> future to support mixins, but it's a much larger scope of work
> > than
> > > >>> this
> > > >>> > >> KIP.
> > > >>> > >> A more minor comment is that we don't need to add Deprecated
> > > >>> variants
> > > >>> > >> of new methods.
> > > >>> > >>
> > > >>> > >> Thanks again, and once again, I'm sorry I tuned out and didn't
> > > >>> offer this
> > > >>> > >> feedback before you revised the KIP.
> > > >>> > >> -John
> > > >>> > >>
> > > >>> > >>
> > > >>> > >>
> > > >>> > >>
> > > >>> > >> On Mon, Jun 22, 2020, at 06:11, Jorge Esteban Quilcate Otoya
> > wrote:
> > > >>> > >> > Hi everyone,
> > > >>> > >> >
> > > >>> > >> > I've updated the KIP, applying Matthias' feedback regarding
> > > >>> interface
> > > >>> > >> > hierarchy.
> > > >>> > >> >
> > > >>> > >> > Also, following the last email, I think we can consider
> > reverse
> > > >>> > >> operations
> > > >>> > >> > on KeyValue range as well, as implementation supports
> > > >>> lexicographic
> > > >>> > >> order.
> > > >>> > >> >
> > > >>> > >> > I considered different naming between Key-based ranges and
> > > >>> Time-based
> > > >>> > >> > ranges, and mitigate confusion when fetching keys and time
> > ranges
> > > >>> as
> > > >>> > >> > WindowStore does:
> > > >>> > >> >
> > > >>> > >> > Key-based ranges: reverseRange(), reverseAll()
> > > >>> > >> > Time-based ranges: backwardFetch()
> > > >>> > >> >
> > > >>> > >> > Then, key-based changes apply to KeyValueStore, and time-based
> > > >>> changes
> > > >>> > >> to
> > > >>> > >> > Window and Session stores.
> > > >>> > >> >
> > > >>> > >> > Let me know if you have any questions.
> > > >>> > >> >
> > > >>> > >> > Thanks,
> > > >>> > >> > Jorge.
> > > >>> > >> >
> > > >>> > >> >
> > > >>> > >> > On Tue, Jun 16, 2020 at 12:47 AM Jorge Esteban Quilcate Otoya
> > <
> > > >>> > >> > quilcate.jo...@gmail.com> wrote:
> > > >>> > >> >
> > > >>> > >> > > Hi everyone, sorry for the late reply.
> > > >>> > >> > >
> > > >>> > >> > > Thanks Matthias for your feedback. I think it makes sense to
> > > >>> > >> reconsider
> > > >>> > >> > > the current design based on your input.
> > > >>> > >> > >
> > > >>> > >> > > After digging deeper into the current implementation, I'd
> > like
> > > >>> to
> > > >>> > >> bring my
> > > >>> > >> > > current understanding to be double-checked as it might be
> > > >>> redefining
> > > >>> > >> the
> > > >>> > >> > > KIP's scope:
> > > >>> > >> > >
> > > >>> > >> > > 1. There are 2 ranges been exposed by different stores:
> > > >>> > >> > >
> > > >>> > >> > > a. Key Range
> > > >>> > >> > > b. Timestamp Range
> > > >>> > >> > >
> > > >>> > >> > > So far, we have discussed covering both.
> > > >>> > >> > >
> > > >>> > >> > > 2. Key Range functions do not provide ordering guarantees by
> > > >>> design:
> > > >>> > >> > >
> > > >>> > >> > > ```ReadOnlyKeyValueStore.java
> > > >>> > >> > >     /**
> > > >>> > >> > >      * Get an iterator over a given range of keys. This
> > > >>> iterator must
> > > >>> > >> be
> > > >>> > >> > > closed after use.
> > > >>> > >> > >      * The returned iterator must be safe from {@link
> > > >>> > >> > > java.util.ConcurrentModificationException}s
> > > >>> > >> > >      * and must not return null values. No ordering
> > guarantees
> > > >>> are
> > > >>> > >> > > provided.
> > > >>> > >> > >      * ...
> > > >>> > >> > >      */
> > > >>> > >> > >      KeyValueIterator<K, V> range(K from, K to);
> > > >>> > >> > > ```
> > > >>> > >> > >
> > > >>> > >> > > Therefore, I'd propose removing Key range operations from
> > the
> > > >>> scope.
> > > >>> > >> > >
> > > >>> > >> > > 3. Timestamp Range operations happen at the SegmentsStore
> > level
> > > >>> > >> (internal)
> > > >>> > >> > > API
> > > >>> > >> > >
> > > >>> > >> > > AFAICT, Segments wrappers handle all Timestamp ranges
> > queries.
> > > >>> > >> > >
> > > >>> > >> > > I'd propose extending `Segments#segments(timeFrom, timeTo,
> > > >>> backwards)`
> > > >>> > >> > > with a flag for backwards operations.
> > > >>> > >> > >
> > > >>> > >> > > As segments returned will be processed backwards, I'm not
> > > >>> extending
> > > >>> > >> > > KeyValueStores to query each segment backwards as previous
> > > >>> point 2.
> > > >>> > >> > >
> > > >>> > >> > > 4. Extend WindowStores implementations with a new
> > > >>> > >> > > WindowBackwardStore/ReadOnlyBackwardStore:
> > > >>> > >> > >
> > > >>> > >> > > ```java
> > > >>> > >> > > public interface ReadOnlyWindowBackwardStore<K, V> {
> > > >>> > >> > >     WindowStoreIterator<V> backwardFetch(K key, Instant
> > from,
> > > >>> Instant
> > > >>> > >> to)
> > > >>> > >> > > throws IllegalArgumentException;
> > > >>> > >> > >
> > > >>> > >> > >     KeyValueIterator<Windowed<K>, V> backwardFetch(K from,
> > K to,
> > > >>> > >> Instant
> > > >>> > >> > > fromTime, Instant toTime)
> > > >>> > >> > >         throws IllegalArgumentException;
> > > >>> > >> > >
> > > >>> > >> > >     KeyValueIterator<Windowed<K>, V>
> > backwardFetchAll(Instant
> > > >>> from,
> > > >>> > >> > > Instant to) throws IllegalArgumentException;
> > > >>> > >> > > ```
> > > >>> > >> > >
> > > >>> > >> > > 5. SessionStore is a bit different as it has fetch/find
> > sessions
> > > >>> > >> spread
> > > >>> > >> > > between SessionStore and ReadOnlySessionStore.
> > > >>> > >> > >
> > > >>> > >> > > I'd propose a new interface `SessionBackwardStore` to expose
> > > >>> backward
> > > >>> > >> find
> > > >>> > >> > > operations:
> > > >>> > >> > >
> > > >>> > >> > > ```java
> > > >>> > >> > > public interface SessionBackwardStore<K, AGG> {
> > > >>> > >> > >     KeyValueIterator<Windowed<K>, AGG>
> > > >>> backwardFindSessions(final K
> > > >>> > >> key,
> > > >>> > >> > > final long earliestSessionEndTime, final long
> > > >>> latestSessionStartTime);
> > > >>> > >> > >
> > > >>> > >> > >     KeyValueIterator<Windowed<K>, AGG>
> > > >>> backwardFindSessions(final K
> > > >>> > >> > > keyFrom, final K keyTo, final long earliestSessionEndTime,
> > > >>> final long
> > > >>> > >> > > latestSessionStartTime);
> > > >>> > >> > > }
> > > >>> > >> > > ```
> > > >>> > >> > >
> > > >>> > >> > > If this understanding is correct I'll proceed to update the
> > KIP
> > > >>> based
> > > >>> > >> on
> > > >>> > >> > > this.
> > > >>> > >> > >
> > > >>> > >> > > Looking forward to your feedback.
> > > >>> > >> > >
> > > >>> > >> > > Thanks,
> > > >>> > >> > > Jorge.
> > > >>> > >> > >
> > > >>> > >> > > On Fri, May 29, 2020 at 3:32 AM Matthias J. Sax <
> > > >>> mj...@apache.org>
> > > >>> > >> wrote:
> > > >>> > >> > >
> > > >>> > >> > >> Hey,
> > > >>> > >> > >>
> > > >>> > >> > >> Sorry that I am late to the game. I am not 100% convinced
> > > >>> about the
> > > >>> > >> > >> current proposal. Using a new config as feature flag seems
> > to
> > > >>> be
> > > >>> > >> rather
> > > >>> > >> > >> "nasty" to me, and flipping from/to is a little bit too
> > fancy
> > > >>> for my
> > > >>> > >> > >> personal taste.
> > > >>> > >> > >>
> > > >>> > >> > >> I agree, that the original proposal using a "ReadDirection"
> > > >>> enum is
> > > >>> > >> not
> > > >>> > >> > >> ideal either.
> > > >>> > >> > >>
> > > >>> > >> > >> Thus, I would like to put out a new idea: We could add a
> > new
> > > >>> > >> interface
> > > >>> > >> > >> that offers new methods that return revers iterators.
> > > >>> > >> > >>
> > > >>> > >> > >> The KIP already proposes to add `reverseAll()` and it seems
> > > >>> backward
> > > >>> > >> > >> incompatible to just add this method to
> > > >>> `ReadOnlyKeyValueStore` and
> > > >>> > >> > >> `ReadOnlyWindowStore`. I don't think we could provide a
> > useful
> > > >>> > >> default
> > > >>> > >> > >> implementation for custom stores and thus either break
> > > >>> compatibility
> > > >>> > >> or
> > > >>> > >> > >> need add a default that just throws an exception. Neither
> > > >>> seems to
> > > >>> > >> be a
> > > >>> > >> > >> good option.
> > > >>> > >> > >>
> > > >>> > >> > >> Using a new interface avoid this issue and allows users
> > > >>> implementing
> > > >>> > >> > >> custom stores to opt-in by adding the interface to their
> > > >>> stores.
> > > >>> > >> > >> Furthermore, we don't need any config. In the end, we
> > > >>> encapsulte the
> > > >>> > >> > >> change into the store, and our runtime is agnostic to it
> > (as it
> > > >>> > >> should
> > > >>> > >> > >> be).
> > > >>> > >> > >>
> > > >>> > >> > >> The hierarchy becomes a little complex (but uses would not
> > > >>> really see
> > > >>> > >> > >> the complexity):
> > > >>> > >> > >>
> > > >>> > >> > >> // exsiting
> > > >>> > >> > >> ReadOnlyKeyValueStore
> > > >>> > >> > >> KeyValueStore extend StateStore, ReadOnlyKeyValueStore
> > > >>> > >> > >>
> > > >>> > >> > >>
> > > >>> > >> > >> // helper interface; users don't care
> > > >>> > >> > >> // need similar ones for other stores
> > > >>> > >> > >> ReverseReadOnlyKeyValueStore {
> > > >>> > >> > >>     KeyValueIterator<K, V> reverseRange(K from, K to);
> > > >>> > >> > >>     KeyValueIterator<K, V> reverseAll();
> > > >>> > >> > >> }
> > > >>> > >> > >>
> > > >>> > >> > >>
> > > >>> > >> > >> // two new user facing interfaces for kv-store
> > > >>> > >> > >> // need similar ones for other stores
> > > >>> > >> > >> ReadOnlyKeyValueStoreWithReverseIterators extends
> > > >>> > >> ReadOnlyKeyValueStore,
> > > >>> > >> > >> ReverseReadOnlyKeyValueStore
> > > >>> > >> > >>
> > > >>> > >> > >> KeyValueStoreWithReverseIterators extends KeyValueStore,
> > > >>> > >> > >> ReverseReadOnlyKeyValueStore
> > > >>> > >> > >>
> > > >>> > >> > >>
> > > >>> > >> > >> // updated (also internal)
> > > >>> > >> > >> // also need to update other built-in stores
> > > >>> > >> > >> RocksDB implements KeyValueStoreWithReverseIterators,
> > > >>> > >> BulkLoadingStore
> > > >>> > >> > >>
> > > >>> > >> > >>
> > > >>> > >> > >> In the end, user would only care about the two (for
> > kv-case)
> > > >>> new
> > > >>> > >> > >> interface that offer revers iterator (read only and
> > regular)
> > > >>> and can
> > > >>> > >> > >> cast stores accordingly in their Processors/Transformers or
> > > >>> via IQ.
> > > >>> > >> > >>
> > > >>> > >> > >>
> > > >>> > >> > >> Btw: if we add revers iterator for KeyValue and Window
> > store,
> > > >>> should
> > > >>> > >> we
> > > >>> > >> > >> do the same for Session store?
> > > >>> > >> > >>
> > > >>> > >> > >>
> > > >>> > >> > >>
> > > >>> > >> > >> This might be more code to write, but I believe it
> > provides the
> > > >>> > >> better
> > > >>> > >> > >> user experience. Thoughts?
> > > >>> > >> > >>
> > > >>> > >> > >>
> > > >>> > >> > >>
> > > >>> > >> > >> -Matthias
> > > >>> > >> > >>
> > > >>> > >> > >>
> > > >>> > >> > >>
> > > >>> > >> > >>
> > > >>> > >> > >> On 5/26/20 8:47 PM, John Roesler wrote:
> > > >>> > >> > >> > Sorry for my silence, Jorge,
> > > >>> > >> > >> >
> > > >>> > >> > >> > I've just taken another look, and I'm personally happy
> > with
> > > >>> the
> > > >>> > >> KIP.
> > > >>> > >> > >> >
> > > >>> > >> > >> > Thanks,
> > > >>> > >> > >> > -John
> > > >>> > >> > >> >
> > > >>> > >> > >> > On Tue, May 26, 2020, at 16:17, Jorge Esteban Quilcate
> > Otoya
> > > >>> wrote:
> > > >>> > >> > >> >> If no additional comments, I will proceed to start the a
> > > >>> vote
> > > >>> > >> thread.
> > > >>> > >> > >> >>
> > > >>> > >> > >> >> Thanks a lot for your feedback!
> > > >>> > >> > >> >>
> > > >>> > >> > >> >> On Fri, May 22, 2020 at 9:25 AM Jorge Esteban Quilcate
> > > >>> Otoya <
> > > >>> > >> > >> >> quilcate.jo...@gmail.com> wrote:
> > > >>> > >> > >> >>
> > > >>> > >> > >> >>> Thanks Sophie. I like the `reverseAll()` idea.
> > > >>> > >> > >> >>>
> > > >>> > >> > >> >>> I updated the KIP with your feedback.
> > > >>> > >> > >> >>>
> > > >>> > >> > >> >>>
> > > >>> > >> > >> >>>
> > > >>> > >> > >> >>> On Fri, May 22, 2020 at 4:22 AM Sophie Blee-Goldman <
> > > >>> > >> > >> sop...@confluent.io>
> > > >>> > >> > >> >>> wrote:
> > > >>> > >> > >> >>>
> > > >>> > >> > >> >>>> Hm, the case of `all()` does seem to present a
> > dilemma in
> > > >>> the
> > > >>> > >> case of
> > > >>> > >> > >> >>>> variable-length keys.
> > > >>> > >> > >> >>>>
> > > >>> > >> > >> >>>> In the case of fixed-length keys, you can just compute
> > > >>> the keys
> > > >>> > >> that
> > > >>> > >> > >> >>>> correspond
> > > >>> > >> > >> >>>> to the maximum and minimum serialized bytes, then
> > perform
> > > >>> a
> > > >>> > >> `range()`
> > > >>> > >> > >> >>>> query
> > > >>> > >> > >> >>>> instead of an `all()`. If your keys don't have a
> > > >>> well-defined
> > > >>> > >> > >> ordering
> > > >>> > >> > >> >>>> such
> > > >>> > >> > >> >>>> that
> > > >>> > >> > >> >>>> you can't determine the MAX_KEY, then you probably
> > don't
> > > >>> care
> > > >>> > >> about
> > > >>> > >> > >> the
> > > >>> > >> > >> >>>> iterator order anyway.
> > > >>> > >> > >> >>>>
> > > >>> > >> > >> >>>>  But with variable-length keys, there is no MAX_KEY.
> > If
> > > >>> all your
> > > >>> > >> > >> keys were
> > > >>> > >> > >> >>>> just
> > > >>> > >> > >> >>>> of the form 'a', 'aa', 'aaaaa', 'aaaaaaa' then in fact
> > > >>> the only
> > > >>> > >> way
> > > >>> > >> > >> to
> > > >>> > >> > >> >>>> figure out the
> > > >>> > >> > >> >>>> maximum key in the store is by using `all()` -- and
> > > >>> without a
> > > >>> > >> reverse
> > > >>> > >> > >> >>>> iterator, you're
> > > >>> > >> > >> >>>> doomed to iterate through every single key just to
> > answer
> > > >>> that
> > > >>> > >> simple
> > > >>> > >> > >> >>>> question.
> > > >>> > >> > >> >>>>
> > > >>> > >> > >> >>>> That said, I still think determining the iterator
> > order
> > > >>> based
> > > >>> > >> on the
> > > >>> > >> > >> >>>> to/from bytes
> > > >>> > >> > >> >>>> makes a lot of intuitive sense and gives the API a
> > nice
> > > >>> > >> symmetry.
> > > >>> > >> > >> What if
> > > >>> > >> > >> >>>> we
> > > >>> > >> > >> >>>> solved the `all()` problem by just giving `all()` a
> > > >>> reverse
> > > >>> > >> form to
> > > >>> > >> > >> >>>> complement it?
> > > >>> > >> > >> >>>> Ie we would have `all()` and `reverseAll()`, or
> > something
> > > >>> to
> > > >>> > >> that
> > > >>> > >> > >> effect.
> > > >>> > >> > >> >>>>
> > > >>> > >> > >> >>>> On Thu, May 21, 2020 at 3:41 PM Jorge Esteban Quilcate
> > > >>> Otoya <
> > > >>> > >> > >> >>>> quilcate.jo...@gmail.com> wrote:
> > > >>> > >> > >> >>>>
> > > >>> > >> > >> >>>>> Thanks John.
> > > >>> > >> > >> >>>>>
> > > >>> > >> > >> >>>>> Agree. I like the first approach as well, with
> > > >>> StreamsConfig
> > > >>> > >> flag
> > > >>> > >> > >> >>>> passing
> > > >>> > >> > >> >>>>> by via ProcessorContext.
> > > >>> > >> > >> >>>>>
> > > >>> > >> > >> >>>>> Another positive effect with "reverse parameters" is
> > > >>> that in
> > > >>> > >> the
> > > >>> > >> > >> case of
> > > >>> > >> > >> >>>>> `fetch(keyFrom, keyTo, timeFrom, timeTo)` users can
> > > >>> decide
> > > >>> > >> _which_
> > > >>> > >> > >> pair
> > > >>> > >> > >> >>>> to
> > > >>> > >> > >> >>>>> flip, whether with `ReadDirection` enum it apply to
> > both.
> > > >>> > >> > >> >>>>>
> > > >>> > >> > >> >>>>> The only issue I've found while reviewing the KIP is
> > that
> > > >>> > >> `all()`
> > > >>> > >> > >> won't
> > > >>> > >> > >> >>>> fit
> > > >>> > >> > >> >>>>> within this approach.
> > > >>> > >> > >> >>>>>
> > > >>> > >> > >> >>>>> We could remove it from the KIP and argue that for
> > > >>> WindowStore,
> > > >>> > >> > >> >>>>> `fetchAll(0, Long.MAX_VALUE)` can be used to get all
> > in
> > > >>> reverse
> > > >>> > >> > >> order,
> > > >>> > >> > >> >>>> and
> > > >>> > >> > >> >>>>> for KeyValueStore, no ordering guarantees are
> > provided.
> > > >>> > >> > >> >>>>>
> > > >>> > >> > >> >>>>> If there is consensus with this changes, I will go
> > and
> > > >>> update
> > > >>> > >> the
> > > >>> > >> > >> KIP.
> > > >>> > >> > >> >>>>>
> > > >>> > >> > >> >>>>> On Thu, May 21, 2020 at 3:33 PM John Roesler <
> > > >>> > >> vvcep...@apache.org>
> > > >>> > >> > >> >>>> wrote:
> > > >>> > >> > >> >>>>>
> > > >>> > >> > >> >>>>>> Hi Jorge,
> > > >>> > >> > >> >>>>>>
> > > >>> > >> > >> >>>>>> Thanks for that idea. I agree, a feature flag would
> > > >>> protect
> > > >>> > >> anyone
> > > >>> > >> > >> >>>>>> who may be depending on the current behavior.
> > > >>> > >> > >> >>>>>>
> > > >>> > >> > >> >>>>>> It seems better to locate the feature flag in the
> > > >>> > >> initialization
> > > >>> > >> > >> >>>> logic of
> > > >>> > >> > >> >>>>>> the store, rather than have a method on the "live"
> > > >>> store that
> > > >>> > >> > >> changes
> > > >>> > >> > >> >>>>>> its behavior on the fly.
> > > >>> > >> > >> >>>>>>
> > > >>> > >> > >> >>>>>> It seems like there are two options here, one is to
> > add
> > > >>> a new
> > > >>> > >> > >> config:
> > > >>> > >> > >> >>>>>>
> > > >>> > >> > >> >>>>>> StreamsConfig.ENABLE_BACKWARDS_ITERATION =
> > > >>> > >> > >> >>>>>>   "enable.backwards.iteration
> > > >>> > >> > >> >>>>>>
> > > >>> > >> > >> >>>>>> Or we can add a feature flag in Materialized, like
> > > >>> > >> > >> >>>>>>
> > > >>> > >> > >> >>>>>> Materialized.enableBackwardsIteration()
> > > >>> > >> > >> >>>>>>
> > > >>> > >> > >> >>>>>> I think I'd personally lean toward the config, for
> > the
> > > >>> > >> following
> > > >>> > >> > >> >>>> reason.
> > > >>> > >> > >> >>>>>> The concern that Sophie raised is that someone's
> > > >>> program may
> > > >>> > >> depend
> > > >>> > >> > >> >>>>>> on the existing contract of getting an empty
> > iterator.
> > > >>> We
> > > >>> > >> don't
> > > >>> > >> > >> want
> > > >>> > >> > >> >>>> to
> > > >>> > >> > >> >>>>>> switch behavior when they aren't expecting it, so we
> > > >>> provide
> > > >>> > >> them a
> > > >>> > >> > >> >>>>>> config to assert that they _are_ expecting the new
> > > >>> behavior,
> > > >>> > >> which
> > > >>> > >> > >> >>>>>> means they take responsibility for updating their
> > code
> > > >>> to
> > > >>> > >> expect
> > > >>> > >> > >> the
> > > >>> > >> > >> >>>> new
> > > >>> > >> > >> >>>>>> behavior.
> > > >>> > >> > >> >>>>>>
> > > >>> > >> > >> >>>>>> There doesn't seem to be a reason to offer a choice
> > of
> > > >>> > >> behaviors
> > > >>> > >> > >> on a
> > > >>> > >> > >> >>>>>> per-query, or per-store basis. We just want people
> > to
> > > >>> be not
> > > >>> > >> > >> surprised
> > > >>> > >> > >> >>>>>> by this change in general.
> > > >>> > >> > >> >>>>>>
> > > >>> > >> > >> >>>>>> What do you think?
> > > >>> > >> > >> >>>>>> Thanks,
> > > >>> > >> > >> >>>>>> -John
> > > >>> > >> > >> >>>>>>
> > > >>> > >> > >> >>>>>> On Wed, May 20, 2020, at 17:37, Jorge Quilcate
> > wrote:
> > > >>> > >> > >> >>>>>>> Thank you both for the great feedback.
> > > >>> > >> > >> >>>>>>>
> > > >>> > >> > >> >>>>>>> I like the "fancy" proposal :), and how it removes
> > the
> > > >>> need
> > > >>> > >> for
> > > >>> > >> > >> >>>>>>> additional API methods. And with a feature flag on
> > > >>> > >> `StateStore`,
> > > >>> > >> > >> >>>>>>> disabled by default, should no break current users.
> > > >>> > >> > >> >>>>>>>
> > > >>> > >> > >> >>>>>>> The only side-effect I can think of is that: by
> > moving
> > > >>> the
> > > >>> > >> flag
> > > >>> > >> > >> >>>>> upwards,
> > > >>> > >> > >> >>>>>>> all later operations become affected; which might
> > be
> > > >>> ok for
> > > >>> > >> most
> > > >>> > >> > >> >>>> (all?)
> > > >>> > >> > >> >>>>>>> cases. I can't think of an scenario where this
> > would
> > > >>> be an
> > > >>> > >> issue,
> > > >>> > >> > >> >>>> just
> > > >>> > >> > >> >>>>>>> want to point this out.
> > > >>> > >> > >> >>>>>>>
> > > >>> > >> > >> >>>>>>> If moving to this approach, I'd like to check if I
> > got
> > > >>> this
> > > >>> > >> right
> > > >>> > >> > >> >>>>> before
> > > >>> > >> > >> >>>>>>> updating the KIP:
> > > >>> > >> > >> >>>>>>>
> > > >>> > >> > >> >>>>>>> - only `StateStore` will change by having a new
> > method:
> > > >>> > >> > >> >>>>>>> `backwardIteration()`, `false` by default to keep
> > > >>> things
> > > >>> > >> > >> compatible.
> > > >>> > >> > >> >>>>>>> - then all `*Stores` will have to update their
> > > >>> implementation
> > > >>> > >> > >> based
> > > >>> > >> > >> >>>> on
> > > >>> > >> > >> >>>>>>> this flag.
> > > >>> > >> > >> >>>>>>>
> > > >>> > >> > >> >>>>>>>
> > > >>> > >> > >> >>>>>>> On 20/05/2020 21:02, Sophie Blee-Goldman wrote:
> > > >>> > >> > >> >>>>>>>>> There's no possibility that someone could be
> > relying
> > > >>> > >> > >> >>>>>>>>> on iterating over that range in increasing order,
> > > >>> because
> > > >>> > >> that's
> > > >>> > >> > >> >>>> not
> > > >>> > >> > >> >>>>>> what
> > > >>> > >> > >> >>>>>>>>> happens. However, they could indeed be relying on
> > > >>> getting
> > > >>> > >> an
> > > >>> > >> > >> >>>> empty
> > > >>> > >> > >> >>>>>>>> iterator
> > > >>> > >> > >> >>>>>>>>
> > > >>> > >> > >> >>>>>>>> I just meant that they might be relying on the
> > > >>> assumption
> > > >>> > >> that
> > > >>> > >> > >> the
> > > >>> > >> > >> >>>>>> range
> > > >>> > >> > >> >>>>>>>> query
> > > >>> > >> > >> >>>>>>>> will never return results with decreasing keys.
> > The
> > > >>> empty
> > > >>> > >> > >> iterator
> > > >>> > >> > >> >>>>>> wouldn't
> > > >>> > >> > >> >>>>>>>> break that contract, but of course a surprise
> > reverse
> > > >>> > >> iterator
> > > >>> > >> > >> >>>> would.
> > > >>> > >> > >> >>>>>>>>
> > > >>> > >> > >> >>>>>>>> FWIW I actually am in favor of automatically
> > > >>> converting to a
> > > >>> > >> > >> >>>> reverse
> > > >>> > >> > >> >>>>>>>> iterator,
> > > >>> > >> > >> >>>>>>>> I just thought we should consider whether this
> > should
> > > >>> be
> > > >>> > >> off by
> > > >>> > >> > >> >>>>>> default or
> > > >>> > >> > >> >>>>>>>> even possible to disable at all.
> > > >>> > >> > >> >>>>>>>>
> > > >>> > >> > >> >>>>>>>> On Tue, May 19, 2020 at 7:42 PM John Roesler <
> > > >>> > >> > >> vvcep...@apache.org
> > > >>> > >> > >> >>>>>
> > > >>> > >> > >> >>>>>> wrote:
> > > >>> > >> > >> >>>>>>>>
> > > >>> > >> > >> >>>>>>>>> Thanks for the response, Sophie,
> > > >>> > >> > >> >>>>>>>>>
> > > >>> > >> > >> >>>>>>>>> I wholeheartedly agree we should take as much
> > into
> > > >>> account
> > > >>> > >> as
> > > >>> > >> > >> >>>>> possible
> > > >>> > >> > >> >>>>>>>>> up front, rather than regretting our decisions
> > > >>> later. I
> > > >>> > >> actually
> > > >>> > >> > >> >>>> do
> > > >>> > >> > >> >>>>>> share
> > > >>> > >> > >> >>>>>>>>> your vague sense of worry, which was what led me
> > to
> > > >>> say
> > > >>> > >> > >> initially
> > > >>> > >> > >> >>>>>> that I
> > > >>> > >> > >> >>>>>>>>> thought my counterproposal might be "too fancy".
> > > >>> > >> Sometimes, it's
> > > >>> > >> > >> >>>>>> better
> > > >>> > >> > >> >>>>>>>>> to be explicit instead of "elegant", if we think
> > more
> > > >>> > >> people
> > > >>> > >> > >> >>>> will be
> > > >>> > >> > >> >>>>>>>>> confused
> > > >>> > >> > >> >>>>>>>>> than not.
> > > >>> > >> > >> >>>>>>>>>
> > > >>> > >> > >> >>>>>>>>> I really don't think that there's any danger of
> > > >>> "relying
> > > >>> > >> on a
> > > >>> > >> > >> >>>> bug"
> > > >>> > >> > >> >>>>>> here,
> > > >>> > >> > >> >>>>>>>>> although
> > > >>> > >> > >> >>>>>>>>> people certainly could be relying on current
> > > >>> behavior. One
> > > >>> > >> thing
> > > >>> > >> > >> >>>> to
> > > >>> > >> > >> >>>>> be
> > > >>> > >> > >> >>>>>>>>> clear
> > > >>> > >> > >> >>>>>>>>> about (which I just left a more detailed comment
> > in
> > > >>> > >> KAFKA-8159
> > > >>> > >> > >> >>>>> about)
> > > >>> > >> > >> >>>>>> is
> > > >>> > >> > >> >>>>>>>>> that
> > > >>> > >> > >> >>>>>>>>> when we say something like key1 > key2, this
> > > >>> ordering is
> > > >>> > >> defined
> > > >>> > >> > >> >>>> by
> > > >>> > >> > >> >>>>>> the
> > > >>> > >> > >> >>>>>>>>> serde's output and nothing else.
> > > >>> > >> > >> >>>>>>>>>
> > > >>> > >> > >> >>>>>>>>> Currently, thanks to your fix in
> > > >>> > >> > >> >>>>>> https://github.com/apache/kafka/pull/6521
> > > >>> > >> > >> >>>>>>>>> ,
> > > >>> > >> > >> >>>>>>>>> the store contract is that for range scans, if
> > from
> > > >>> > to,
> > > >>> > >> then
> > > >>> > >> > >> >>>> the
> > > >>> > >> > >> >>>>>> store
> > > >>> > >> > >> >>>>>>>>> must
> > > >>> > >> > >> >>>>>>>>> return an empty iterator. There's no possibility
> > that
> > > >>> > >> someone
> > > >>> > >> > >> >>>> could
> > > >>> > >> > >> >>>>> be
> > > >>> > >> > >> >>>>>>>>> relying
> > > >>> > >> > >> >>>>>>>>> on iterating over that range in increasing order,
> > > >>> because
> > > >>> > >> that's
> > > >>> > >> > >> >>>> not
> > > >>> > >> > >> >>>>>> what
> > > >>> > >> > >> >>>>>>>>> happens. However, they could indeed be relying on
> > > >>> getting
> > > >>> > >> an
> > > >>> > >> > >> >>>> empty
> > > >>> > >> > >> >>>>>>>>> iterator.
> > > >>> > >> > >> >>>>>>>>>
> > > >>> > >> > >> >>>>>>>>> My counterproposal was to actually change this
> > > >>> contract to
> > > >>> > >> say
> > > >>> > >> > >> >>>> that
> > > >>> > >> > >> >>>>>> the
> > > >>> > >> > >> >>>>>>>>> store
> > > >>> > >> > >> >>>>>>>>> must return an iterator over the keys in that
> > range,
> > > >>> but
> > > >>> > >> in the
> > > >>> > >> > >> >>>>>> reverse
> > > >>> > >> > >> >>>>>>>>> order.
> > > >>> > >> > >> >>>>>>>>> So, in addition to considering whether this idea
> > is
> > > >>> "too
> > > >>> > >> fancy"
> > > >>> > >> > >> >>>> (aka
> > > >>> > >> > >> >>>>>>>>> confusing),
> > > >>> > >> > >> >>>>>>>>> we should also consider the likelihood of
> > breaking an
> > > >>> > >> existing
> > > >>> > >> > >> >>>>>> program with
> > > >>> > >> > >> >>>>>>>>> this behavior/contract change.
> > > >>> > >> > >> >>>>>>>>>
> > > >>> > >> > >> >>>>>>>>> To echo your clarification, I'm also not
> > advocating
> > > >>> > >> strongly in
> > > >>> > >> > >> >>>>> favor
> > > >>> > >> > >> >>>>>> of my
> > > >>> > >> > >> >>>>>>>>> proposal. I just wanted to present it for
> > > >>> consideration
> > > >>> > >> > >> alongside
> > > >>> > >> > >> >>>>>> Jorge's
> > > >>> > >> > >> >>>>>>>>> original one.
> > > >>> > >> > >> >>>>>>>>>
> > > >>> > >> > >> >>>>>>>>> Thanks for raising these very good points,
> > > >>> > >> > >> >>>>>>>>> -John
> > > >>> > >> > >> >>>>>>>>>
> > > >>> > >> > >> >>>>>>>>> On Tue, May 19, 2020, at 20:49, Sophie
> > Blee-Goldman
> > > >>> wrote:
> > > >>> > >> > >> >>>>>>>>>>> Rather than working around it, I think we
> > should
> > > >>> just
> > > >>> > >> fix it
> > > >>> > >> > >> >>>>>>>>>> Now *that's* a "fancy" idea :P
> > > >>> > >> > >> >>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>> That was my primary concern, although I do have
> > a
> > > >>> vague
> > > >>> > >> sense
> > > >>> > >> > >> of
> > > >>> > >> > >> >>>>>> worry
> > > >>> > >> > >> >>>>>>>>>> that we might be allowing users to get into
> > trouble
> > > >>> > >> without
> > > >>> > >> > >> >>>>>> realizing it.
> > > >>> > >> > >> >>>>>>>>>> For example if their custom serdes suffer a
> > similar
> > > >>> bug
> > > >>> > >> as the
> > > >>> > >> > >> >>>>> above,
> > > >>> > >> > >> >>>>>>>>>> and/or
> > > >>> > >> > >> >>>>>>>>>> they rely on getting results in increasing order
> > > >>> (of the
> > > >>> > >> keys)
> > > >>> > >> > >> >>>> even
> > > >>> > >> > >> >>>>>> when
> > > >>> > >> > >> >>>>>>>>>> to < from. Maybe they're relying on the fact
> > that
> > > >>> the
> > > >>> > >> range
> > > >>> > >> > >> >>>> query
> > > >>> > >> > >> >>>>>> returns
> > > >>> > >> > >> >>>>>>>>>> nothing in that case.
> > > >>> > >> > >> >>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>> Not sure if that qualifies as relying on a bug
> > or
> > > >>> not,
> > > >>> > >> but in
> > > >>> > >> > >> >>>> that
> > > >>> > >> > >> >>>>>> past
> > > >>> > >> > >> >>>>>>>>>> we've
> > > >>> > >> > >> >>>>>>>>>> taken the stance that we should not break
> > > >>> compatibility
> > > >>> > >> even if
> > > >>> > >> > >> >>>> the
> > > >>> > >> > >> >>>>>> user
> > > >>> > >> > >> >>>>>>>>>> was relying on bugs or unintentional behavior.
> > > >>> > >> > >> >>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>> Just to clarify I'm not advocating strongly
> > against
> > > >>> this
> > > >>> > >> > >> >>>> proposal,
> > > >>> > >> > >> >>>>>> just
> > > >>> > >> > >> >>>>>>>>>> laying
> > > >>> > >> > >> >>>>>>>>>> out some considerations we should take into
> > > >>> account. At
> > > >>> > >> the end
> > > >>> > >> > >> >>>> of
> > > >>> > >> > >> >>>>>> the
> > > >>> > >> > >> >>>>>>>>> day
> > > >>> > >> > >> >>>>>>>>>> we should do what's right rather than maintain
> > > >>> > >> compatibility
> > > >>> > >> > >> >>>> with
> > > >>> > >> > >> >>>>>>>>> existing
> > > >>> > >> > >> >>>>>>>>>> bugs, but sometimes there's a reasonable middle
> > > >>> ground.
> > > >>> > >> > >> >>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>> On Tue, May 19, 2020 at 6:15 PM John Roesler <
> > > >>> > >> > >> >>>> vvcep...@apache.org>
> > > >>> > >> > >> >>>>>>>>> wrote:
> > > >>> > >> > >> >>>>>>>>>>> Thanks Sophie,
> > > >>> > >> > >> >>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>> Woah, that’s a nasty bug. Rather than working
> > > >>> around it,
> > > >>> > >> I
> > > >>> > >> > >> >>>> think
> > > >>> > >> > >> >>>>> we
> > > >>> > >> > >> >>>>>>>>> should
> > > >>> > >> > >> >>>>>>>>>>> just fix it. I’ll leave some comments on the
> > Jira.
> > > >>> > >> > >> >>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>> It doesn’t seem like it should be this KIP’s
> > > >>> concern
> > > >>> > >> that some
> > > >>> > >> > >> >>>>>> serdes
> > > >>> > >> > >> >>>>>>>>>>> might be incorrectly written.
> > > >>> > >> > >> >>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>> Were there other practical concerns that you
> > had
> > > >>> in mind?
> > > >>> > >> > >> >>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>> Thanks,
> > > >>> > >> > >> >>>>>>>>>>> John
> > > >>> > >> > >> >>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>> On Tue, May 19, 2020, at 19:10, Sophie
> > Blee-Goldman
> > > >>> > >> wrote:
> > > >>> > >> > >> >>>>>>>>>>>> I like this "fancy idea" to just flip the
> > to/from
> > > >>> bytes
> > > >>> > >> but I
> > > >>> > >> > >> >>>>> think
> > > >>> > >> > >> >>>>>>>>> there
> > > >>> > >> > >> >>>>>>>>>>>> are some practical limitations to implementing
> > > >>> this. In
> > > >>> > >> > >> >>>>> particular
> > > >>> > >> > >> >>>>>>>>>>>> I'm thinking about this issue
> > > >>> > >> > >> >>>>>>>>>>>> <
> > https://issues.apache.org/jira/browse/KAFKA-8159
> > > >>> >
> > > >>> > >> with the
> > > >>> > >> > >> >>>>>> built-in
> > > >>> > >> > >> >>>>>>>>>>> signed
> > > >>> > >> > >> >>>>>>>>>>>> number serdes.
> > > >>> > >> > >> >>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>> This trick would actually fix the problem for
> > > >>> > >> > >> >>>> negative-negative
> > > >>> > >> > >> >>>>>>>>> queries
> > > >>> > >> > >> >>>>>>>>>>>> (ie where to & from are negative) but would
> > cause
> > > >>> > >> > >> undetectable
> > > >>> > >> > >> >>>>>>>>>>>> incorrect results for negative-positive
> > queries.
> > > >>> For
> > > >>> > >> example,
> > > >>> > >> > >> >>>> say
> > > >>> > >> > >> >>>>>> you
> > > >>> > >> > >> >>>>>>>>>>>> call #range with from = -1 and to = 1, using
> > the
> > > >>> Short
> > > >>> > >> > >> serdes.
> > > >>> > >> > >> >>>>> The
> > > >>> > >> > >> >>>>>>>>>>>> serialized bytes for that are
> > > >>> > >> > >> >>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>> from = 1111111111111111
> > > >>> > >> > >> >>>>>>>>>>>> to = 0000000000000001
> > > >>> > >> > >> >>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>> so we would end up flipping those and
> > iterating
> > > >>> over
> > > >>> > >> all keys
> > > >>> > >> > >> >>>>> from
> > > >>> > >> > >> >>>>>>>>>>>> 0000000000000001 to 1111111111111111.
> > Iterating in
> > > >>> > >> > >> >>>>> lexicographical
> > > >>> > >> > >> >>>>>>>>>>>> order means we would iterate over every key in
> > > >>> the space
> > > >>> > >> > >> >>>> *except*
> > > >>> > >> > >> >>>>>> for
> > > >>> > >> > >> >>>>>>>>>>>> 0, but 0 is actually the *only* other key we
> > > >>> meant to be
> > > >>> > >> > >> >>>> included
> > > >>> > >> > >> >>>>>> in
> > > >>> > >> > >> >>>>>>>>> the
> > > >>> > >> > >> >>>>>>>>>>>> range query.
> > > >>> > >> > >> >>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>> Currently we just log a warning and return an
> > > >>> empty
> > > >>> > >> iterator
> > > >>> > >> > >> >>>> when
> > > >>> > >> > >> >>>>>>>>>>>> to < from, which is obviously also incorrect
> > but
> > > >>> feels
> > > >>> > >> > >> >>>> slightly
> > > >>> > >> > >> >>>>>> more
> > > >>> > >> > >> >>>>>>>>>>>> palatable. If we start automatically
> > converting to
> > > >>> > >> reverse
> > > >>> > >> > >> >>>>> queries
> > > >>> > >> > >> >>>>>> we
> > > >>> > >> > >> >>>>>>>>>>>> can't even log a warning in this case unless
> > we
> > > >>> wanted
> > > >>> > >> to log
> > > >>> > >> > >> >>>> a
> > > >>> > >> > >> >>>>>>>>> warning
> > > >>> > >> > >> >>>>>>>>>>>> every time, which would be weird to do for a
> > valid
> > > >>> > >> usage of a
> > > >>> > >> > >> >>>> new
> > > >>> > >> > >> >>>>>>>>>>>> feature.
> > > >>> > >> > >> >>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>> All that said, I still like the idea overall.
> > Off
> > > >>> the
> > > >>> > >> top of
> > > >>> > >> > >> >>>> my
> > > >>> > >> > >> >>>>>> head
> > > >>> > >> > >> >>>>>>>>> I
> > > >>> > >> > >> >>>>>>>>>>> guess
> > > >>> > >> > >> >>>>>>>>>>>> we could add a store config to enable/disable
> > > >>> automatic
> > > >>> > >> > >> >>>> reverse
> > > >>> > >> > >> >>>>>>>>>>> iteration,
> > > >>> > >> > >> >>>>>>>>>>>> which is off by default?
> > > >>> > >> > >> >>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>> Thanks for the KIP! This will be a nice
> > addition
> > > >>> > >> > >> >>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>> Sophie
> > > >>> > >> > >> >>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>> On Tue, May 19, 2020 at 3:21 PM John Roesler <
> > > >>> > >> > >> >>>>> vvcep...@apache.org>
> > > >>> > >> > >> >>>>>>>>>>> wrote:
> > > >>> > >> > >> >>>>>>>>>>>>> Hi there Jorge,
> > > >>> > >> > >> >>>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>>> Thanks for the KIP!
> > > >>> > >> > >> >>>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>>> I think this feature sounds very reasonable.
> > > >>> > >> > >> >>>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>>> I'm not 100% sure if this is "too fancy", but
> > > >>> what do
> > > >>> > >> you
> > > >>> > >> > >> >>>> think
> > > >>> > >> > >> >>>>>>>>>>>>> about avoiding the enum by instead allowing
> > > >>> people to
> > > >>> > >> flip
> > > >>> > >> > >> >>>>>>>>>>>>> the "from" and "to" endpoints? I.e., reading
> > > >>> from "A"
> > > >>> > >> to "Z"
> > > >>> > >> > >> >>>>> would
> > > >>> > >> > >> >>>>>>>>>>>>> be a forward scan, and from "Z" to "A" would
> > be a
> > > >>> > >> backward
> > > >>> > >> > >> >>>> one?
> > > >>> > >> > >> >>>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>>> Thanks,
> > > >>> > >> > >> >>>>>>>>>>>>> -John
> > > >>> > >> > >> >>>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>>> On Tue, May 19, 2020, at 16:20, Jorge
> > Quilcate
> > > >>> wrote:
> > > >>> > >> > >> >>>>>>>>>>>>>> Hi everyone,
> > > >>> > >> > >> >>>>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>>>> I would like to start the discussion for
> > > >>> KIP-617:
> > > >>> > >> > >> >>>>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>
> > > >>> > >> > >> >>>>>>
> > > >>> > >> > >> >>>>>
> > > >>> > >> > >> >>>>
> > > >>> > >> > >>
> > > >>> > >>
> > > >>>
> > https://cwiki.apache.org/confluence/display/KAFKA/KIP-617%3A+Allow+Kafka+Streams+State+Stores+to+be+iterated+backwards
> > > >>> > >> > >> >>>>>>>>>>>>>> Looking forward to your feedback.
> > > >>> > >> > >> >>>>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>>>> Thanks!
> > > >>> > >> > >> >>>>>>>>>>>>>> Jorge.
> > > >>> > >> > >> >>>>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>>>>
> > > >>> > >> > >> >>>>>>>>>>>>>> Attachments:
> > > >>> > >> > >> >>>>>>>>>>>>>> * 0x5F2C6E22064982DF.asc
> > > >>> > >> > >> >>>>>>>
> > > >>> > >> > >> >>>>>>>
> > > >>> > >> > >> >>>>>>> Attachments:
> > > >>> > >> > >> >>>>>>> * 0x5F2C6E22064982DF.asc
> > > >>> > >> > >> >>>>>>
> > > >>> > >> > >> >>>>>
> > > >>> > >> > >> >>>>
> > > >>> > >> > >> >>>
> > > >>> > >> > >> >>
> > > >>> > >> > >>
> > > >>> > >> > >>
> > > >>> > >> >
> > > >>> > >>
> > > >>> > >
> > > >>> >
> > > >>>
> > > >>
> > >
> >
>

Reply via email to