You mean, the performance issue related to `#all` or `#range` query. Right? I reviewed the second approach (i.e., extending `ValueGetter`), and this approach is worth trying. Since KIP-508 was dropped from 2.7.0 release, we have enough time now.
Let me have a try. I think we can have a rough one by this weekend. Regards, Dongjin On Thu, Oct 1, 2020 at 4:52 AM John Roesler <vvcep...@apache.org> wrote: > Thanks Dongjin, > > It typically is nicer to be able to see usage examples, so > I'd certainly be in favor if you're willing to add it to the > KIP. > > I'm wondering if it's possible to implement the whole > ReadOnlyKeyValueStore interface as proposed, if we really go > ahead and just internally query into the suppression buffer > as well as using the upstream ValueGetter. The reason is > twofold: > 1. The suppression buffer is ordered by arrival time, not by > key. There is a by-key index, but it is also not ordered the > same way that in-memory stores are ordered. Thus, we'd have > a hard time implementing key-based range scans. > 2. The internal ValueGetter interface only supports get-by- > key lookups, so it would also need to be expanded to support > range scans on the parent table. > > Neither of these problems are insurmountable, but I'm > wondering if we _want_ to surmount them right now. Or should > we instead just throw an UnsupportedOperationException on > any API call that's inconvenient to implement right now? > Then, we could get incremental value by first supporting > (eg) key-based lookups and adding scans later. > > Or does this mean that our design so far is invalid, and we > should really just make people provision a separate > Materialized downstream? To pull this off, we'd need to > first address KIP-300's challenges, though. > > I'm honestly not sure what the right call is here. > > Thanks, > -John > > On Thu, 2020-10-01 at 01:50 +0900, Dongjin Lee wrote: > > > It seems like it must be a ReadOnlyKeyValueStore. Does that sound > right? > > > > Yes, it is. Would it be better to add a detailed description of how this > > feature effects interactive query, with examples? > > > > Best, > > Dongjin > > > > On Tue, Sep 29, 2020 at 10:31 AM John Roesler <vvcep...@apache.org> > wrote: > > > > > Hi Dongjin, > > > > > > Thanks! Sorry, I missed your prior message. The proposed API looks > good to > > > me. > > > > > > I’m wondering if we should specify what kind of store view would be > > > returned when querying the operation result. It seems like it must be a > > > ReadOnlyKeyValueStore. Does that sound right? > > > > > > Thanks! > > > John > > > > > > On Mon, Sep 28, 2020, at 10:06, Dongjin Lee wrote: > > > > Hi John, > > > > > > > > I updated the KIP with the discussion above. The 'Public Interfaces' > > > > section describes the new API, and the 'Rejected Alternatives' > section > > > > describes the reasoning about why we selected this API design and > > > rejected > > > > the other alternatives. > > > > > > > > Please have a look when you are free. And please note that the KIP > freeze > > > > for 2.7.0 is imminent. > > > > > > > > Thanks, > > > > Dongjin > > > > > > > > On Mon, Sep 21, 2020 at 11:35 PM Dongjin Lee <dong...@apache.org> > wrote: > > > > > > > > > Hi John, > > > > > > > > > > I updated the PR applying the API changes we discussed above. I am > now > > > > > updating the KIP document. > > > > > > > > > > Thanks, > > > > > Dongjin > > > > > > > > > > On Sat, Sep 19, 2020 at 10:42 AM John Roesler <vvcep...@apache.org > > > > > wrote: > > > > > > Hi Dongjin, > > > > > > > > > > > > Yes, that’s right. My the time of KIP-307, we had no choice but > to > > > add a > > > > > > second name. But we do have a choice with Suppress. > > > > > > > > > > > > Thanks! > > > > > > -John > > > > > > > > > > > > On Thu, Sep 17, 2020, at 13:14, Dongjin Lee wrote: > > > > > > > Hi John, > > > > > > > > > > > > > > I just reviewed KIP-307. As far as I understood, ... > > > > > > > > > > > > > > 1. There was Materialized name initially. > > > > > > > 2. With KIP-307, Named Operations were added. > > > > > > > 3. Now we have two options for materializing suppression. If > we take > > > > > > > Materialized name here, we have two names for the same > operation, > > > which > > > > > > is > > > > > > > not feasible. > > > > > > > > > > > > > > Do I understand correctly? > > > > > > > > > > > > > > > Do you have a use case in mind for having two separate names > for > > > the > > > > > > > operation and the view? > > > > > > > > > > > > > > No. I am now entirely convinced with your suggestion. > > > > > > > > > > > > > > I just started to update the draft implementation. If I > understand > > > > > > > correctly, please notify me; I will update the KIP by adding > the > > > > > > discussion > > > > > > > above. > > > > > > > > > > > > > > Best, > > > > > > > Dongjin > > > > > > > > > > > > > > On Thu, Sep 17, 2020 at 11:06 AM John Roesler < > vvcep...@apache.org> > > > > > > wrote: > > > > > > > > Hi Dongjin, > > > > > > > > > > > > > > > > Thanks for the reply. Yes, that’s correct, we added that > method to > > > > > > name > > > > > > > > the operation. But the operation seems synonymous with the > view > > > > > > produced > > > > > > > > the operation, right? > > > > > > > > > > > > > > > > During KIP-307, I remember thinking that it’s unfortunate > the we > > > had > > > > > > to > > > > > > > > have two different “name” concepts for the same thing just > because > > > > > > setting > > > > > > > > the name on Materialized is equivalent both to making it > > > queriable and > > > > > > > > actually materializing it. > > > > > > > > > > > > > > > > If we were to reconsider the API, it would be nice to treat > these > > > > > > three as > > > > > > > > orthogonal: > > > > > > > > * specify a name > > > > > > > > * flag to make the view queriable > > > > > > > > * flag to materialize the view > > > > > > > > > > > > > > > > That was the context behind my suggestion. Do you have a use > case > > > in > > > > > > mind > > > > > > > > for having two separate names for the operation and the view? > > > > > > > > > > > > > > > > Thanks, > > > > > > > > John > > > > > > > > > > > > > > > > On Wed, Sep 16, 2020, at 11:43, Dongjin Lee wrote: > > > > > > > > > Hi John, > > > > > > > > > > > > > > > > > > It seems like the available alternatives in this point is > clear: > > > > > > > > > > > > > > > > > > 1. Pass queriable name as a separate parameter (i.e., > > > > > > > > > `KTable#suppress(Suppressed, String)`) > > > > > > > > > 2. Make use of the Suppression processor name as a > queryable > > > name by > > > > > > > > adding > > > > > > > > > `enableQuery` optional flag to `Suppressed`. > > > > > > > > > > > > > > > > > > However, I doubt the second approach a little bit; As far > as I > > > > > > know, the > > > > > > > > > processor name is introduced in KIP-307[^1] to make > debugging > > > > > > topology > > > > > > > > easy > > > > > > > > > and understandable. Since the processor name is an > independent > > > > > > concept > > > > > > > > with > > > > > > > > > the materialization, I feel the first approach is more > natural > > > and > > > > > > > > > consistent. Is there any specific reason that you prefer > the > > > second > > > > > > > > > approach? > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > Dongjin > > > > > > > > > > > > > > > > > > [^1]: > > > > > > > > > > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-307%3A+Allow+to+define+custom+processor+names+with+KStreams+DSL > > > > > > > > > > > > > > > > > > > > > > > > > > > On Wed, Sep 16, 2020 at 11:48 PM John Roesler < > > > vvcep...@apache.org> > > > > > > > > wrote: > > > > > > > > > > Hi Dongjin, > > > > > > > > > > > > > > > > > > > > Yes, that's where I was leaning. Although, I'd prefer > adding > > > > > > > > > > the option to Suppressed instead of adding a new > argument to > > > > > > > > > > the method call. > > > > > > > > > > > > > > > > > > > > What do you think about: > > > > > > > > > > > > > > > > > > > > class Suppressed<K> { > > > > > > > > > > + public Suppressed<K> enableQuery(); > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > Since Suppressed already has `withName(String)`, it seems > > > > > > > > > > like all we need to add is a boolean flag. > > > > > > > > > > > > > > > > > > > > Does that seem sensible to you? > > > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > > -John > > > > > > > > > > > > > > > > > > > > On Wed, 2020-09-16 at 21:50 +0900, Dongjin Lee wrote: > > > > > > > > > > > Hi John, > > > > > > > > > > > > > > > > > > > > > > > Although it's not great to have "special snowflakes" > in > > > the > > > > > > API, > > > > > > > > > > Choice B > > > > > > > > > > > does seem safer in the short term. We would basically > be > > > > > > proposing a > > > > > > > > > > > temporary API to make the suppressed view queriable > without > > > a > > > > > > > > > > Materialized > > > > > > > > > > > argument. > > > > > > > > > > > > > > > > > > > > > > Then, it seems like you prefer > `KTable#suppress(Suppressed, > > > > > > String)` > > > > > > > > > > (i.e., > > > > > > > > > > > queriable name only as a parameter) for this time, and > > > refine > > > > > > API > > > > > > > > with > > > > > > > > > > the > > > > > > > > > > > other related KIPs later. > > > > > > > > > > > > > > > > > > > > > > Do I understand correctly? > > > > > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > > > Dongjin > > > > > > > > > > > > > > > > > > > > > > On Wed, Sep 16, 2020 at 2:17 AM John Roesler < > > > > > > vvcep...@apache.org> > > > > > > > > > > wrote: > > > > > > > > > > > > Hi Dongjin, > > > > > > > > > > > > > > > > > > > > > > > > Thanks for presenting these options. The concern that > > > > > > > > > > > > Matthias brought up is a very deep problem that > afflicts > > > all > > > > > > > > > > > > operations downstream of windowing operations. It's > the > > > same > > > > > > > > > > > > thing that derailed KIP-300. For the larger context, > I > > > have > > > > > > > > > > > > developed a couple of approaches to resolve this > > > situation, > > > > > > > > > > > > but I think it makes sense to finish up KIP-478 > before > > > > > > > > > > > > presenting them. > > > > > > > > > > > > > > > > > > > > > > > > However, I don't think that we need in particular to > block > > > > > > > > > > > > the current proposal on solving that long-running > and deep > > > > > > > > > > > > issue with the DSL. Instead, we should make a > top-level > > > > > > > > > > > > decision whether to: > > > > > > > > > > > > > > > > > > > > > > > > A: Make Suppress just like all the other KTable > > > operations. > > > > > > > > > > > > It will have the same pathological behavior that the > > > keyset > > > > > > > > > > > > is unbounded while the store implementation is only a > > > > > > > > > > > > KeyValueStore. Again, this exact pathology currently > > > affects > > > > > > > > > > > > all KTable operations that follow from windowing > > > operations. > > > > > > > > > > > > For example, it applies to the current workaround > that > > > > > > > > > > > > Dongjin documented in the KIP: > > > > > > > > > > > > suppress().filter(Materialized<KeyValueStore>). This > is > > > > > > > > > > > > Option 2 that Dongjin presented. > > > > > > > > > > > > > > > > > > > > > > > > B: Do something different with Suppress in order to > side- > > > > > > > > > > > > step the problem. For example, Suppress does not > _need_ to > > > > > > > > > > > > have a separate state store at all. If we just give > > > people a > > > > > > > > > > > > switch to make the operation queriable, we can > implement a > > > > > > > > > > > > ReadOnlyKeyValueStore interface by querying the > > > "priorValue" > > > > > > > > > > > > of the buffer first and then querying the upstream > > > > > > > > > > > > ValueGetter. This broad category of "do something > > > different > > > > > > > > > > > > with Suppress" encompases Option 1 and Option 3 that > > > Dongjin > > > > > > > > > > > > presented. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Speaking personally, I think Choice A would be the > most > > > > > > > > > > > > obvious and least weird choice, but it presents a > serious > > > > > > > > > > > > risk of escalating the severity of the problem of > > > unbounded > > > > > > > > > > > > state. This is currently a risk that we're aware of, > but > > > has > > > > > > > > > > > > not yet become a big problem in practice. As Matthias > > > > > > > > > > > > pointed out, Suppress is far more likely to be used > > > > > > > > > > > > downstream of windowed tables than other operations, > so > > > > > > > > > > > > having a Materialized<KVStore> overload has the > > > significant > > > > > > > > > > > > risk of getting people into a bad state. Note, > broadly > > > > > > > > > > > > advertising the workaround from the KIP would have > the > > > exact > > > > > > > > > > > > same impact, so we should be careful about > recommending > > > it. > > > > > > > > > > > > Although it's not great to have "special snowflakes" > in > > > the > > > > > > > > > > > > API, Choice B does seem safer in the short term. We > would > > > > > > > > > > > > basically be proposing a temporary API to make the > > > > > > > > > > > > suppressed view queriable without a Materialized > argument. > > > > > > > > > > > > Then, once we fix the main KIP-300 problem, we would > look > > > at > > > > > > > > > > > > converging Suppress with the rest of the KTable > > > > > > > > > > > > materialization APIs. > > > > > > > > > > > > > > > > > > > > > > > > WDYT? > > > > > > > > > > > > Thanks, > > > > > > > > > > > > -John > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Wed, 2020-09-16 at 00:01 +0900, Dongjin Lee wrote: > > > > > > > > > > > > > Hi Matthias, > > > > > > > > > > > > > > > > > > > > > > > > > > Thank you very much for the detailed feedback. > Here are > > > my > > > > > > > > opinions: > > > > > > > > > > > > > > Because there is no final result for non-windowed > > > > > > KTables, it > > > > > > > > seems > > > > > > > > > > > > that > > > > > > > > > > > > > this new feature only make sense for the > > > > > > windowed-aggregation > > > > > > > > case? > > > > > > > > > > > > > I think a little bit different. Of course, for > windowed > > > > > > KTable, > > > > > > > > this > > > > > > > > > > > > > feature provides the final state; for non-windowed > > > KTables, > > > > > > it > > > > > > > > > > provides a > > > > > > > > > > > > > view to the records received more than the > predefined > > > > > > waiting > > > > > > > > time > > > > > > > > > > ago - > > > > > > > > > > > > > excluding the records that are waiting for more > events. > > > > > > > > > > > > > > > > > > > > > > > > > > > Thus, the signature of `Materialized` should > take a > > > > > > > > `WindowStore` > > > > > > > > > > > > instead > > > > > > > > > > > > > of a `KeyValueStore`? > > > > > > > > > > > > > > > > > > > > > > > > > > I reviewed the implementation following your > comments > > > and > > > > > > found > > > > > > > > the > > > > > > > > > > > > > following: > > > > > > > > > > > > > > > > > > > > > > > > > > 1. `Materialized` instance includes the following: > > > KeySerde, > > > > > > > > > > ValueSerde, > > > > > > > > > > > > > StoreSupplier, and Queriable Name. > > > > > > > > > > > > > 2. The other `Materialized` method variants in > `KTable` > > > are > > > > > > > > making > > > > > > > > > > use of > > > > > > > > > > > > > KeySerde, ValueSerde, and Queriable Name only. > (That is, > > > > > > > > > > StoreSupplier is > > > > > > > > > > > > > ignored.) > > > > > > > > > > > > > 3. `KTable#suppress(Suppressed, Materialized)` > uses the > > > > > > Queriable > > > > > > > > > > Name > > > > > > > > > > > > > only. StoreSupplier is also ignored. > > > > > > > > > > > > > > > > > > > > > > > > > > So, we have three choices for the method signature: > > > > > > > > > > > > > > > > > > > > > > > > > > 1. `KTable#suppress(Suppressed, String)` (i.e., > passing > > > the > > > > > > > > Queriable > > > > > > > > > > > > Name > > > > > > > > > > > > > only): > > > > > > > > > > > > > > > > > > > > > > > > > > This is the simplest; however, it is inconsistent > > > with the > > > > > > > > other > > > > > > > > > > > > > Materialized variant methods. > > > > > > > > > > > > > > > > > > > > > > > > > > 2. `KTable#suppress(Suppressed, Materialized<K, V, > > > > > > > > KeyValueStore>)` > > > > > > > > > > > > (i.e., > > > > > > > > > > > > > current proposal) > > > > > > > > > > > > > > > > > > > > > > > > > > This approach is harmless at this point, for > > > > > > StoreSupplier is > > > > > > > > > > ignored; > > > > > > > > > > > > > However, since suppression can be used to both of > > > > > > > > `KeyValueStore` and > > > > > > > > > > > > > `WindowStore`, this approach is not only weird but > also > > > > > > leaving > > > > > > > > some > > > > > > > > > > > > > potential risk to the future. (On second thoughts, > I > > > agree, > > > > > > this > > > > > > > > API > > > > > > > > > > > > design > > > > > > > > > > > > > is bad and dangerous.) > > > > > > > > > > > > > > > > > > > > > > > > > > 3. `KTable#suppress(Suppressed, Materialized<K, V, > > > > > > StateStore>)` > > > > > > > > > > > > > This approach embraces both of `KeyValueStore` > and > > > > > > > > `WindowStore` > > > > > > > > > > cases. > > > > > > > > > > > > > Since the concrete class type of `Suppressed` > instance > > > > > > differs > > > > > > > > for > > > > > > > > > > the > > > > > > > > > > > > > `StateStore`[^1], it seems like we can validate the > > > > > > arguments on > > > > > > > > the > > > > > > > > > > > > method > > > > > > > > > > > > > call. (e.g., throw `IllegalArgumentException` if > when > > > > > > > > `Suppressed` > > > > > > > > > > > > instance > > > > > > > > > > > > > on `KeyValueStore` is given with `Materialized` > > > instance of > > > > > > > > > > > > `WindowStore`.) > > > > > > > > > > > > > This approach not only breaks the API consistency > but > > > also > > > > > > guards > > > > > > > > > > from a > > > > > > > > > > > > > miss-usage of the API. > > > > > > > > > > > > > > > > > > > > > > > > > > How do you think? I am now making a try on the > third > > > > > > approach. > > > > > > > > > > > > > Thanks, > > > > > > > > > > > > > Dongjin > > > > > > > > > > > > > > > > > > > > > > > > > > [^1]: `SuppressedInternal` for `KeyValueStore` and > > > > > > > > > > > > > `FinalResultsSuppressionBuilder` for `WindowStore`. > > > > > > > > > > > > > > > > > > > > > > > > > > On Sat, Sep 12, 2020 at 3:29 AM Matthias J. Sax < > > > > > > > > mj...@apache.org> > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > Thanks for updating the KIP. > > > > > > > > > > > > > > > > > > > > > > > > > > > > I think there is still one open question. > `suppress()` > > > > > > can be > > > > > > > > used > > > > > > > > > > on > > > > > > > > > > > > > > non-windowed KTable for rate control, as well as > on a > > > > > > > > > > windowed-KTable > > > > > > > > > > > > > > (also for rate control, but actually mainly) for > only > > > > > > emitting > > > > > > > > the > > > > > > > > > > > > final > > > > > > > > > > > > > > result of a windowed aggregation. For the > non-windowed > > > > > > case, we > > > > > > > > > > use a > > > > > > > > > > > > > > KeyValueStore while for the windowed cases, we > use a > > > > > > > > WindowStore. > > > > > > > > > > > > > > Because there is no final result for non-windowed > > > > > > KTables, it > > > > > > > > seems > > > > > > > > > > > > that > > > > > > > > > > > > > > this new feature only make sense for the > > > > > > windowed-aggregation > > > > > > > > case? > > > > > > > > > > > > > > Thus, the signature of `Materialized` should > take a > > > > > > > > `WindowStore` > > > > > > > > > > > > > > instead of a `KeyValueStore`? > > > > > > > > > > > > > > > > > > > > > > > > > > > > If that's correct, I am wondering: > > > > > > > > > > > > > > > > > > > > > > > > > > > > - Can we guard from a miss-usage of the API if > the > > > > > > upstream > > > > > > > > > > KTable is > > > > > > > > > > > > > > not windowed (or maybe it's not necessary to > guard)? > > > > > > > > > > > > > > - Can we actually implement it? We had issues > with > > > > > > regard to > > > > > > > > > > KIP-300 > > > > > > > > > > > > to > > > > > > > > > > > > > > materialize windowed-KTables? > > > > > > > > > > > > > > > > > > > > > > > > > > > > Would be worth to clarify upfront. Maybe, we even > > > need a > > > > > > POC > > > > > > > > > > > > > > implementation to verify that it works? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -Matthias > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On 9/11/20 12:26 AM, Dongjin Lee wrote: > > > > > > > > > > > > > > > Hi All, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Here is the voting thread: > > > > > > > > > > > > > > > > > > > https://lists.apache.org/thread.html/r5653bf2dafbb27b247bf20dbe6f070c151b3823d96c9c9ca94183e20%40%3Cdev.kafka.apache.org%3E > > > > > > > > > > > > > > > Thanks, > > > > > > > > > > > > > > > Dongjin > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Fri, Sep 11, 2020 at 4:23 PM Dongjin Lee < > > > > > > > > dong...@apache.org> > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > Hi John, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks for the feedback. I will open the Vote > > > thread > > > > > > now. > > > > > > > > > > > > > > > > Best, > > > > > > > > > > > > > > > > Dongjin > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Fri, Sep 11, 2020 at 2:00 AM John Roesler > < > > > > > > > > > > vvcep...@apache.org> > > > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > Hi Dongjin, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Sorry for the delay. I'm glad you're still > > > pushing > > > > > > this > > > > > > > > > > > > > > > > > forward. It would be nice to get this in > to the > > > 2.7 > > > > > > > > release. > > > > > > > > > > > > > > > > > I just took another look at the KIP, and it > > > looks > > > > > > good to > > > > > > > > > > > > > > > > > me! > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I think this is ready for a vote. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > > > > > > > > > -John > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Wed, 2020-08-05 at 22:04 +0900, Dongjin > Lee > > > > > > wrote: > > > > > > > > > > > > > > > > > > Hi All, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I updated the KIP > > > > > > > > > > > > > > > > > > < > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-508%3A+Make+Suppression+State+Queriable > > > > > > > > > > > > > > > > > > and the implementation, following the > > > discussion > > > > > > here. > > > > > > > > > > > > > > > > > > You must be working hard preparing the > > > release of > > > > > > > > 2.6.0, so > > > > > > > > > > > > please > > > > > > > > > > > > > > have > > > > > > > > > > > > > > > > > a > > > > > > > > > > > > > > > > > > look after your work is done. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > > > > > > > > > > Dongjin > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Sun, Mar 8, 2020 at 12:20 PM John > Roesler < > > > > > > > > > > > > vvcep...@apache.org> > > > > > > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > > Thanks Matthias, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Good idea. I've changed the ticket > name and > > > > > > added a > > > > > > > > note > > > > > > > > > > > > > > > > > > > clarifying that this ticket is not the > same > > > as > > > > > > https://issues.apache.org/jira/browse/KAFKA-7224 > > > > > > > > > > > > > > > > > > > Incidentally, I learned that I never > > > documented > > > > > > my > > > > > > > > > > reasons > > > > > > > > > > > > > > > > > > > for abandoning my work on KAFKA-7224 ! > I've > > > now > > > > > > > > updated > > > > > > > > > > > > > > > > > > > that ticket, too, so your question had > an > > > > > > unexpected > > > > > > > > > > > > side-benefit. > > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > > > > > > > > > > > -John > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Sat, Mar 7, 2020, at 18:01, > Matthias J. > > > Sax > > > > > > wrote: > > > > > > > > > > > > > > > Thanks for clarification. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Can you maybe update the Jira ticket? Do we > have a > > > > > > ticket for > > > > > > > > > > > > > > > spill-to-disk? Maybe link to it and explain > that > > > it's > > > > > > two > > > > > > > > > > different > > > > > > > > > > > > > > > things? Maybe even rename the ticket to > something > > > more > > > > > > > > clear, ie, > > > > > > > > > > > > > > > "make suppress result queryable" or simliar? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -Matthias > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On 3/7/20 1:58 PM, John Roesler wrote: > > > > > > > > > > > > > > > > > > > > > > Hey Matthias, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I’m sorry if the ticket was > poorly > > > > > > stated. The > > > > > > > > > > ticket > > > > > > > > > > > > is to add a > > > > > > > > > > > > > > > DSL overload to pass a Materialized argument to > > > > > > suppress. As > > > > > > > > a > > > > > > > > > > > > > > > > > > result, > > > > > > > > > > > > > > > the result of the suppression would be > queriable. > > > > > > > > > > > > > > > > > > > > > > This is unrelated to “persistent > > > buffer” > > > > > > aka > > > > > > > > > > > > “spill-to-disk”. > > > > > > > > > > > > > > > > > > > > > > There was some confusion before > about > > > > > > whether > > > > > > > > this > > > > > > > > > > > > ticket could be > > > > > > > > > > > > > > > implemented as “query the buffer”. Maybe it > can, > > > but not > > > > > > > > > > trivially. > > > > > > > > > > > > > > > The obvious way is just to add a new state > store > > > which > > > > > > we > > > > > > > > write > > > > > > > > > > the > > > > > > > > > > > > > > > results into just before we forward. I.e., it’s > > > exactly > > > > > > like > > > > > > > > the > > > > > > > > > > > > > > > materialized variant of any stateless KTable > > > operation. > > > > > > > > > > > > > > > > > > > > > > Thanks, John > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Sat, Mar 7, 2020, at 15:32, > > > Matthias > > > > > > J. Sax > > > > > > > > > > wrote: > > > > > > > > > > > > Thanks for > > > > > > > > > > > > > > > > > > > > > > the KIP Dongjin, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I am still not sure if I can > follow, > > > what > > > > > > might > > > > > > > > > > also > > > > > > > > > > > > be caused by > > > > > > > > > > > > > > > > > > > > > > the backing JIRA ticket (maybe > John > > > can > > > > > > > > clarify the > > > > > > > > > > > > intent of the > > > > > > > > > > > > > > > > > > > > > > ticket as he created it): > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Currently, suppress() only uses > an > > > > > > in-memory > > > > > > > > buffer > > > > > > > > > > > > and my > > > > > > > > > > > > > > > > > > > > > > understanding of the Jira is, to > add > > > the > > > > > > > > ability to > > > > > > > > > > > > use a > > > > > > > > > > > > > > > > > > > > > > persistent buffer (ie, spill to > disk > > > > > > backed by > > > > > > > > > > > > RocksDB). > > > > > > > > > > > > > > > > > > > > > > Adding a persistent buffer is > > > completely > > > > > > > > unrelated > > > > > > > > > > to > > > > > > > > > > > > allow > > > > > > > > > > > > > > > > > > > > > > querying the buffer. In fact, one > > > could > > > > > > query > > > > > > > > an > > > > > > > > > > > > in-memory buffer, > > > > > > > > > > > > > > > > > > > > > > too. However, querying the buffer > > > does not > > > > > > > > really > > > > > > > > > > seem > > > > > > > > > > > > to be > > > > > > > > > > > > > > > > > > useful > > > > > > > > > > > > > > > > > > > > > > as pointed out by John, as you > can > > > always > > > > > > > > query the > > > > > > > > > > > > upstream > > > > > > > > > > > > > > > > > > KTable > > > > > > > > > > > > > > > > > > > > > > store. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Also note that for the > > > > > > emit-on-window-close > > > > > > > > case > > > > > > > > > > the > > > > > > > > > > > > result is > > > > > > > > > > > > > > > > > > > > > > deleted from the buffer when it > is > > > > > > emitted, and > > > > > > > > > > thus > > > > > > > > > > > > cannot be > > > > > > > > > > > > > > > > > > > > > > queried any longe r. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Can you please clarify if you > intend > > > to > > > > > > allow > > > > > > > > > > spilling > > > > > > > > > > > > to disk or > > > > > > > > > > > > > > > > > > > > > > if you intent to enable IQ (even > if I > > > > > > don't > > > > > > > > see why > > > > > > > > > > > > querying make > > > > > > > > > > > > > > > > > > > > > > sense, as the data is either > upstream > > > or > > > > > > > > deleted). > > > > > > > > > > > > Also, if you > > > > > > > > > > > > > > > > > > > > > > want to enable IQ, why do we > need all > > > > > > those new > > > > > > > > > > > > interfaces? The > > > > > > > > > > > > > > > > > > > > > > result of a suppress() is a > KTable > > > that > > > > > > is the > > > > > > > > > > same as > > > > > > > > > > > > any other > > > > > > > > > > > > > > > > > > > > > > key-value/windowed/sessions > store? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > We should also have > corresponding Jira > > > > > > tickets > > > > > > > > for > > > > > > > > > > > > different cases > > > > > > > > > > > > > > > > > > > > > > to avoid the confusion I am in > atm :) > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -Matthias > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On 2/27/20 8:21 AM, John Roesler > > > wrote: > > > > > > > > > > > > > > > > > > > > > > > > > Hi Dongjin, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > No problem; glad we got it > > > sorted > > > > > > out. > > > > > > > > > > > > > > > > > > > > > > > > > Thanks again for picking > this > > > up! > > > > > > -John > > > > > > > > > > > > > > > > > > > > > > > > > On Wed, Feb 26, 2020, at > 09:24, > > > > > > Dongjin > > > > > > > > Lee > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > > > > > > > > > > I was under the > impression > > > that > > > > > > you > > > > > > > > > > wanted > > > > > > > > > > > > to expand the > > > > > > > > > > > > > > > > > > > > > > > > > > > scope of the KIP > > > > > > > > > > > > > > > > > > > > > > > > > > to additionally allow > > > querying the > > > > > > > > internal > > > > > > > > > > > > buffer, not > > > > > > > > > > > > > > > > > > > > > > > > > > just the result. Can you > > > clarify > > > > > > > > whether > > > > > > > > > > you > > > > > > > > > > > > are proposing > > > > > > > > > > > > > > > > > > > > > > > > > > to allow querying the > state > > > of the > > > > > > > > internal > > > > > > > > > > > > buffer, the > > > > > > > > > > > > > > > > > > > > > > > > > > result, or both? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Sorry for the confusion. > As we > > > > > > already > > > > > > > > > > talked > > > > > > > > > > > > with, we > > > > > > > > > > > > > > > > > > only > > > > > > > > > > > > > > > > > > > > > > > > > > need to query the > suppressed > > > > > > output, > > > > > > > > not > > > > > > > > > > the > > > > > > > > > > > > internal > > > > > > > > > > > > > > > > > > > > > > > > > > buffer. The current > > > > > > implementation is > > > > > > > > > > wrong. > > > > > > > > > > > > After > > > > > > > > > > > > > > > > > > refining > > > > > > > > > > > > > > > > > > > > > > > > > > the KIP and > implementation > > > > > > accordingly > > > > > > > > I > > > > > > > > > > will > > > > > > > > > > > > notify you - > > > > > > > > > > > > > > > > > > > > > > > > > > I must be confused, also. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks, Dongjin > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Tue, Feb 25, 2020 at > 12:17 > > > AM > > > > > > John > > > > > > > > > > Roesler > > > > > > > > > > > > > > > > > > > > > > > > > > <vvcep...@apache.org> > wrote: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Hi Dongjin, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Ah, I think I may have > been > > > > > > > > confused. I > > > > > > > > > > 100% > > > > > > > > > > > > agree that > > > > > > > > > > > > > > > > > > > > > > > > > > > we need a materialized > > > variant > > > > > > for > > > > > > > > > > > > suppress(). Then, you > > > > > > > > > > > > > > > > > > > > > > > > > > > could do: > ...suppress(..., > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Materialized.as(“final-count”)) > > > > > > > > > > > > > > > > > > > > > > > > > > > If that’s your > proposal, > > > then > > > > > > we are > > > > > > > > on > > > > > > > > > > the > > > > > > > > > > > > same page. > > > > > > > > > > > > > > > > > > > > > > > > > > > I was under the > impression > > > that > > > > > > you > > > > > > > > > > wanted > > > > > > > > > > > > to expand the > > > > > > > > > > > > > > > > > > > > > > > > > > > scope of the KIP to > > > additionally > > > > > > > > allow > > > > > > > > > > > > querying the > > > > > > > > > > > > > > > > > > > > > > > > > > > internal buffer, not > just > > > the > > > > > > > > result. Can > > > > > > > > > > > > you clarify > > > > > > > > > > > > > > > > > > > > > > > > > > > whether you are > proposing to > > > > > > allow > > > > > > > > > > querying > > > > > > > > > > > > the state of > > > > > > > > > > > > > > > > > > > > > > > > > > > the internal buffer, > the > > > > > > result, or > > > > > > > > both? > > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks, John > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Thu, Feb 20, 2020, > at > > > 08:41, > > > > > > > > Dongjin > > > > > > > > > > Lee > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > > > > > > > > > > > Hi John, Thanks for > your > > > kind > > > > > > > > > > explanation > > > > > > > > > > > > with an > > > > > > > > > > > > > > > > > > > > > > > > > > > > example. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > But it feels like > you're > > > > > > saying > > > > > > > > > > you're > > > > > > > > > > > > trying to do > > > > > > > > > > > > > > > > > > > > > > > > > > > > > something different > > > > > > > > > > > > > > > > > > > > > > > > > > > > than just query the > > > windowed > > > > > > key > > > > > > > > and > > > > > > > > > > get > > > > > > > > > > > > back the > > > > > > > > > > > > > > > > > > > > > > > > > > > > current count? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Yes, for example, > what if > > > we > > > > > > need > > > > > > > > to > > > > > > > > > > > > retrieve the (all > > > > > > > > > > > > > > > > > > > > > > > > > > > > or range) keys > > > > > > > > > > > > > > > > > > > > > > > > > > > with > > > > > > > > > > > > > > > > > > > > > > > > > > > > a closed window? In > this > > > > > > example, > > > > > > > > let's > > > > > > > > > > > > imagine we > > > > > > > > > > > > > > > > > > need > > > > > > > > > > > > > > > > > > > > > > > > > > > > to retrieve only > (key=A, > > > > > > > > window=10), > > > > > > > > > > not > > > > > > > > > > > > (key=A, > > > > > > > > > > > > > > > > > > > > > > > > > > > > window=20). > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Of course, the value > > > > > > accompanied > > > > > > > > by a > > > > > > > > > > > > flushed key is > > > > > > > > > > > > > > > > > > > > > > > > > > > > exactly the same to > the > > > one > > > > > > in the > > > > > > > > > > > > upstream KTable; > > > > > > > > > > > > > > > > > > > > > > > > > > > > However, if our > intention > > > is > > > > > > not > > > > > > > > > > pointing > > > > > > > > > > > > out a > > > > > > > > > > > > > > > > > > > > > > > > > > > > specific key but > > > retrieving a > > > > > > > > group of > > > > > > > > > > > > unspecified > > > > > > > > > > > > > > > > > > > > > > > > > > > > keys, we stuck > > > > > > > > > > > > > > > > > > > > > > > > > > > in > > > > > > > > > > > > > > > > > > > > > > > > > > > > trouble - since we > can't > > > be > > > > > > sure > > > > > > > > which > > > > > > > > > > key > > > > > > > > > > > > is flushed > > > > > > > > > > > > > > > > > > > > > > > > > > > > out beforehand. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > One workaround would > be > > > > > > > > materializing > > > > > > > > > > it > > > > > > > > > > > > with > > > > > > > > > > > > > > > > > > > > > > > > > > > > `suppressed.filter(e > -> > > > > > > > > > > > > > > > > > > > > > > > > > > > true, > > > > > > Materialized.as("final-count"))`. > > > > > > > > But I > > > > > > > > > > > > think > > > > > > > > > > > > > > > > > > providing > > > > > > > > > > > > > > > > > > > > > > > > > > > > a materialized > variant for > > > > > > suppress > > > > > > > > > > method > > > > > > > > > > > > is better > > > > > > > > > > > > > > > > > > > > > > > > > > > > than this workaround. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks, Dongjin > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Thu, Feb 20, 2020 > at > > > 1:26 > > > > > > AM > > > > > > > > John > > > > > > > > > > > > Roesler > > > > > > > > > > > > > > > > > > > > > > > > > > > > <vvcep...@apache.org > > > > > > > > > > > > > > > > > > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks for the > response, > > > > > > Dongjin, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I'm sorry, but I'm > > > still not > > > > > > > > > > following. > > > > > > > > > > > > It seems > > > > > > > > > > > > > > > > > > like > > > > > > > > > > > > > > > > > > > > > > > > > > > > > the view you > > > > > > > > > > > > > > > > > > > > > > > > > > > would > > > > > > > > > > > > > > > > > > > > > > > > > > > > > get on the "current > > > state > > > > > > of the > > > > > > > > > > buffer" > > > > > > > > > > > > would > > > > > > > > > > > > > > > > > > always > > > > > > > > > > > > > > > > > > > > > > > > > > > > > be equivalent to > the > > > view > > > > > > of the > > > > > > > > > > > > upstream table. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Let me try an > example, > > > and > > > > > > maybe > > > > > > > > you > > > > > > > > > > can > > > > > > > > > > > > point out > > > > > > > > > > > > > > > > > > > > > > > > > > > > > the flaw in my > > > reasoning. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Let's say we're > doing > > > 10 ms > > > > > > > > windows > > > > > > > > > > with > > > > > > > > > > > > a grace > > > > > > > > > > > > > > > > > > > > > > > > > > > > > period of zero. > Let's > > > also > > > > > > say > > > > > > > > we're > > > > > > > > > > > > computing a > > > > > > > > > > > > > > > > > > > > > > > > > > > > > windowed count, and > > > that we > > > > > > have > > > > > > > > a > > > > > > > > > > > > "final results" > > > > > > > > > > > > > > > > > > > > > > > > > > > > > suppression after > the > > > count. > > > > > > > > Let's > > > > > > > > > > > > materialize the > > > > > > > > > > > > > > > > > > > > > > > > > > > > > count as "Count" > and the > > > > > > > > suppressed > > > > > > > > > > > > result as "Final > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Count". > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Suppose we get an > input > > > > > > event: > > > > > > > > > > (time=10, > > > > > > > > > > > > key=A, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > value=...) > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Then, Count will > look > > > like: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > window | key | > value > > > > > > 10 > > > > > > > > | A > > > > > > > > > > > > | 1 | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > The (internal) > > > suppression > > > > > > buffer > > > > > > > > > > will > > > > > > > > > > > > contain: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > window | key | > value > > > > > > 10 > > > > > > > > | A > > > > > > > > > > > > | 1 | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > The record is still > > > buffered > > > > > > > > because > > > > > > > > > > the > > > > > > > > > > > > window > > > > > > > > > > > > > > > > > > > > > > > > > > > > > isn't closed yet. > Final > > > > > > Count is > > > > > > > > an > > > > > > > > > > > > empty table: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > window | key | > value | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --------------- > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Now, we get a > second > > > event: > > > > > > > > (time=15, > > > > > > > > > > > > key=A, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > value=...) > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Then, Count will > look > > > like: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > window | key | > value > > > > > > 10 > > > > > > > > | A > > > > > > > > > > > > | 2 | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > The (internal) > > > suppression > > > > > > buffer > > > > > > > > > > will > > > > > > > > > > > > contain: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > window | key | > value > > > > > > 10 > > > > > > > > | A > > > > > > > > > > > > | 2 | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > The record is still > > > buffered > > > > > > > > because > > > > > > > > > > the > > > > > > > > > > > > window > > > > > > > > > > > > > > > > > > > > > > > > > > > > > isn't closed yet. > Final > > > > > > Count is > > > > > > > > an > > > > > > > > > > > > empty table: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > window | key | > value | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --------------- > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Finally, we get a > third > > > > > > event: > > > > > > > > > > (time=20, > > > > > > > > > > > > key=A, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > value=...) > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Then, Count will > look > > > like: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > window | key | > value > > > > > > 10 > > > > > > > > | A > > > > > > > > > > > > | 2 | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 20 | A | 1 | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > The (internal) > > > suppression > > > > > > buffer > > > > > > > > > > will > > > > > > > > > > > > contain: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > window | key | > value > > > > > > 20 > > > > > > > > | A > > > > > > > > > > > > | 1 | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Note that window > 10 has > > > been > > > > > > > > flushed > > > > > > > > > > > > out, because > > > > > > > > > > > > > > > > > > > > > > > > > > > > > it's now closed. > And > > > window > > > > > > 20 is > > > > > > > > > > > > buffered because > > > > > > > > > > > > > > > > > > it > > > > > > > > > > > > > > > > > > > > > > > > > > > > > isn't closed yet. > Final > > > > > > Count is > > > > > > > > now: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > window | key | > value > > > > > > 10 > > > > > > > > | A > > > > > > > > > > > > | 2 | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --------------- > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Reading your > email, I > > > can't > > > > > > > > figure > > > > > > > > > > out > > > > > > > > > > > > what value > > > > > > > > > > > > > > > > > > > > > > > > > > > > > there is in > querying > > > > > > > > > > > > > > > > > > > > > > > > > > > the > > > > > > > > > > > > > > > > > > > > > > > > > > > > > internal > suppression > > > buffer, > > > > > > > > since it > > > > > > > > > > > > only contains > > > > > > > > > > > > > > > > > > > > > > > > > > > > > exactly the same > > > > > > > > > > > > > > > > > > > > > > > > > > > value > > > > > > > > > > > > > > > > > > > > > > > > > > > > > as the upstream > table, > > > for > > > > > > each > > > > > > > > key > > > > > > > > > > that > > > > > > > > > > > > is still > > > > > > > > > > > > > > > > > > > > > > > > > > > > > buffered. But it > feels > > > > > > > > > > > > > > > > > > > > > > > > > > > like > > > > > > > > > > > > > > > > > > > > > > > > > > > > > you're saying > you're > > > trying > > > > > > to do > > > > > > > > > > > > something > > > > > > > > > > > > > > > > > > different > > > > > > > > > > > > > > > > > > > > > > > > > > > > > than just query > > > > > > > > > > > > > > > > > > > > > > > > > > > the > > > > > > > > > > > > > > > > > > > > > > > > > > > > > windowed key and > get > > > back > > > > > > the > > > > > > > > current > > > > > > > > > > > > count? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks, -John > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Wed, Feb 19, > 2020, at > > > > > > 09:49, > > > > > > > > > > Dongjin > > > > > > > > > > > > Lee wrote: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Hi John, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 'The intermediate > > > state > > > > > > of the > > > > > > > > > > > > suppression' in KIP > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > does not mean the > > > > > > > > > > > > > > > > > > > > > > > > > > > > > state > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > of upstream > KTable - > > > > > > sure, the > > > > > > > > > > state > > > > > > > > > > > > of the > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > upstream KTable > can be > > > > > > > > > > > > > > > > > > > > > > > > > > > > > queried > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > by materializing > the > > > > > > operator > > > > > > > > > > > > immediately before > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > the suppress as > you > > > > > > > > > > > > > > > > > > > > > > > > > > > > > shown. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > What I meant in > KIP > > > was > > > > > > the > > > > > > > > final > > > > > > > > > > > > state of the > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > buffer, which is > not > > > > > > > > > > > > > > > > > > > > > > > > > > > > > emitted > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > yet. (I agree, > the > > > current > > > > > > > > > > description > > > > > > > > > > > > may be > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > confusing; it > would be > > > > > > > > > > > > > > > > > > > > > > > > > > > > > better > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > to change it > with 'the > > > > > > current > > > > > > > > > > state > > > > > > > > > > > > of the > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > suppression' or > 'the > > > > > > > > > > > > > > > > > > > > > > > > > > > results > > > > > > > > > > > > > > > > > > > > > > > > > > > > > of > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > the > suppression', like > > > > > > the Jira > > > > > > > > > > issue > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > > > https://issues.apache.org/jira/browse/KAFKA-8403 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > states.) > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > For a little bit > more > > > > > > about the > > > > > > > > > > > > motivation, here > > > > > > > > > > > > > > > > > > is > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > one of my > > > > > > > > > > > > > > > > > > > > > > > > > > > > > experience: I > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > had to build a > > > monitoring > > > > > > > > > > application > > > > > > > > > > > > which > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > collects signals > from > > > IoT > > > > > > > > devices > > > > > > > > > > > > (say, a > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > semiconductor > > > production > > > > > > > > line.) If > > > > > > > > > > the > > > > > > > > > > > > number of > > > > > > > > > > > > > > > > > > > > > > > > > > > > > collected > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > signals within > the > > > time > > > > > > window > > > > > > > > is > > > > > > > > > > much > > > > > > > > > > > > less than > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > the expected, > there > > > > > > > > > > > > > > > > > > > > > > > > > > > may > > > > > > > > > > > > > > > > > > > > > > > > > > > > > be > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > some problems > like > > > network > > > > > > > > hiccup > > > > > > > > > > in > > > > > > > > > > > > the systems. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > We wanted to > build > > > > > > > > > > > > > > > > > > > > > > > > > > > the > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > system in the > form of > > > a > > > > > > > > dashboard, > > > > > > > > > > but > > > > > > > > > > > > could not > > > > > > > > > > > > > > > > > > by > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > lack of > > > > > > > > > > > > > > > > > > > > > > > > > > > materializing > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > feature. It was > > > precisely > > > > > > the > > > > > > > > case > > > > > > > > > > of > > > > > > > > > > > > querying > > > > > > > > > > > > > > > > > > only > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > the final > > > > > > > > > > > > > > > > > > > > > > > > > > > results of > > > > > > > > > > > > > > > > > > > > > > > > > > > > > a > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > windowed > aggregation, > > > as > > > > > > the > > > > > > > > Jira > > > > > > > > > > issue > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > > > https://issues.apache.org/jira/browse/KAFKA-8403 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > states. We > > > > > > > > > > > > > > > > > > > > > > > > > > > finally > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ended > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > in implementing > the > > > > > > system in > > > > > > > > an > > > > > > > > > > email > > > > > > > > > > > > alerting > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > system like this > < > > > > > > > https://www.confluent.io/blog/kafka-streams-take-on-watermarks-an > > > > > > > > > > > > > > > d-t > > > > > > > > > > > > > > > riggers/ > > > > > > > > > > > > > > > > > > > > > > and had to collect the keys and > > > windows of > > > > > > > > trouble > > > > > > > > > > by > > > > > > > > > > > > hand. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I think these > kinds > > > of use > > > > > > > > cases > > > > > > > > > > would > > > > > > > > > > > > be much > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > common. Should > it be > > > > > > described > > > > > > > > in > > > > > > > > > > the > > > > > > > > > > > > KIP much > > > > > > > > > > > > > > > > > > more > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > in detail? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks, Dongjin > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Sat, Feb 15, > 2020 > > > at > > > > > > 4:43 AM > > > > > > > > > > John > > > > > > > > > > > > Roesler > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > vvcep...@apache.org> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Hi Dongjin, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks for the > KIP! > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Can you > explain more > > > > > > about > > > > > > > > why > > > > > > > > > > the > > > > > > > > > > > > internal data > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > structures of > > > > > > > > > > > > > > > > > > > > > > > > > > > > > suppression > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > should be > > > queriable? The > > > > > > > > > > motivation > > > > > > > > > > > > just says > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > that users > might > > > > > > > > > > > > > > > > > > > > > > > > > > > want to > > > > > > > > > > > > > > > > > > > > > > > > > > > > > do > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > it, which seems > > > like it > > > > > > could > > > > > > > > > > > > justify literally > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > anything :) > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > One design > point of > > > > > > > > Suppression > > > > > > > > > > is > > > > > > > > > > > > that if you > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > wanted to > query the > > > > > > > > > > > > > > > > > > > > > > > > > > > > > “final > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > state”, you can > > > > > > Materialize > > > > > > > > the > > > > > > > > > > > > suppress itself > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > (which is why > it > > > > > > > > > > > > > > > > > > > > > > > > > > > needs > > > > > > > > > > > > > > > > > > > > > > > > > > > > > the > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > variant); if > you > > > wanted > > > > > > to > > > > > > > > query > > > > > > > > > > the > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > “intermediate > > > state”, > > > > > > you can > > > > > > > > > > > > materialize the > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > operator > immediately > > > > > > before > > > > > > > > the > > > > > > > > > > > > suppress. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Example: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ...count(Materialized.as(“intermediate”)) > > > > > > .supress(untilWindowClosed(), > > > > > > Materialized.as(“final”)) > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I’m not sure > what > > > use > > > > > > case > > > > > > > > would > > > > > > > > > > > > require > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > actually > fetching > > > from > > > > > > the > > > > > > > > > > internal > > > > > > > > > > > > buffers. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks, John > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Fri, Feb 14, > > > 2020, at > > > > > > > > 07:55, > > > > > > > > > > > > Dongjin Lee > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Hi devs, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I'd like to > > > reboot the > > > > > > > > > > discussion > > > > > > > > > > > > on KIP-508, > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > which aims to > > > > > > > > > > > > > > > > > > > > > > > > > > > support a > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Materialized > > > variant > > > > > > of > > > > > > > > > > > > KTable#suppress. It > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > was initially > > > > > > > > > > > > > > > > > > > > > > > > > > > submitted > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > several > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > months ago > but > > > closed > > > > > > by > > > > > > > > the > > > > > > > > > > > > inactivity. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > - KIP: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-508%3A+Make > > > > > > > > > > > > > > > +Su > > > > > > > > > > > > > > > ppression+State+Queriable > > > > > > > > > > > > > > > > > > > > > > - Jira: > > > > > > > > > > > > https://issues.apache.org/jira/browse/KAFKA-8403 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > All kinds of > > > feedback > > > > > > will > > > > > > > > be > > > > > > > > > > > > greatly > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > appreciated. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Best, Dongjin > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- *Dongjin > Lee* > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > *A > hitchhiker in > > > the > > > > > > > > > > mathematical > > > > > > > > > > > > world.* > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > *github: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > http://goog_969573159/> > > > > > > > > > > > > > > > > > > github.com/dongjinleekr > > > > > > > > > > > > > > > <https://github.com/dongjinleekr>linkedin: > > > > > > > > kr.linkedin.com/in/dongjinleekr > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > > > https://kr.linkedin.com/in/dongjinleekr > > > > > > > > > > > > > > > > > > > speakerdeck: > > > > > > > > > > > > > > > speakerdeck.com/dongjin > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > https://speakerdeck.com/dongjin>* > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- *Dongjin Lee* > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > *A hitchhiker in > the > > > > > > > > mathematical > > > > > > > > > > > > world.* *github: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > http://goog_969573159/> > > > > > > > > > > > > github.com/dongjinleekr > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > https://github.com/dongjinleekr > > > > > > > > > > > > > linkedin: > > > > > > kr.linkedin.com/in/dongjinleekr > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > > > https://kr.linkedin.com/in/dongjinleekr > > > > > > > > > > > > > > > > > > > speakerdeck: > > > > > > > > > > > > > > > speakerdeck.com/dongjin > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > https://speakerdeck.com/dongjin>* > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- *Dongjin Lee* > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > *A hitchhiker in the > > > > > > mathematical > > > > > > > > > > world.* > > > > > > > > > > > > *github: > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > http://goog_969573159/> > > > > > > > > > > > > github.com/dongjinleekr > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > https://github.com/dongjinleekr > > > > > > > > > > > linkedin: > > > kr.linkedin.com/in/dongjinleekr > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > https://kr.linkedin.com/in/dongjinleekr > > > > > > > > > > > > > speakerdeck: > > > > > > > > > > > > > > > > > > > > > > > > > > > > speakerdeck.com/dongjin > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > https://speakerdeck.com/dongjin>* > > > > > > > > > > > > > > > > > > > > > > > > > > -- *Dongjin Lee* > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > *A hitchhiker in the > > > mathematical > > > > > > > > world.* > > > > > > > > > > > > *github: > > > > > > > > > > > > > > > > > > > > > > > > > > <http://goog_969573159/> > > > > > > > > > > > > github.com/dongjinleekr > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > https://github.com/dongjinleekr > > > > > > > > > linkedin: > > > kr.linkedin.com/in/dongjinleekr > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > https://kr.linkedin.com/in/dongjinleekr > > > > > > > > > > > > > speakerdeck: > > > > > > > > > > > > > > > > > > > > > > > > > > speakerdeck.com/dongjin > < > > > > > > > > > > > > https://speakerdeck.com/dongjin > > > > > > > > > > > > > > > > > > > * > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > > > > > > > > > > *Dongjin Lee* > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > *A hitchhiker in the mathematical world.* > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > *github: <http://goog_969573159/> > > > > > > github.com/dongjinleekr > > > > > > > > > > > > > > > > <https://github.com/dongjinleekr>keybase: > > > > > > > > > > > > > > https://keybase.io/dongjinleekr > > > > > > > > > > > > > > > > <https://keybase.io/dongjinleekr>linkedin: > > > > > > > > > > > > > > kr.linkedin.com/in/dongjinleekr > > > > > > > > > > > > > > > > <https://kr.linkedin.com/in/dongjinleekr > > > > speakerdeck: > > > > > > > > > > > > > > speakerdeck.com/dongjin > > > > > > > > > > > > > > > > <https://speakerdeck.com/dongjin>* > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > > > *Dongjin Lee* > > > > > > > > > > > > > > > > > > *A hitchhiker in the mathematical world.* > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > *github: <http://goog_969573159/>github.com/dongjinleekr > > > > > > > > > <https://github.com/dongjinleekr>keybase: > > > > > > > > https://keybase.io/dongjinleekr > > > > > > > > > <https://keybase.io/dongjinleekr>linkedin: > > > > > > > > kr.linkedin.com/in/dongjinleekr > > > > > > > > > <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: > > > > > > > > speakerdeck.com/dongjin > > > > > > > > > <https://speakerdeck.com/dongjin>* > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > *Dongjin Lee* > > > > > > > > > > > > > > *A hitchhiker in the mathematical world.* > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > *github: <http://goog_969573159/>github.com/dongjinleekr > > > > > > > <https://github.com/dongjinleekr>keybase: > > > > > > https://keybase.io/dongjinleekr > > > > > > > <https://keybase.io/dongjinleekr>linkedin: > > > > > > kr.linkedin.com/in/dongjinleekr > > > > > > > <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: > > > > > > speakerdeck.com/dongjin > > > > > > > <https://speakerdeck.com/dongjin>* > > > > > > > > > > > > > > > > > -- > > > > > *Dongjin Lee* > > > > > > > > > > *A hitchhiker in the mathematical world.* > > > > > > > > > > > > > > > > > > > > > > > > > *github: <http://goog_969573159/>github.com/dongjinleekr > > > > > <https://github.com/dongjinleekr>keybase: > > > https://keybase.io/dongjinleekr > > > > > <https://keybase.io/dongjinleekr>linkedin: > > > kr.linkedin.com/in/dongjinleekr > > > > > <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: > > > speakerdeck.com/dongjin > > > > > <https://speakerdeck.com/dongjin>* > > > > > > > > > > > > > -- > > > > *Dongjin Lee* > > > > > > > > *A hitchhiker in the mathematical world.* > > > > > > > > > > > > > > > > > > > > *github: <http://goog_969573159/>github.com/dongjinleekr > > > > <https://github.com/dongjinleekr>keybase: > > > https://keybase.io/dongjinleekr > > > > <https://keybase.io/dongjinleekr>linkedin: > > > kr.linkedin.com/in/dongjinleekr > > > > <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: > > > speakerdeck.com/dongjin > > > > <https://speakerdeck.com/dongjin>* > > > > > > > > > > -- *Dongjin Lee* *A hitchhiker in the mathematical world.* *github: <http://goog_969573159/>github.com/dongjinleekr <https://github.com/dongjinleekr>keybase: https://keybase.io/dongjinleekr <https://keybase.io/dongjinleekr>linkedin: kr.linkedin.com/in/dongjinleekr <https://kr.linkedin.com/in/dongjinleekr>speakerdeck: speakerdeck.com/dongjin <https://speakerdeck.com/dongjin>*