Thanks for all the feedback folk! Responses inline.

> Basically, I'm suggesting two things: first, call out in some way
(perhaps the StoreTypeSpec javadocs) that each StoreTypeSpec is considered
a public contract in itself and should outline any semantic guarantees it
does, or does not, make. Second, we should add a note on ordering
guarantees in the two OOTB specs: for RocksDB we assert that range queries
will honor serialized byte ordering, whereas the InMemory flavor gives no
ordering guarantee whatsoever at this time.

That makes sense to me Sophie! I'll make the changes to the KIP. And @Colt,
yes I believe that would be the new javadoc for the generic
ReadOnlyKeyValueStore.

> However, I am wondering if we should close others gaps first?

@Matthias, thanks for the review and thoughts! I think we should separate
closing other gaps in the product from providing this as useful
functionality to avoid feature creep so long as the API proposed here will
be suitable for when we want to close those implementation gaps! My general
proposal is that for things that are not customizable today by
default.dsl.store they remain not customizable after this KIP. The good
news is, however, that there's no reason why this cannot be extended to
cover those in the future if we want to - see specifics below.

Comments on the specifics below

> In particular, this holds for the new versioned-store ... Should
versioned stores also be covered by the KIP

Is there a reason why we can't introduce a VersionedRocksDBStoreTypeSpec
and if we ever support an in-memory an equivalent
VersionedInMemoryRocksDBStoreTypeSpec? If so, then there would not need to
be any additional changes to the API proposed in this KIP.

> For `suppress()` it's actually other way around we only have an in-memory
implementation. Do you aim to allow custom stores for `suppress()`, too?

We have three options here:
1) we can decide to maintain existing behavior and use the in-memory
implementation for all stores (not even going through the API at all)
2a) we can introduce a new parameter to the KeyValueParams class (boolean
isTimeOrderedBuffer or something like that) and return an in-memory store
in the implementation of RocksDBStoreTypeSpec (this maintains the existing
behavior, and would allow us in the future to make the change to return a
RocksDB store if we ever provide one)
2b) same as 2a but we throw an exception if the requested store type does
not support that (this is backwards incompatible, and since ROCKS_DB is the
default we probably shouldn't do this)

My proposal for now is 1) because as of KIP-825
EmitStrategy#ON_WINDOW_CLOSE is the preferred way of suppressing and that
is accounted for in this API already.

> Last, I am not sure if the new parameter replacing the existing one is the
best way to go?

I'm happy either way, just let me know which you prefer - the discussion
around CUSTOM is in the rejected alternatives but I'm happy to differ to
whatever the project conventions are :)

> If it's matches existing `ROCKS_DB` or `IN_MEMORY` we just process it as we
do know, and if know we assume it's a fully qualified class name and try to
instantiate it?

Note that there is no functionality for this kind of thing in
AbstractConfig (it's either a String validated enum or a class) so this
would be a departure from convention. Again, I'm happy to implement that if
it's preferred.

> Also wondering how it would related to the existing `Stores` factory?

StoreTypeSpec will depend on Stores factory - they're one layer removed.
You can imagine that StoreTypeSpec is just a grouping of methods from the
Stores factory into a convenient package for default configuration purposes.

Thanks again for all the detailed thoughts Matthias!

On Fri, Jul 21, 2023 at 11:50 AM Matthias J. Sax <mj...@apache.org> wrote:

> Thanks for the KIP. Overall I like the idea to close this gap.
>
> However, I am wondering if we should close others gaps first? In
> particular, IIRC, we have a few cases for which we only have a RocksDB
> implementation for a store, and thus, adding an in-memory version for
> these stores first, to make the current `IN_MEMORY` parameter work,
> might be the first step?
>
> In particular, this holds for the new versioned-store (but I actually
> believe the is some other internal store with no in-memory
> implementation). -- For `suppress()` it's actually other way around we
> we only have an in-memory implementation. Do you aim to allow custom
> stores for `suppress()`, too?
>
> Btw: Should versioned stores also be covered by the KIP (ie,
> `StoreTypeSpec`)? We did consider to add a new option `VERSIONED` to the
> existing `default.dsl.store` config, but opted out for various reasons.
>
> Last, I am not sure if the new parameter replacing the existing one is
> the best way to go? Did you put the idea to add `CUSTOM` to the existing
> config into rejected alternative. Personally, I would prefer to add
> `CUSTOM` as I would like to optimize to easy of use for the majority of
> users (which don't implement a custom store), but only switch to
> in-memory sometimes. -- As an alternative, you would also just extend
> `dsl.default.store` (it's just a String) and allow to pass in anything.
> If it's matches existing `ROCKS_DB` or `IN_MEMORY` we just process it as
> we do know, and if know we assume it's a fully qualified class name and
> try to instantiate it? -- Given that we plan to keep the store-enum, is
> seems cleaner to keep the existing config and keep both the config and
> enum aligned to each other?
>
>
> It's just preliminary thought. I will need to go back an take a more
> detailed look into the code to grok how the propose `StoreTypeSpec`
> falls into place. Also wondering how it would related to the existing
> `Stores` factory?
>
> -Matthias
>
>
> On 7/21/23 6:45 AM, Colt McNealy wrote:
> > Sophie—
> >
> > Thanks for chiming in here. +1 to the idea of specifying the ordering
> > guarantees that we make in the StorageTypeSpec javadocs.
> >
> > Quick question then. Is the javadoc that says:
> >
> >> Order is not guaranteed as bytes lexicographical ordering might not
> > represent key order.
> >
> > no longer correct, and should say:
> >
> >> Order guarantees depend on the underlying implementation of the
> > ReadOnlyKeyValueStore. For more information, please consult the
> > [StorageTypeSpec javadocs](....)
> >
> > Thanks,
> > Colt McNealy
> >
> > *Founder, LittleHorse.dev*
> >
> >
> > On Thu, Jul 20, 2023 at 9:28 PM Sophie Blee-Goldman <
> ableegold...@gmail.com>
> > wrote:
> >
> >> Hey Almog, first off, thanks for the KIP! I (and others) raised concerns
> >> over how restrictive the default.dsl.store config would be if not
> >> extendable to custom store types, especially given that this seems to be
> >> the primary userbase of such a feature. At the time we didn't really
> have
> >> any better ideas for a clean way to achieve that, but what you proposed
> >> makes a lot of sense to me. Happy to see a good solution to this, and
> >> hopefully others will share my satisfaction :P
> >>
> >> I did have one quick piece of feedback which arose from an unrelated
> >> question posed to the dev mailing list w/ subject line
> >> "ReadOnlyKeyValueStore#range()
> >> Semantics"
> >> <https://lists.apache.org/thread/jbckmth8d3mcgg0rd670cpvsgwzqlwrm>. I
> >> recommend checking out the full thread for context, but it made me think
> >> about how we can leverage the new StoreTypeSpec concept as an answer to
> the
> >> long-standing question in Streams: where can we put guarantees of the
> >> public contract for RocksDB (or other store implementations) when all
> the
> >> RocksDB stuff is technically internal.
> >>
> >> Basically, I'm suggesting two things: first, call out in some way
> (perhaps
> >> the StoreTypeSpec javadocs) that each StoreTypeSpec is considered a
> public
> >> contract in itself and should outline any semantic guarantees it does,
> or
> >> does not, make. Second, we should add a note on ordering guarantees in
> the
> >> two OOTB specs: for RocksDB we assert that range queries will honor
> >> serialized byte ordering, whereas the InMemory flavor gives no ordering
> >> guarantee whatsoever at this time.
> >>
> >> Thoughts?
> >>
> >> -Sophie
> >>
> >> On Thu, Jul 20, 2023 at 4:28 PM Almog Gavra <almog.ga...@gmail.com>
> wrote:
> >>
> >>> Hi All,
> >>>
> >>> I would like to propose a KIP to expand support for default store types
> >>> (KIP-591) to encompass custom store implementations:
> >>>
> >>>
> >>
> https://cwiki.apache.org/confluence/display/KAFKA/KIP-954%3A+expand+default+DSL+store+configuration+to+custom+types
> >>>
> >>> Looking forward to your feedback!
> >>>
> >>> Cheers,
> >>> Almog
> >>>
> >>
> >
>

Reply via email to