Hello everyone - I updated the KIP to also include the following modification:
Both the new dsl.store.suppliers.class and the old default.dsl.store will now respect the configurations when passed in via KafkaStreams#new(Topology, StreamsConfig) (and other related constructors) instead of only being respected when passed in to the initial StoreBuilder#new(TopologyConfig) (though it will be respected if passed in via the original path as well). I was honestly a bit shocked this wasn't the case with the original KIP that introduced default.dsl.store! On Fri, Jul 28, 2023 at 4:55 PM Almog Gavra <almog.ga...@gmail.com> wrote: > OK! I think I got everything, but I'll give the KIP another read with > fresh eyes later. Just a reminder that the voting is open, so go out and > exercise your civic duty! ;) > > - Almog > > On Fri, Jul 28, 2023 at 10:38 AM Almog Gavra <almog.ga...@gmail.com> > wrote: > >> Thanks Guozhang & Sophie: >> >> A2. Will clarify in the KIP >> A3. Will change back to the deprecated version! >> A5. Seems like I'm outnumbered... DslStoreSuppliers it is. >> >> Will update the KIP today. >> >> - Almog >> >> On Thu, Jul 27, 2023 at 12:42 PM Guozhang Wang < >> guozhang.wang...@gmail.com> wrote: >> >>> Yes, that sounds right to me. Thanks Sophie. >>> >>> On Thu, Jul 27, 2023 at 12:35 PM Sophie Blee-Goldman >>> <ableegold...@gmail.com> wrote: >>> > >>> > A2: Guozhang, just to close the book on the ListValue store thing, I >>> fully >>> > agree it seems like overreach >>> > to expose/force this on users, especially if it's fully internal >>> today. But >>> > just to make sure we're on the same >>> > page here, you're still ok with this KIP fixing the API gap that exists >>> > today, in which these stores cannot be >>> > customized by the user at all? >>> > >>> > In other words, after this KIP, the new behavior for the ListValue >>> store in >>> > a stream join will be: >>> > >>> > S1: First, check if the user passed in a `DSLStoreSuppliers` (or >>> whatever >>> > the name will be) to the >>> > StreamJoined config object, and use that to obtain the >>> > KVStoreSupplier for this ListValue store >>> > >>> > S2: If none was provided, check if the user has set a default >>> > DSLStoreSuppliers via the new config, >>> > and use that to get the KVStoreSupplier if so >>> > >>> > S3: If neither is set, fall back to the original logic as it is today, >>> > which is to pass in a KVStoreSupplier >>> > that is hard-coded to be either RocksDB or InMemory, based on >>> what >>> > is returned for the #persistent >>> > API by the StreamJoined's WindowStoreSupplier >>> > >>> > Does that sound right? We can clarify this further in the KIP if need >>> be >>> > >>> > On Thu, Jul 27, 2023 at 10:48 AM Guozhang Wang < >>> guozhang.wang...@gmail.com> >>> > wrote: >>> > >>> > > Hi all, >>> > > >>> > > Like Almog's secretary as well! Just following up on that index: >>> > > >>> > > A2: I'm also happy without introducing versioned KV in this KIP as I >>> > > would envision it to be introduced as new params into the >>> > > KeyValuePluginParams in the future. And just to clarify on Sophie's >>> > > previous comment, I think ListStore should not be exposed in this API >>> > > until we see it as a common usage and hence would want to (again, we >>> > > need to think very carefully since it would potentially ask all >>> > > implementers to adopt) move it from the internal category to the >>> > > public interface category. As for now, I think only having kv / >>> window >>> > > / session as public store types is fine. >>> > > >>> > > A3: Seems I was not making myself very clear at the beginning :P The >>> > > major thing that I'd actually like to avoid having two configs >>> > > co-exist for the same function since it will be a confusing learning >>> > > curve for users, and hence what I was proposing is to just have the >>> > > newly introduced interface but not introducing a new config, and I >>> > > realized now that it is actually more aligned with the CUSTOM idea >>> > > where the ordering would be looking at config first, and then the >>> > > interface. I blushed as I read Almog likes it.. After thinking about >>> > > it twice, I'm now a bit leaning towards just deprecating the old >>> > > config with the new API+config as well. >>> > > >>> > > A5: Among the names we have been discussed so far: >>> > > >>> > > DslStorePlugin >>> > > StoreTypeSpec >>> > > StoreImplSpec >>> > > DslStoreSuppliers >>> > > >>> > > I am in favor of DslStoreSuppliers as well as a restrictiveness on >>> its >>> > > scope, just to echo Bruno's comments above. >>> > > >>> > > >>> > > >>> > > Guozhang >>> > > >>> > > On Thu, Jul 27, 2023 at 4:15 AM Bruno Cadonna <cado...@apache.org> >>> wrote: >>> > > > >>> > > > Hi, >>> > > > >>> > > > A5. I have to admit that >>> > > > "If we envision extending this beyond just StoreSupplier types, it >>> could >>> > > > be a good option." >>> > > > is scaring me a bit. >>> > > > I am wondering what would be an example for such an extension? >>> > > > In general, I would propose to limit the scope of a config. In >>> this case >>> > > > the config should provide suppliers for state stores for the DSL. >>> > > > >>> > > > BTW, maybe it is a good idea to let DslStorePlugin extend >>> Configurable. >>> > > > >>> > > > Best, >>> > > > Bruno >>> > > > >>> > > > On 7/27/23 2:15 AM, Sophie Blee-Goldman wrote: >>> > > > > Thanks for the feedback Bruno -- sounds like we're getting close >>> to a >>> > > final >>> > > > > consensus here. >>> > > > > It sounds like the two main (only?) semi-unresolved questions >>> that >>> > > still >>> > > > > have differing >>> > > > > opinions floating around are whether to deprecate the old >>> config, and >>> > > what >>> > > > > to name the new config >>> > > > > + interface. >>> > > > > >>> > > > > Although I won't personally push back on any of the options >>> listed >>> > > above, >>> > > > > here's my final two cents: >>> > > > > >>> > > > > A3. I'm still a firm believer in deprecating the old config, and >>> agree >>> > > > > wholeheartedly with what Bruno said. >>> > > > > >>> > > > > A5. I also wasn't crazy about "Plugin" at first, but I will >>> admit it's >>> > > > > grown on me. I think it rubbed me the wrong >>> > > > > way at first because it's just not part of the standard >>> vocabulary in >>> > > > > Streams so far. If we envision extending >>> > > > > this beyond just StoreSupplier types, it could be a good option. >>> > > > > DSLStoreSuppliers does make a lot of sense, >>> > > > > though. >>> > > > > >>> > > > > To throw out a few more ideas in case any of them stick, what >>> about >>> > > > > something like DSLStoreFormat or >>> > > > > DSLStorageType, or even DSLStorageEngine? Or even >>> DSLStoreFactory -- >>> > > the >>> > > > > Stores class is described as >>> > > > > a "factory" (though not named so) and, to me, is actually quite >>> > > comparable >>> > > > > -- both are providers not of the >>> > > > > stores themselves, but of the basic building blocks of Stores (eg >>> > > > > StoreSuppliers) >>> > > > > >>> > > > > Ultimately fine with anything though. We should try not to drag >>> out >>> > > the KIP >>> > > > > discussion too long once it's down >>> > > > > to just nits :P >>> > > > > >>> > > > > Cheers, >>> > > > > Sophie >>> > > > > >>> > > > > >>> > > > > >>> > > > > On Wed, Jul 26, 2023 at 8:04 AM Almog Gavra < >>> almog.ga...@gmail.com> >>> > > wrote: >>> > > > > >>> > > > >> Thanks for the comments Bruno! >>> > > > >> >>> > > > >> A3. Oops... I think I didn't do a great job updating the KIP to >>> > > reflect >>> > > > >> Guozhang's suggestion. This seems like the last point of >>> contention, >>> > > where >>> > > > >> we have two options: >>> > > > >> >>> > > > >> 1. Deprecate the config entirely and replace IN_MEMORY/ROCKSDB >>> with >>> > > > >> implementations of the DslStorePlugin >>> > > > >> 2. (What's currently in the KIP) Introduce a new config which >>> > > defaults to >>> > > > >> DefaultDslStorePlugin and only the DefaultDslStorePlugin will >>> respect >>> > > the >>> > > > >> old default.store.type config >>> > > > >> >>> > > > >> I'm happy with either, I'll keep the KIP with (2) for now as >>> that >>> > > seemed >>> > > > >> like the result of the previous discussion but I have no problem >>> > > changing >>> > > > >> it back to (1) which was the original proposal. >>> > > > >> >>> > > > >> A5. I like "DslStorePlugin" because it leaves room for >>> configuring >>> > > > >> implementations beyond just supplying stores (e.g. we could >>> introduce >>> > > a >>> > > > >> `configure()` method etc...). I'll keep it as is for now (and >>> change >>> > > > >> Materialized/Stores API sections - thanks for catching that)! I >>> don't >>> > > feel >>> > > > >> too strongly and wouldn't dig my heels in if most people >>> preferred >>> > > > >> "DslStoreSuppliers" (I don't love DslStores as it resembles the >>> Stores >>> > > > >> class to closely in name and they're a little different). >>> > > > >> >>> > > > >> A6. Yup, that's the suggestion. >>> > > > >> >>> > > > >> - Almog >>> > > > >> >>> > > > >> On Wed, Jul 26, 2023 at 6:38 AM Bruno Cadonna < >>> cado...@apache.org> >>> > > wrote: >>> > > > >> >>> > > > >>> Hi, >>> > > > >>> >>> > > > >>> Sorry for being late to the party! >>> > > > >>> >>> > > > >>> A1: I agree with Sophie, Guozhang, and Almog not to block the >>> KIP on >>> > > > >>> gaps in the implementation. >>> > > > >>> >>> > > > >>> A2: I am happy with not considering anything special w.r.t. >>> versioned >>> > > > >>> state stores in this KIP. >>> > > > >>> >>> > > > >>> A3: Here I agree with Sophie to deprecate the old config. I >>> would >>> > > also >>> > > > >>> not use config value CUSTOM. Having two configs that sometimes >>> > > depend on >>> > > > >>> each other to configure one single concept seems confusing to >>> me. I >>> > > see >>> > > > >>> future me looking at default.dsl.store = IN_MEMORY and >>> wondering why >>> > > > >>> something is written to disk because I did not check config >>> > > > >>> dsl.store.plugin.class? >>> > > > >>> BTW, the KIP in its current version is not clear about whether >>> > > > >>> default.dsl.store will be deprecated or not. In "Compatibility, >>> > > > >>> Deprecation, and Migration Plan" it says default.dsl.store >>> will be >>> > > > >>> deprecated but in "Configuration" default.dsl.store seems to >>> be an >>> > > > >>> essential part of the configuration. >>> > > > >>> >>> > > > >>> A4: I agree >>> > > > >>> >>> > > > >>> A5: I do not completely like the name "DslStorePlugin". What >>> about >>> > > > >>> naming it simply "DslStores" or "DslStoreSuppliers"? If we >>> decide to >>> > > > >>> rename we should also rename dsl.store.plugin.class to >>> > > > >>> dsl.store.suppliers.class or similar. >>> > > > >>> BTW, I think you missed to rename some occurrences in section >>> > > > >>> "Materialized API" especially in the code section >>> "Stores.java". >>> > > > >>> >>> > > > >>> A6: Actually I am not sure if I completely follow here. Is >>> this about >>> > > > >>> the static methods in class Stores? If yes, I agree with Almog >>> to >>> > > keep >>> > > > >>> this out of the KIP. >>> > > > >>> >>> > > > >>> Best, >>> > > > >>> Bruno >>> > > > >>> >>> > > > >>> On 7/26/23 5:20 AM, Almog Gavra wrote: >>> > > > >>>> I have updated the KIP with the points as discussed above. >>> > > @Guozhang, >>> > > > >> the >>> > > > >>>> suggested configuration makes it a little more awkward around >>> the >>> > > > >>>> Materialized.as and Materialized.withStoreType APIs than it >>> was >>> > > when we >>> > > > >>>> were totally deprecating the old configuration. Let me know >>> what you >>> > > > >>> think. >>> > > > >>>> >>> > > > >>>> I will open the voting tomorrow! Thanks again everyone for the >>> > > > >>> discussion. >>> > > > >>>> >>> > > > >>>> Cheers, >>> > > > >>>> Almog >>> > > > >>>> >>> > > > >>>> On Tue, Jul 25, 2023 at 9:20 AM Almog Gavra < >>> almog.ga...@gmail.com> >>> > > > >>> wrote: >>> > > > >>>> >>> > > > >>>>> Glad you like my KIP-secretary skills ;) >>> > > > >>>>> >>> > > > >>>>> A2. I'm definitely happy to take your suggestion here and >>> not do >>> > > > >>> anything >>> > > > >>>>> special w.r.t. Versioned stores, I think it makes sense >>> especially >>> > > if >>> > > > >> we >>> > > > >>>>> consider them implementation details of a specific store >>> type. >>> > > > >>>>> >>> > > > >>>>> At EOD I'll update the KIP with all of these changes and if >>> the >>> > > > >>>>> discussion is silent I'll open a vote tomorrow morning. >>> > > > >>>>> >>> > > > >>>>> Cheers, >>> > > > >>>>> Almog >>> > > > >>>>> >>> > > > >>>>> On Mon, Jul 24, 2023 at 2:02 PM Sophie Blee-Goldman < >>> > > > >>>>> ableegold...@gmail.com> wrote: >>> > > > >>>>> >>> > > > >>>>>> Awesome summary (seriously) -- would you kindly offer your >>> > > > >>> organizational >>> > > > >>>>>> skills to every ongoing KIP from henceforth? We need you :P >>> > > > >>>>>> >>> > > > >>>>>> A few answers/comments: >>> > > > >>>>>> >>> > > > >>>>>> A2: I think there is a 3rd sub-option here, which is to >>> leave >>> > > > >>>>>> versioned-ness out of this KIP entirely, return only the >>> > > > >> non-versioned >>> > > > >>>>>> stores for now, and then switch over to the versioned stores >>> > > (only) >>> > > > >>> when >>> > > > >>>>>> the time comes to flip the switch on making them the default >>> > > across >>> > > > >> the >>> > > > >>>>>> DSL. This has the advantage of retaining the current >>> > > > >> behavior/semantics >>> > > > >>>>>> and >>> > > > >>>>>> provides a clear way to transition smoothly in the future, >>> since >>> > > it >>> > > > >>> seems >>> > > > >>>>>> we will want to cut to all versioned state stores rather >>> than >>> > > offer >>> > > > >>> users >>> > > > >>>>>> a >>> > > > >>>>>> choice between versioned or non-versioned stores going >>> forward >>> > > > >>> (similar to >>> > > > >>>>>> how we only offer timestamped stores presently, and have >>> > > completely >>> > > > >>>>>> replaced non-timestamped stores in the DSL.) . In both the >>> > > > >> timestamped >>> > > > >>> and >>> > > > >>>>>> versioned cases, the old stores are/will still be available >>> or >>> > > > >>> accessible >>> > > > >>>>>> to users via the bare StoreSuppliers, should they somehow >>> desire >>> > > or >>> > > > >>>>>> require >>> > > > >>>>>> the old store type. Ultimately, I think either this or >>> option (1) >>> > > > >>> would be >>> > > > >>>>>> preferable, though I think it should be up to Matthias or >>> anyone >>> > > else >>> > > > >>>>>> involved in the versioned stores feature to decide which >>> approach >>> > > > >> makes >>> > > > >>>>>> sense in the context of that feature's future plans. >>> > > > >>>>>> >>> > > > >>>>>> A3: sounds reasonable to me >>> > > > >>>>>> >>> > > > >>>>>> A5: Also sounds fine to me, though I'll let others chime in >>> > > with/if >>> > > > >>> they >>> > > > >>>>>> have an alternative suggestion/preference. I guess the other >>> > > > >> contender >>> > > > >>>>>> would be something like DSLStoreImpl or something like that? >>> > > > >>>>>> >>> > > > >>>>>> >>> > > > >>>>>> >>> > > > >>>>>> On Mon, Jul 24, 2023 at 9:36 AM Almog Gavra < >>> > > almog.ga...@gmail.com> >>> > > > >>>>>> wrote: >>> > > > >>>>>> >>> > > > >>>>>>> Lots of thoughts! Happy to see the thriving discussion on >>> this >>> > > post >>> > > > >> - >>> > > > >>>>>> lots >>> > > > >>>>>>> going on so I'm trying to enumerate them to keep things >>> organized >>> > > > >>>>>> (prefix >>> > > > >>>>>>> "A" for "Almog" so we can use numbers in responses for >>> other >>> > > things >>> > > > >>> ;P). >>> > > > >>>>>>> >>> > > > >>>>>>> A1. Question around closing implementation gaps (e.g. no >>> rocks >>> > > based >>> > > > >>>>>>> suppression store) >>> > > > >>>>>>> A2. Specifically how to handle Versioned stores >>> > > > >>>>>>> A3. Configuration (new config/reuse old one + new one and >>> > > ordering >>> > > > >> of >>> > > > >>>>>>> config resolution) >>> > > > >>>>>>> A4. Drawing a line between what is implementation detail >>> (not >>> > > > >> exposed >>> > > > >>> in >>> > > > >>>>>>> API) and what is customizable (exposed in API) >>> > > > >>>>>>> A5. Naming of StoreTypeSpec >>> > > > >>>>>>> A6. Param classes in StoreBuilders >>> > > > >>>>>>> >>> > > > >>>>>>> ------------------------------ >>> > > > >>>>>>> >>> > > > >>>>>>> Here are summaries for where it seems each of these stands >>> > > (trying >>> > > > >> not >>> > > > >>>>>> to >>> > > > >>>>>>> add any additional opinion yet): >>> > > > >>>>>>> >>> > > > >>>>>>> A1. Sophie/Guozhang/Me (if I count hah!) seem to agree >>> that it is >>> > > > >>> worth >>> > > > >>>>>>> pushing this KIP through independently of the >>> implementation >>> > > gaps as >>> > > > >>> it >>> > > > >>>>>>> doesn't seem to move the intermediate state further from >>> the end >>> > > > >>> state. >>> > > > >>>>>>> Matthias originally had some concerns. >>> > > > >>>>>>> >>> > > > >>>>>>> A2. There's questions around whether versioned stores >>> should be >>> > > > >> their >>> > > > >>>>>> own >>> > > > >>>>>>> configurable option or whether they are an implementation >>> detail >>> > > > >> that >>> > > > >>>>>> the >>> > > > >>>>>>> StoreSpec should decide. It seems like the discussion is >>> > > converging >>> > > > >>>>>> here, >>> > > > >>>>>>> this should be an implementation detail. >>> > > > >>>>>>> >>> > > > >>>>>>> A3. Matthias/Guozhang prefer adding CUSTOM and then having >>> an >>> > > > >>> additional >>> > > > >>>>>>> config to determine the implementation. Sophie prefers >>> > > deprecating >>> > > > >> the >>> > > > >>>>>> old >>> > > > >>>>>>> config. Guozhang additional suggested flipping the >>> resolution >>> > > order >>> > > > >>> such >>> > > > >>>>>>> that the old config is only respected in a DefaultStoreSpec >>> > > > >>>>>> implementation. >>> > > > >>>>>>> >>> > > > >>>>>>> A4. This KIP (or rather, the discussion on the KIP) blurs >>> the >>> > > lines >>> > > > >>>>>> between >>> > > > >>>>>>> top level store types (KV, windowed, session) and the >>> underlying >>> > > > >>>>>>> implementation of them (timestamped, versioned, kv-list). >>> It >>> > > seems >>> > > > >>>>>> everyone >>> > > > >>>>>>> is in alignment to ensure that we keep these two things >>> separate >>> > > and >>> > > > >>>>>> that >>> > > > >>>>>>> the line is clearly delineated in the text of the KIP. >>> > > > >>>>>>> >>> > > > >>>>>>> A5. Guozhang and Sophie agree that the current name >>> > > StoreTypeSpec is >>> > > > >>>>>>> misleading, as it's really an implementation spec, not a >>> type >>> > > > >>>>>>> specification. >>> > > > >>>>>>> >>> > > > >>>>>>> A6. Agreement that this is an improvement, Sophie believes >>> this >>> > > can >>> > > > >> be >>> > > > >>>>>> done >>> > > > >>>>>>> in a follow up but we should ensure our naming is good >>> here so >>> > > > >> there's >>> > > > >>>>>> no >>> > > > >>>>>>> conflicts down the line. >>> > > > >>>>>>> >>> > > > >>>>>>> --------------------------------- >>> > > > >>>>>>> >>> > > > >>>>>>> Ok, phew! Hopefully that covers it all! Now for my >>> thoughts, >>> > > > >> hopefully >>> > > > >>>>>>> wrapping up some of these discussions: >>> > > > >>>>>>> >>> > > > >>>>>>> A1. @Matthias - are you still hesitant here? What would >>> you >>> > > need to >>> > > > >>> be >>> > > > >>>>>>> convinced here? >>> > > > >>>>>>> >>> > > > >>>>>>> A2. Since we are all in agreement that versioned stores >>> should >>> > > be an >>> > > > >>>>>>> implementation detail, we have two options: >>> > > > >>>>>>> >>> > > > >>>>>>> (1) we can extend the KVParams to include a parameter that >>> > > indicates >>> > > > >>>>>>> whether or not the store should be versioned >>> > > > >>>>>>> (2) we can introduce a configuration for whether or not to >>> use a >>> > > > >>>>>> versioned >>> > > > >>>>>>> store, and each implementation can choose to read/ignore >>> that >>> > > config >>> > > > >>>>>>> >>> > > > >>>>>>> Any preferences? (1) would align more closely with what we >>> are >>> > > doing >>> > > > >>>>>> today >>> > > > >>>>>>> (they are a top-level concept in the Stores API). >>> > > > >>>>>>> >>> > > > >>>>>>> A3. I like Guozhang's suggestion of making the "primary" >>> > > > >> configuration >>> > > > >>>>>> to >>> > > > >>>>>>> be the new one, and then having a "DefaultStoreTypeSpec" >>> (using >>> > > the >>> > > > >>> old >>> > > > >>>>>>> naming) which respects the old configuration. That seems >>> to solve >>> > > > >>> nearly >>> > > > >>>>>>> all the concerns (e.g. it'd be easy to see where the enum >>> is used >>> > > > >>>>>> because >>> > > > >>>>>>> it would only be used within that one class instead of >>> littered >>> > > > >>>>>> throughout >>> > > > >>>>>>> the code base). >>> > > > >>>>>>> >>> > > > >>>>>>> @Sophie, unless you have objections here I will update the >>> KIP >>> > > to do >>> > > > >>>>>> that. >>> > > > >>>>>>> >>> > > > >>>>>>> A4. I will make these changes to the KIP to make it clear. >>> > > > >>>>>>> >>> > > > >>>>>>> A5. I will rename it `DslStorePlugin` - any objections to >>> this >>> > > name? >>> > > > >>>>>>> >>> > > > >>>>>>> A6. Let's punt this ;) I agree with everyone that this >>> would be a >>> > > > >>>>>> welcome >>> > > > >>>>>>> improvement and that this KIP is aligned with moving in >>> that >>> > > > >>> direction. >>> > > > >>>>>>> Given how much discussion there was on this KIP, which is >>> minor >>> > > > >>>>>> relative to >>> > > > >>>>>>> making the changes to StoreBuilder API, I'd rather not tie >>> the >>> > > two >>> > > > >>>>>>> together. >>> > > > >>>>>>> >>> > > > >>>>>>> Cheers & Thanks everyone for the thoughts! >>> > > > >>>>>>> - Almog >>> > > > >>>>>>> >>> > > > >>>>>>> On Sun, Jul 23, 2023 at 5:15 PM Sophie Blee-Goldman < >>> > > > >>>>>>> ableegold...@gmail.com> >>> > > > >>>>>>> wrote: >>> > > > >>>>>>> >>> > > > >>>>>>>> Guozhang: >>> > > > >>>>>>>> >>> > > > >>>>>>>> On your 2nd point: >>> > > > >>>>>>>> >>> > > > >>>>>>>>> "impl types" (in hindsight it may not be a good name) for >>> > > rocksdb >>> > > > >> / >>> > > > >>>>>>>> memory / custom, and we used "store types" for kv / >>> windowed / >>> > > > >>>>>> sessioned >>> > > > >>>>>>>> etc, >>> > > > >>>>>>>> First off, thanks so much for this clarification -- using >>> "store >>> > > > >>> type" >>> > > > >>>>>>> here >>> > > > >>>>>>>> was definitely making me uncomfortable as this usually >>> refers >>> > > to KV >>> > > > >>> vs >>> > > > >>>>>>>> window, etc -- but I just couldn't for the life of me >>> think of >>> > > the >>> > > > >>>>>> right >>> > > > >>>>>>>> term for rocks vs IM. We should 100% change to something >>> like >>> > > > >>>>>>> StoreImplSpec >>> > > > >>>>>>>> for this kind of interface. >>> > > > >>>>>>>> >>> > > > >>>>>>>>> As for list-value store (for stream-stream Join) >>> > > > >>>>>>>> Again, glad you mentioned this -- I forgot how the extra >>> > > > >>> stream-stream >>> > > > >>>>>>> join >>> > > > >>>>>>>> store is not a "regular" KV Store but rather this special >>> > > > >> list-value >>> > > > >>>>>>> store. >>> > > > >>>>>>>> If we proceed with something like the current approach, >>> perhaps >>> > > > >> that >>> > > > >>>>>>> should >>> > > > >>>>>>>> be a boolean (or enum) parameter in the KVConfig, similar >>> to the >>> > > > >>>>>>>> EmitStrategy? After all, the high-level goal of this KIP >>> is to >>> > > be >>> > > > >>>>>> able to >>> > > > >>>>>>>> fully customize all DSL state stores, and this is >>> currently not >>> > > > >>>>>> possible >>> > > > >>>>>>>> due to KAFKA-14976 < >>> > > > >>> https://issues.apache.org/jira/browse/KAFKA-14976 >>> > > > >>>>>>> . >>> > > > >>>>>>>> >>> > > > >>>>>>>> If we expect there to be further customizations like this >>> going >>> > > > >>>>>> forward, >>> > > > >>>>>>>> perhaps we could instead have each of the three >>> StoreConfig >>> > > classes >>> > > > >>>>>>> accept >>> > > > >>>>>>>> a single enum parameter for the "sub-type" (or whatever >>> you >>> > > want to >>> > > > >>>>>> call >>> > > > >>>>>>>> it), which would encompass (and replace) things like the >>> > > > >> EmitStrategy >>> > > > >>>>>> as >>> > > > >>>>>>>> well as the list-value type (we could define one enum for >>> each >>> > > > >> Config >>> > > > >>>>>>> class >>> > > > >>>>>>>> so there is no accidentally requesting a LIST_VALUE >>> subtype on a >>> > > > >>>>>>>> WindowStore). Thoughts? >>> > > > >>>>>>>> >>> > > > >>>>>>>> Lastly, regarding 3.b: >>> > > > >>>>>>>> >>> > > > >>>>>>>> I love that you brought this up because that is actually >>> what I >>> > > > >> first >>> > > > >>>>>>>> proposed to Almog, ie introducing a param class to clean >>> up the >>> > > > >>>>>>>> StoreBuilder API, during our chat that led to this KIP. He >>> > > pushed >>> > > > >>>>>> back, >>> > > > >>>>>>>> claiming (rightly so) that this change would be huge in >>> scope >>> > > for a >>> > > > >>>>>>> purely >>> > > > >>>>>>>> aesthetic/API change that doesn't add any functionality, >>> and >>> > > that >>> > > > >> it >>> > > > >>>>>>> makes >>> > > > >>>>>>>> more sense to start with the DSL config since there is a >>> clear >>> > > gap >>> > > > >> in >>> > > > >>>>>>>> functionality there, particularly when it comes to custom >>> state >>> > > > >>> stores >>> > > > >>>>>>>> (reasons 1 & 3 in the Motivation section). He did agree >>> that the >>> > > > >>> param >>> > > > >>>>>>>> classes were a better API, which is why you see them in >>> this >>> > > KIP. >>> > > > >> In >>> > > > >>>>>>> other >>> > > > >>>>>>>> words: I fully agree that we should apply this >>> improvement to >>> > > the >>> > > > >>>>>>>> PAPI/StoreBuilder interface as well, but I think that's a >>> > > distinct >>> > > > >>>>>>> concept >>> > > > >>>>>>>> for the time-being and should not block the DSL >>> improvement. >>> > > > >> Rather, >>> > > > >>> I >>> > > > >>>>>>>> consider this KIP as setting the stage for a followup KIP >>> down >>> > > the >>> > > > >>>>>> line >>> > > > >>>>>>> to >>> > > > >>>>>>>> clean up the StoreBuilders and bring them in line with >>> the new >>> > > > >>>>>>> param/config >>> > > > >>>>>>>> class approach. >>> > > > >>>>>>>> >>> > > > >>>>>>>> That said, A) we should definitely make sure whatever we >>> > > introduce >>> > > > >>>>>> here >>> > > > >>>>>>>> can be extended to the PAPI StoreBuilders in a natural >>> way, and >>> > > B) >>> > > > >> I >>> > > > >>>>>>> should >>> > > > >>>>>>>> clarify that I personally would be happy to see this >>> included in >>> > > > >> the >>> > > > >>>>>>>> current KIP, but as Almog's KIP it's up to him to decide >>> whether >>> > > > >> he's >>> > > > >>>>>>>> comfortable expanding the scope like this. If you can >>> convince >>> > > him >>> > > > >>>>>> where >>> > > > >>>>>>> I >>> > > > >>>>>>>> could not, more power to you! :P >>> > > > >>>>>>>> >>> > > > >>>>>>>> On Sun, Jul 23, 2023 at 4:48 PM Sophie Blee-Goldman < >>> > > > >>>>>>>> ableegold...@gmail.com> >>> > > > >>>>>>>> wrote: >>> > > > >>>>>>>> >>> > > > >>>>>>>>> Matthias: >>> > > > >>>>>>>>> >>> > > > >>>>>>>>> I'm not sure I agree with (or maybe don't follow) this >>> take: >>> > > > >>>>>>>>>> >>> > > > >>>>>>>>>> we need all kind of `StoreTypeSpec` implementations, >>> > > > >>>>>>>>>> and it might also imply that we need follow up KIPs for >>> new >>> > > > >> feature >>> > > > >>>>>>>>>> (like in-memory versioned store) that might not need a >>> KIP >>> > > > >>>>>> otherwise. >>> > > > >>>>>>>>>> >>> > > > >>>>>>>>> I see this feature as being a nice add-on/convenience >>> API for >>> > > any >>> > > > >>>>>> store >>> > > > >>>>>>>>> types which have a full DSL implementation. I don't >>> think it's >>> > > > >>>>>>>> unreasonable >>> > > > >>>>>>>>> to just say that this feature is only going to be >>> available for >>> > > > >>>>>> store >>> > > > >>>>>>>> types >>> > > > >>>>>>>>> that have KV, Window, and Session implementations. I >>> can't >>> > > think >>> > > > >> of >>> > > > >>>>>> any >>> > > > >>>>>>>>> case besides versioned stores where this would force a >>> KIP for >>> > > a >>> > > > >> new >>> > > > >>>>>>>>> feature that would not otherwise have to go through a >>> KIP, and >>> > > > >> even >>> > > > >>>>>> for >>> > > > >>>>>>>>> versioned state stores, the only issue is that the KIP >>> for that >>> > > > >> was >>> > > > >>>>>>>> already >>> > > > >>>>>>>>> accepted. >>> > > > >>>>>>>>> >>> > > > >>>>>>>>> However, I think I agree on your main point -- that >>> things like >>> > > > >>>>>>> "regular" >>> > > > >>>>>>>>> vs timestamped vs versioned are/should be an >>> implementation >>> > > detail >>> > > > >>>>>>> that's >>> > > > >>>>>>>>> hidden from the user. As I noted previously, the current >>> KIP >>> > > > >>>>>> actually >>> > > > >>>>>>>>> greatly improves the situation for timestamped stores, >>> as this >>> > > > >>>>>> would be >>> > > > >>>>>>>>> handled completely transparently by the OOTB >>> RocksDBStoreSpec. >>> > > To >>> > > > >>>>>> me, >>> > > > >>>>>>>> this >>> > > > >>>>>>>>> provides a very natural way to let the DSL operators >>> using the >>> > > > >>>>>> default >>> > > > >>>>>>>>> store type/spec to specify which kind of store (eg >>> > > > >>>>>>>>> versioned/timestamped/etc) it wants, and choose the >>> correct >>> > > > >>>>>> default. If >>> > > > >>>>>>>> the >>> > > > >>>>>>>>> eventual intention is to have versioned state stores >>> replace >>> > > > >>>>>>> timestamped >>> > > > >>>>>>>>> stores as the default in the DSL, then we can simply >>> swap out >>> > > the >>> > > > >>>>>>>> versioned >>> > > > >>>>>>>>> stores for the timestamped stores in the >>> RocksDBStoreTypeSpec, >>> > > > >> when >>> > > > >>>>>>> that >>> > > > >>>>>>>>> time comes. Until then, users who want to use the >>> versioned >>> > > store >>> > > > >>>>>> will >>> > > > >>>>>>>> have >>> > > > >>>>>>>>> to do what they do today, which is individually override >>> > > operators >>> > > > >>>>>> via >>> > > > >>>>>>>>> Materialized/StoreSuppliers. >>> > > > >>>>>>>>> >>> > > > >>>>>>>>> All in all, it sounds like we should not offer a >>> versioned >>> > > store >>> > > > >>>>>> type >>> > > > >>>>>>>>> spec, as "versioned" is more akin to "timestamped" than >>> to a >>> > > true >>> > > > >>>>>>>>> difference in underlying store implementation type (eg >>> rocks vs >>> > > > >>>>>>>> in-memory). >>> > > > >>>>>>>>> W.r.t whether to deprecate the old config or introduce a >>> new >>> > > > >> CUSTOM >>> > > > >>>>>>> enum >>> > > > >>>>>>>>> type, either seems fine to me, and we can go with that >>> > > alternative >>> > > > >>>>>>>> instead. >>> > > > >>>>>>>>> The only other con to this approach that I can think of, >>> and >>> > > I'm >>> > > > >>>>>>> honestly >>> > > > >>>>>>>>> not sure if this is something users would care about or >>> only >>> > > devs, >>> > > > >>>>>> is >>> > > > >>>>>>>> that >>> > > > >>>>>>>>> the advantage to moving rocks and IM to the store type >>> spec >>> > > > >>>>>> interface >>> > > > >>>>>>> is >>> > > > >>>>>>>>> that it helps to keep the relevant logic encapsulated in >>> one >>> > > easy >>> > > > >>>>>> place >>> > > > >>>>>>>> you >>> > > > >>>>>>>>> can quickly check to tell what kind of state store is >>> used >>> > > where. >>> > > > >> In >>> > > > >>>>>>> the >>> > > > >>>>>>>>> current code, I found it extremely annoying and >>> difficult to >>> > > track >>> > > > >>>>>> down >>> > > > >>>>>>>> all >>> > > > >>>>>>>>> usages of the StoreType enum to see which actual rocksdb >>> store >>> > > was >>> > > > >>>>>>> being >>> > > > >>>>>>>>> used where (for example some stores using the >>> TimeOrderedBuffer >>> > > > >>>>>>> variants >>> > > > >>>>>>>> in >>> > > > >>>>>>>>> some special cases, or to understand whether the DSL was >>> > > > >> defaulting >>> > > > >>>>>> to >>> > > > >>>>>>>>> plain, timestamped, or versioned stores for RocksDB vs >>> > > InMemory -- >>> > > > >>>>>> both >>> > > > >>>>>>>> of >>> > > > >>>>>>>>> which seem like they could be of interest to a user). >>> This >>> > > would >>> > > > >> be >>> > > > >>>>>>> much >>> > > > >>>>>>>>> easier if everything was handled in one place, and you >>> can >>> > > just go >>> > > > >>>>>> to >>> > > > >>>>>>> the >>> > > > >>>>>>>>> (eg) RocksDBStoreTypeSpec and see what it's doing, or >>> find >>> > > usages >>> > > > >> of >>> > > > >>>>>>> the >>> > > > >>>>>>>>> methods to understand what stores are being handed to >>> which DSL >>> > > > >>>>>>>> operators. >>> > > > >>>>>>>>> >>> > > > >>>>>>>>> I suppose we could still clean up the API and solve this >>> > > problem >>> > > > >> by >>> > > > >>>>>>>> having >>> > > > >>>>>>>>> the old (and new) config delegate to a StoreTypeSpec no >>> matter >>> > > > >> what, >>> > > > >>>>>>> but >>> > > > >>>>>>>>> make RocksDBStoreTypeSpec and InMemoryStoreTypeSpec >>> internal >>> > > > >> classes >>> > > > >>>>>>> that >>> > > > >>>>>>>>> are simply implementation details of the ROCKSDB vs >>> IN_MEMORY >>> > > > >> enums. >>> > > > >>>>>>>> WDYT? >>> > > > >>>>>>>>> >>> > > > >>>>>>>>> >>> > > > >>>>>>>>> On Sun, Jul 23, 2023 at 11:14 AM Guozhang Wang < >>> > > > >>>>>>>> guozhang.wang...@gmail.com> >>> > > > >>>>>>>>> wrote: >>> > > > >>>>>>>>> >>> > > > >>>>>>>>>> Thanks everyone for the great discussions so far! I >>> first saw >>> > > the >>> > > > >>>>>> JIRA >>> > > > >>>>>>>>>> and left some quick thoughts without being aware of the >>> > > > >>>>>>>>>> already-written KIP (kudos to Almog, very great one) >>> and the >>> > > > >>>>>> DISCUSS >>> > > > >>>>>>>>>> thread here. And I happily find some of my initial >>> thoughts >>> > > align >>> > > > >>>>>> with >>> > > > >>>>>>>>>> the KIP already :) >>> > > > >>>>>>>>>> >>> > > > >>>>>>>>>> Would like to add a bit more of my 2c after reading >>> through >>> > > the >>> > > > >> KIP >>> > > > >>>>>>>>>> and the thread here: >>> > > > >>>>>>>>>> >>> > > > >>>>>>>>>> 1. On the high level, I'm in favor of pushing this KIP >>> through >>> > > > >>>>>> without >>> > > > >>>>>>>>>> waiting on the other gaps to be closed. In my back >>> pocket's >>> > > > >>>>>>>>>> "dependency graph" of Kafka Streams roadmap of large >>> changes >>> > > or >>> > > > >>>>>>>>>> feature gaps, the edges of dependencies are defined >>> based on >>> > > my >>> > > > >>>>>>>>>> understanding of whether doing one first would largely >>> > > > >> complicate / >>> > > > >>>>>>>>>> negate the effort of the other but not vice versa, in >>> which >>> > > case >>> > > > >> we >>> > > > >>>>>>>>>> should consider getting the other done first. In this >>> case, I >>> > > > >> feel >>> > > > >>>>>>>>>> such a dependency is not strong enough, so encouraging >>> the KIP >>> > > > >>>>>>>>>> contributor to finish what he/she would love to do to >>> close >>> > > some >>> > > > >>>>>> gaps >>> > > > >>>>>>>>>> early would be higher priorities. I did not see by just >>> doing >>> > > > >> this >>> > > > >>>>>> we >>> > > > >>>>>>>>>> could end up in a worse intermediate stage yet, but I >>> could be >>> > > > >>>>>>>>>> corrected. >>> > > > >>>>>>>>>> >>> > > > >>>>>>>>>> 2. Regarding the store types --- gain here I'd like to >>> just >>> > > > >> clarify >>> > > > >>>>>>>>>> the terms a bit since in the past it has some >>> confusions: we >>> > > used >>> > > > >>>>>>>>>> "impl types" (in hindsight it may not be a good name) >>> for >>> > > > >> rocksdb / >>> > > > >>>>>>>>>> memory / custom, and we used "store types" for kv / >>> windowed / >>> > > > >>>>>>>>>> sessioned etc, as I said in the JIRA I think the current >>> > > proposal >>> > > > >>>>>> also >>> > > > >>>>>>>>>> have a good side effect as quality bar to really >>> enforce us >>> > > think >>> > > > >>>>>>>>>> twice when trying to add more store types in the future >>> as it >>> > > > >> will >>> > > > >>>>>>>>>> impact API instantiations. In the ideal world, I would >>> > > consider: >>> > > > >>>>>>>>>> >>> > > > >>>>>>>>>> * We have (timestamped) kv store, versioned kv store, >>> window >>> > > > >> store, >>> > > > >>>>>>>>>> session store as first-class DSL store types. Some DSL >>> > > operators >>> > > > >>>>>> could >>> > > > >>>>>>>>>> accept multiple store types (e.g. versioned and non >>> versioned >>> > > > >>>>>>>>>> kv-store) for semantics / efficiency trade-offs. But I >>> think >>> > > we >>> > > > >>>>>> would >>> > > > >>>>>>>>>> remove un-timestamped kv stores eventually since that >>> > > efficiency >>> > > > >>>>>>>>>> trade-off is so minimal compared to its usage >>> limitations. >>> > > > >>>>>>>>>> * As for list-value store (for stream-stream Join), >>> > > > >>>>>> memory-lru-cache >>> > > > >>>>>>>>>> (for PAPI use only), memory-time-ordered-buffer (for >>> > > > >> suppression), >>> > > > >>>>>>>>>> they would not be exposed as DSL first-class store >>> types in >>> > > the >>> > > > >>>>>>>>>> future. Instead, they would be treated as internal used >>> stores >>> > > > >>>>>> (e.g. >>> > > > >>>>>>>>>> list-value store is built on key-value store with >>> specialized >>> > > > >> serde >>> > > > >>>>>>>>>> and putInternal), or continue to be just convenient >>> OOTB PAPI >>> > > > >> used >>> > > > >>>>>>>>>> stores only. >>> > > > >>>>>>>>>> * As we move on, we will continue to be very, very >>> strict on >>> > > what >>> > > > >>>>>>>>>> would be added as DSL store types (and hence requires >>> changes >>> > > to >>> > > > >>>>>> the >>> > > > >>>>>>>>>> proposed APIs), what to be added as convenient OOTB >>> PAPI store >>> > > > >>>>>> impls >>> > > > >>>>>>>>>> only, what to be added as internal used store types that >>> > > should >>> > > > >>>>>> not be >>> > > > >>>>>>>>>> exposed to users nor customizable at all. >>> > > > >>>>>>>>>> >>> > > > >>>>>>>>>> 3. Some more detailed thoughts below: >>> > > > >>>>>>>>>> >>> > > > >>>>>>>>>> 3.a) I originally also think that we can extend the >>> existing >>> > > > >>>>>> config, >>> > > > >>>>>>>>>> rather than replacing it. The difference was that I was >>> > > thinking >>> > > > >>>>>> that >>> > > > >>>>>>>>>> order-wise, the runtime would look at the API first, >>> and then >>> > > the >>> > > > >>>>>>>>>> config, whereas in your rejected alternative it was >>> looking at >>> > > > >> the >>> > > > >>>>>>>>>> config first, and then the API --- that I think is a >>> minor >>> > > thing >>> > > > >>>>>> and >>> > > > >>>>>>>>>> either is fine. I'm in agreement that having two configs >>> > > would be >>> > > > >>>>>> more >>> > > > >>>>>>>>>> confusing to users to learn about their precedence >>> rather than >>> > > > >>>>>>>>>> helpful, but if we keep both a config and a public API, >>> then >>> > > the >>> > > > >>>>>>>>>> precedence ordering would not be so confusing as long >>> as we >>> > > state >>> > > > >>>>>> them >>> > > > >>>>>>>>>> clearly. For example: >>> > > > >>>>>>>>>> >>> > > > >>>>>>>>>> * We have DefaultStoreTypeSpec OOTB, in that impl we >>> look at >>> > > the >>> > > > >>>>>>>>>> config only, and would only expect either ROCKS or >>> MEMORY, and >>> > > > >>>>>> return >>> > > > >>>>>>>>>> corresponding OOTB store impls; if any other values >>> > > configured, >>> > > > >> we >>> > > > >>>>>>>>>> error out. >>> > > > >>>>>>>>>> * Users extend that by having MyStoreTypeSpec, in which >>> they >>> > > > >> could >>> > > > >>>>>> do >>> > > > >>>>>>>>>> arbituray things without respecting the config at all, >>> but our >>> > > > >>>>>>>>>> recommended pattern in docs would still say "look into >>> the >>> > > > >> config, >>> > > > >>>>>> if >>> > > > >>>>>>>>>> it is ROCKS or MEMORY just return fall back to >>> > > > >>>>>> DefaultStoreTypeSepc; >>> > > > >>>>>>>>>> otherwise if it's some String you recognize, then >>> return your >>> > > > >>>>>>>>>> customized store based on the string value, otherwise >>> error >>> > > out". >>> > > > >>>>>>>>>> >>> > > > >>>>>>>>>> 3.b) About the struct-like Params classes, I like the >>> idea a >>> > > lot >>> > > > >>>>>> and >>> > > > >>>>>>>>>> wished we would pursue this in the first place, but if >>> we >>> > > only do >>> > > > >>>>>> this >>> > > > >>>>>>>>>> in Spec it would leave some inconsistencies with the >>> > > > >> StoreBuilders >>> > > > >>>>>>>>>> though arguably the latter is only for PAPI. I'm >>> wondering if >>> > > we >>> > > > >>>>>>>>>> should consider including the changes in StoreBuilders >>> (e.g. >>> > > > >>>>>>>>>> WindowStoreBuilder(WindowSupplierParams)), and if yes, >>> maybe >>> > > we >>> > > > >>>>>> should >>> > > > >>>>>>>>>> also consider renaming that e.g. `WindowSupplierParams` >>> to >>> > > > >>>>>>>>>> `WindowStoreSpecParams` too? For this one I only have a >>> "weak >>> > > > >>>>>> feeling" >>> > > > >>>>>>>>>> so I can be convinced otherwise :P >>> > > > >>>>>>>>>> >>> > > > >>>>>>>>>> Thanks, >>> > > > >>>>>>>>>> Guozhang >>> > > > >>>>>>>>>> >>> > > > >>>>>>>>>> >>> > > > >>>>>>>>>> >>> > > > >>>>>>>>>> On Sun, Jul 23, 2023 at 9:52 AM Matthias J. Sax < >>> > > > >> mj...@apache.org> >>> > > > >>>>>>>> wrote: >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> Thanks for all the input. My intention was not to >>> block the >>> > > KIP, >>> > > > >>>>>> but >>> > > > >>>>>>>>>>> just to take a step back and try get a holistic >>> picture and >>> > > > >>>>>>>> discussion, >>> > > > >>>>>>>>>>> to explore if there are good/viable alternative >>> designs. As >>> > > said >>> > > > >>>>>>>>>>> originally, I really like to close this gap, and was >>> always >>> > > > >> aware >>> > > > >>>>>>> that >>> > > > >>>>>>>>>>> the current config is not flexible enough. >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> I guess, my "concern" is that the KIP does increase >>> the API >>> > > > >>>>>> surface >>> > > > >>>>>>>> area >>> > > > >>>>>>>>>>> significantly, as we need all kind of `StoreTypeSpec` >>> > > > >>>>>>> implementations, >>> > > > >>>>>>>>>>> and it might also imply that we need follow up KIPs >>> for new >>> > > > >>>>>> feature >>> > > > >>>>>>>>>>> (like in-memory versioned store) that might not need a >>> KIP >>> > > > >>>>>>> otherwise. >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> The second question is if it might make the already >>> "patchy" >>> > > > >>>>>>> situation >>> > > > >>>>>>>>>>> with regard to customization worse. >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> We did de-scope the original KIP-591 for this reason, >>> and >>> > > given >>> > > > >>>>>> the >>> > > > >>>>>>>> new >>> > > > >>>>>>>>>>> situation of the DSL, it seems that it actually got >>> worse >>> > > > >>>>>> compared >>> > > > >>>>>>> to >>> > > > >>>>>>>>>>> back in the days. >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> Lastly, I hope to make the new versioned stores the >>> default >>> > > in >>> > > > >>>>>> the >>> > > > >>>>>>> DSL >>> > > > >>>>>>>>>>> and we did not do it in the previous KIP due to >>> backward >>> > > > >>>>>>> compatibility >>> > > > >>>>>>>>>>> issues. Thus, from a DSL point of view, I believe there >>> > > should >>> > > > >> be >>> > > > >>>>>>> only >>> > > > >>>>>>>>>>> "RocksDB", "InMemory", and "Custom" in an ideal world. >>> > > > >>>>>> Introducing >>> > > > >>>>>>> (I >>> > > > >>>>>>>> am >>> > > > >>>>>>>>>>> exaggerating to highlight my point) "KvRocksDbSpec", >>> > > > >>>>>>>>>>> "TimestampeKvRocksDbSpec", "VersionedRocksDbSpec", >>> plus the >>> > > > >>>>>>>>>>> corresponding in-memory specs seems to head into the >>> opposite >>> > > > >>>>>>>> direction. >>> > > > >>>>>>>>>>> -- My goal is to give users a handle of the _physical_ >>> store >>> > > > >>>>>>> (RocksDB >>> > > > >>>>>>>> vs >>> > > > >>>>>>>>>>> InMemory vs Custom) but not the _logical_ stores >>> (plain kv, >>> > > > >>>>>> ts-kv, >>> > > > >>>>>>>>>>> versioned) which is "dictated" by the DSL itself and >>> should >>> > > not >>> > > > >>>>>> be >>> > > > >>>>>>>>>>> customizable (we are just in a weird intermediate >>> situation >>> > > that >>> > > > >>>>>> we >>> > > > >>>>>>>> need >>> > > > >>>>>>>>>>> to clean up, but not "lean into" IMHO). >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> Thus, I am also not sure if adding >>> "VersionedRocksDbSpec" >>> > > would >>> > > > >>>>>> be >>> > > > >>>>>>>> ideal >>> > > > >>>>>>>>>>> (also, given that it only changes a single store, but >>> not the >>> > > > >> two >>> > > > >>>>>>>>>>> windowed stores)? >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> Furthermore, I actually hope that we could use the new >>> > > versioned >>> > > > >>>>>>> store >>> > > > >>>>>>>>>>> to replace the window- and sessions- stores, and thus >>> to >>> > > > >> decrease >>> > > > >>>>>>> the >>> > > > >>>>>>>>>>> number of required store types. >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> Admittedly, I am talking a lot about a potential >>> future, but >>> > > the >>> > > > >>>>>>> goal >>> > > > >>>>>>>> is >>> > > > >>>>>>>>>>> only to explore opportunities to not get into "worse" >>> > > > >>>>>> intermediate >>> > > > >>>>>>>>>>> state, that will require a huge deprecation surface >>> area >>> > > later >>> > > > >>>>>> on. >>> > > > >>>>>>> Of >>> > > > >>>>>>>>>>> course, if there is no better way, and my concerns are >>> not >>> > > > >>>>>> shared, I >>> > > > >>>>>>>> am >>> > > > >>>>>>>>>>> ok to move forward with the KIP. >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> Bottom line: I would personally prefer to keep the >>> current >>> > > > >> config >>> > > > >>>>>>> and >>> > > > >>>>>>>>>>> add a `Custom` option to it, plus adding one new >>> config that >>> > > > >>>>>> allows >>> > > > >>>>>>>>>>> people to set their custom `StoreTypeSpec` class. -- I >>> would >>> > > not >>> > > > >>>>>>> add a >>> > > > >>>>>>>>>>> built-in spec for versioned stores at this point (or >>> any >>> > > other >>> > > > >>>>>>>> built-in >>> > > > >>>>>>>>>>> `StorytypeSpec` implementations). I guess, users could >>> write >>> > > a >>> > > > >>>>>>> custom >>> > > > >>>>>>>>>>> spec if they want to enable versioned store across the >>> board >>> > > for >>> > > > >>>>>> now >>> > > > >>>>>>>>>>> (until we make them the default anyway)? >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> Hope my train of thoughts is halfway reasonable and not >>> > > totally >>> > > > >>>>>> off >>> > > > >>>>>>>>>> track? >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> -Matthias >>> > > > >>>>>>>>>>> >>> > > > >>>>>>>>>>> On 7/21/23 15:27, Sophie Blee-Goldman wrote: >>> > > > >>>>>>>>>>>> I agree with everything Almog said above, and will >>> just add >>> > > on >>> > > > >>>>>> to >>> > > > >>>>>>>> two >>> > > > >>>>>>>>>>>> points: >>> > > > >>>>>>>>>>>> >>> > > > >>>>>>>>>>>> 1. Regarding whether to block this KIP on the >>> completion of >>> > > > >>>>>> any or >>> > > > >>>>>>>> all >>> > > > >>>>>>>>>>>> future implementations of in-memory version stores (or >>> > > persist >>> > > > >>>>>>>>>> suppression >>> > > > >>>>>>>>>>>> buffers), I feel that would be unfair to this feature >>> which >>> > > is >>> > > > >>>>>>>>>> completely >>> > > > >>>>>>>>>>>> unrelated to the semantic improvements offered by >>> versioned >>> > > > >>>>>> state >>> > > > >>>>>>>>>> stores. >>> > > > >>>>>>>>>>>> It seems like the responsibility of those driving the >>> > > versioned >>> > > > >>>>>>>> state >>> > > > >>>>>>>>>>>> stores feature, not Almog/this KIP, to make sure that >>> those >>> > > > >>>>>> bases >>> > > > >>>>>>>> are >>> > > > >>>>>>>>>>>> covered. Further, if anything, this KIP will help >>> with the >>> > > > >>>>>> massive >>> > > > >>>>>>>>>>>> proliferation of StoreSuppliers on the Stores factory >>> class, >>> > > > >>>>>> and >>> > > > >>>>>>>>>> provide >>> > > > >>>>>>>>>>>> users with a much easier way to leverage the versioned >>> > > stores >>> > > > >>>>>>>> without >>> > > > >>>>>>>>>>>> having to muck around directly with the >>> StoreSuppliers. >>> > > > >>>>>>>>>>>> >>> > > > >>>>>>>>>>>> I also thought about it a bit, and really like Almog's >>> > > > >>>>>> suggestion >>> > > > >>>>>>> to >>> > > > >>>>>>>>>>>> introduce an additional StoreSpec for the Versioned >>> state >>> > > > >>>>>> stores. >>> > > > >>>>>>>>>> Obviously >>> > > > >>>>>>>>>>>> we can add the RocksDB one to this KIP now, and then >>> as he >>> > > > >>>>>>>> mentioned, >>> > > > >>>>>>>>>>>> there's an easy way to get users onto the >>> > > IMVersionedStateStore >>> > > > >>>>>>>> types >>> > > > >>>>>>>>>> once >>> > > > >>>>>>>>>>>> they are completed. >>> > > > >>>>>>>>>>>> >>> > > > >>>>>>>>>>>> Lastly, on this note, I want to point out how >>> smoothly this >>> > > > >>>>>> solved >>> > > > >>>>>>>> the >>> > > > >>>>>>>>>>>> issue of timestamped stores, which are intended to be >>> the >>> > > DSL >>> > > > >>>>>>>> default >>> > > > >>>>>>>>>> but >>> > > > >>>>>>>>>>>> are only a special case for RocksDB. Right now it can >>> be >>> > > > >>>>>> confusing >>> > > > >>>>>>>>>> for a >>> > > > >>>>>>>>>>>> user scrolling through the endless Stores class and >>> seeing a >>> > > > >>>>>>>>>> timestamped >>> > > > >>>>>>>>>>>> version of the persistent but not in-memory stores. >>> One >>> > > could >>> > > > >>>>>>> easily >>> > > > >>>>>>>>>> assume >>> > > > >>>>>>>>>>>> there was no timestamped option for IM stores and >>> that this >>> > > > >>>>>>> feature >>> > > > >>>>>>>>>> was >>> > > > >>>>>>>>>>>> incomplete, if they weren't acutely aware of the >>> internal >>> > > > >>>>>>>>>> implementation >>> > > > >>>>>>>>>>>> details (namely that it's only required for RocksDB >>> for >>> > > > >>>>>>>> compatibility >>> > > > >>>>>>>>>>>> reasons). However, with this KIP, all that is handled >>> > > > >>>>>> completely >>> > > > >>>>>>>>>>>> transparently to the user, and we the devs, who *are* >>> aware >>> > > of >>> > > > >>>>>> the >>> > > > >>>>>>>>>> internal >>> > > > >>>>>>>>>>>> implementation details, are now appropriately the ones >>> > > > >>>>>> responsible >>> > > > >>>>>>>> for >>> > > > >>>>>>>>>>>> handing the correct store type to a particular >>> operator. >>> > > While >>> > > > >>>>>>>>>> versioned >>> > > > >>>>>>>>>>>> state stores may not be completely comparable, >>> depending on >>> > > > >>>>>>> whether >>> > > > >>>>>>>>>> we want >>> > > > >>>>>>>>>>>> users to remain able to easily choose between using >>> them or >>> > > not >>> > > > >>>>>>> (vs >>> > > > >>>>>>>>>>>> timestamped which should be used by all), I still >>> feel this >>> > > KIP >>> > > > >>>>>>> is a >>> > > > >>>>>>>>>> great >>> > > > >>>>>>>>>>>> step in the right direction that not only should not >>> be >>> > > > >>>>>> blocked on >>> > > > >>>>>>>> the >>> > > > >>>>>>>>>>>> completion of the IM implementations, but in fact >>> should >>> > > > >>>>>>>> specifically >>> > > > >>>>>>>>>> be >>> > > > >>>>>>>>>>>> done first as it enables an easier way to utilize >>> those IM >>> > > > >>>>>>> versioned >>> > > > >>>>>>>>>>>> stores. Just my 2 cents :) >>> > > > >>>>>>>>>>>> >>> > > > >>>>>>>>>>>> 2. The idea to expand the existing the config with a >>> CUSTOM >>> > > > >>>>>> enum >>> > > > >>>>>>>>>> without >>> > > > >>>>>>>>>>>> introducing another config to specify the CUSTOM >>> store spec >>> > > > >>>>>> does >>> > > > >>>>>>> not >>> > > > >>>>>>>>>> seem >>> > > > >>>>>>>>>>>> appropriate, or even possible (for the reasons Almog >>> > > mentioned >>> > > > >>>>>>>> above >>> > > > >>>>>>>>>> about >>> > > > >>>>>>>>>>>> config types, though perhaps there is a way I'm not >>> > > seeing). I >>> > > > >>>>>> do >>> > > > >>>>>>>> not >>> > > > >>>>>>>>>> buy >>> > > > >>>>>>>>>>>> the argument that we should optimize the API to make >>> it easy >>> > > > >>>>>> for >>> > > > >>>>>>>>>> users who >>> > > > >>>>>>>>>>>> just want to switch to all in-memory stores, as I >>> truly >>> > > believe >>> > > > >>>>>>> this >>> > > > >>>>>>>>>> is a >>> > > > >>>>>>>>>>>> very small fraction of the potential userbase of this >>> > > feature >>> > > > >>>>>>>> (anyone >>> > > > >>>>>>>>>> who's >>> > > > >>>>>>>>>>>> actually using this should please chime in!). It >>> seems very >>> > > > >>>>>> likely >>> > > > >>>>>>>>>> that the >>> > > > >>>>>>>>>>>> majority of users of this feature are actually those >>> with >>> > > > >>>>>> custom >>> > > > >>>>>>>> state >>> > > > >>>>>>>>>>>> stores, as to my knowledge, this has been the case >>> any/every >>> > > > >>>>>> time >>> > > > >>>>>>>> this >>> > > > >>>>>>>>>>>> feature was requested by users. >>> > > > >>>>>>>>>>>> >>> > > > >>>>>>>>>>>> That said, while I don't see any way to get around >>> > > introducing >>> > > > >>>>>> a >>> > > > >>>>>>> new >>> > > > >>>>>>>>>>>> config, I don't personally have a preference w.r.t >>> whether >>> > > to >>> > > > >>>>>> keep >>> > > > >>>>>>>>>> around >>> > > > >>>>>>>>>>>> the old config or deprecate it. I simply don't get the >>> > > > >>>>>> impression >>> > > > >>>>>>> it >>> > > > >>>>>>>>>> is >>> > > > >>>>>>>>>>>> very heavily used as it stands today, while it only >>> works >>> > > for >>> > > > >>>>>>> those >>> > > > >>>>>>>>>> who >>> > > > >>>>>>>>>>>> want all in-memory stores. Again, input from actual >>> users >>> > > > >>>>>> would be >>> > > > >>>>>>>>>> very >>> > > > >>>>>>>>>>>> valuable here. In the absence of that data, I will >>> just >>> > > point >>> > > > >>>>>> to >>> > > > >>>>>>> the >>> > > > >>>>>>>>>> fact >>> > > > >>>>>>>>>>>> that this KIP was proposed by a Streams dev (you :P), >>> > > > >>>>>> abandoned, >>> > > > >>>>>>>>>> picked up >>> > > > >>>>>>>>>>>> by another Streams dev, and finally implemented >>> without ever >>> > > > >>>>>>> hearing >>> > > > >>>>>>>>>> from a >>> > > > >>>>>>>>>>>> user that they would find this useful. This is not to >>> > > disparage >>> > > > >>>>>>> the >>> > > > >>>>>>>>>>>> original KIP, but just to say again, as I stated back >>> then, >>> > > it >>> > > > >>>>>>>> seemed >>> > > > >>>>>>>>>> like >>> > > > >>>>>>>>>>>> a major opportunity loss to leave out custom state >>> stores >>> > > > >>>>>>>>>>>> >>> > > > >>>>>>>>>>>> Cheers, >>> > > > >>>>>>>>>>>> Sophie >>> > > > >>>>>>>>>>>> >>> > > > >>>>>>>>>>>> On Fri, Jul 21, 2023 at 1:52 PM Almog Gavra < >>> > > > >>>>>>> almog.ga...@gmail.com> >>> > > > >>>>>>>>>> wrote: >>> > > > >>>>>>>>>>>> >>> > > > >>>>>>>>>>>>> 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 >>> > > > >>>>>>>>>>>>>>>>> >>> > > > >>>>>>>>>>>>>>>> >>> > > > >>>>>>>>>>>>>>> >>> > > > >>>>>>>>>>>>>> >>> > > > >>>>>>>>>>>>> >>> > > > >>>>>>>>>>>> >>> > > > >>>>>>>>>> >>> > > > >>>>>>>>> >>> > > > >>>>>>>> >>> > > > >>>>>>> >>> > > > >>>>>> >>> > > > >>>>> >>> > > > >>>> >>> > > > >>> >>> > > > >> >>> > > > > >>> > > >>> >>