Hi, Mattias, Just completed the modification of KIP, please take a look when you are available.
--- Vito On Wed, Jul 3, 2019 at 9:07 PM Vito Jeng <v...@is-land.com.tw> wrote: > Hi, Matthias, > > This is second part. > > > For the internal exceptions: > > > > `StateStoreClosedException` -- why can it be wrapped as > > `StreamThreadNotStartedException` ? It seems that the later would only > > be thrown by `KafkaStreams#store()` and thus would be throw directly. > > Both `StateStoreClosedException` and `EmptyStateStoreException` not can be > wrapped as `StreamThreadNotStartedException`. > This is a mistaken written in the previous KIP. Thank you point this. > > > A closed-exception should only happen after a store was successfully > > retrieved but cannot be queried any longer? Hence, converting/wrapping > > it into a `StateStoreMigratedException` make sense. I am also not sure, > > when a closed-exception would be wrapped by a > > `StateStoreNotAvailableException` (implying my understanding as describe > > above)? > > > > Same questions about `EmptyStateStoreException`. > > > > Thinking about both internal exceptions twice, I am wondering if it > > makes sense to have both internal exceptions at all? I have the > > impression that it make only sense to wrap them with a > > `StateStoreMigragedException`, but if they are wrapped into the same > > exception all the time, we can just remove both and throw > > `StateStoreMigratedException` directly? > > After deeper thinking, I think you are right. It seems we can throw > `StateStoreMigratedException` directly. > So that we can remove `StateStoreClosedException`, > `EmptyStateStoreException` and `StateStoreNotAvailableException`. > Will update the KIP. > > BTW, if we remove above three exceptions, the > `StreamThreadNotRunningException` will be the only one sub class extends > from FatalStateStoreException. > Should we remove `StreamThreadNotRunningException` and throw > `FatalStateStoreException` directly ? > > > Last point: Why do we need to add? > > QueryableStoreType#setStreams(KafkaStreams streams); > > John asked this question already and you replied to it. But I am not > > sure what your answer means. Can you explain it in more detail? > > The main purpose is to pass the KafkaStreams reference into > CompositeReadOnlyKeyValueStore / CompositeReadOnlySessionStore/ > CompositeReadOnlyWindowStore instance. > We need check KafkaStreams state to warp InvalidStateStoreException in to > other exception(e.g., StateStoreMigratedException) when the user accesses > these read-only stores. > > The original thought is to add `setStreams` method in to > QueryableStoreType. But now I think I find a better way during recent days. > This way does not need to change any public interface. So we can skip this > question. :) > > > I will update the KIP based on our discussion. > Thank you for help to finish the KIP! > > --- > Vito > > > On Thu, Jun 6, 2019 at 8:23 AM Matthias J. Sax <matth...@confluent.io> > wrote: > >> Hi Vito, >> >> sorry for dropping this discussion on the floor a while back. I was just >> re-reading the KIP and discussion thread, and I think it is shaping out >> nicely! >> >> I like the overall hierarchy of the exception classes. >> >> Some things are still not 100% clear: >> >> >> You listed all methods that may throw an `InvalidStateStoreException` >> atm. For the new exceptions, can any exception be thrown by any method? >> It might help to understand this relationship better. >> >> For example, StreamThreadNotStartedException, seems to only make sense >> for `KafkaStreams#store()`? >> >> >> For `StreamThreadNotRunningException` should we rename it to >> `KafkaStreamsNotRunningException` ? >> >> >> The description of `StreamThreadNotRunningException` and >> `StateStoreNotAvailableException` seems to be the same? From my >> understandng, the description makes sense for >> `StreamThreadNotRunningException` -- for >> `StateStoreNotAvailableException` I was expecting/inferring from the >> name, that it would be thrown if no such store exists in the topology at >> all (ie, user passed in a invalid/wrong store name). For this case, this >> exception should be thrown only from `KafkaStreams#store()` ? >> >> >> For the internal exceptions: >> >> `StateStoreClosedException` -- why can it be wrapped as >> `StreamThreadNotStartedException` ? It seems that the later would only >> be thrown by `KafkaStreams#store()` and thus would be throw directly. A >> closed-exception should only happen after a store was successfully >> retrieved but cannot be queried any longer? Hence, converting/wrapping >> it into a `StateStoreMigratedException` make sense. I am also not sure, >> when a closed-exception would be wrapped by a >> `StateStoreNotAvailableException` (implying my understanding as describe >> above)? >> >> Same questions about `EmptyStateStoreException`. >> >> Thinking about both internal exceptions twice, I am wondering if it >> makes sense to have both internal exceptions at all? I have the >> impression that it make only sense to wrap them with a >> `StateStoreMigragedException`, but if they are wrapped into the same >> exception all the time, we can just remove both and throw >> `StateStoreMigratedException` directly? >> >> >> Last point: Why do we need to add? >> >> > QueryableStoreType#setStreams(KafkaStreams streams); >> >> John asked this question already and you replied to it. But I am not >> sure what your answer means. Can you explain it in more detail? >> >> >> >> Thanks for your patience on this KIP! >> >> >> >> -Matthias >> >> >> >> >> >> >> On 11/11/18 4:55 AM, Vito Jeng wrote: >> > Hi, Matthias, >> > >> > KIP already updated. >> > >> >> - StateStoreClosedException: >> >> will be wrapped to StateStoreMigratedException or >> > StateStoreNotAvailableException later. >> >> Can you clarify the cases (ie, when will it be wrapped with the one or >> > the other)? >> > >> > For example, in the implementation(CompositeReadOnlyKeyValueStore#get), >> we >> > get all stores first, and then call ReadOnlyKeyValueStore#get to get >> value >> > in every store iteration. >> > >> > When calling ReadOnlyKeyValueStore#get, the StateStoreClosedException >> will >> > be thrown if the state store is not open. >> > We need catch StateStoreClosedException and wrap it in different >> exception >> > type: >> > * If the stream's state is CREATED, we wrap StateStoreClosedException >> > with StreamThreadNotStartedException. User can retry until to RUNNING. >> > * If the stream's state is RUNNING / REBALANCING, the state store >> should >> > be migrated, we wrap StateStoreClosedException with >> > StateStoreMigratedException. User can rediscover the state store. >> > * If the stream's state is PENDING_SHUTDOWN / NOT_RUNNING / ERROR, the >> > stream thread is not available, we wrap StateStoreClosedException with >> > StateStoreNotAvailableException. User cannot retry when this exception >> is >> > thrown. >> > >> > >> >> - StateStoreIsEmptyException: >> >> I don't understand the semantic of this exception. Maybe it's a naming >> > issue? >> > >> > I think yes. :) >> > Does `EmptyStateStoreException` is better ? (already updated in the KIP) >> > >> > >> >> - StateStoreIsEmptyException: >> >> will be wrapped to StateStoreMigratedException or >> > StateStoreNotAvailableException later. >> >> Also, can you clarify the cases (ie, when will it be wrapped with the >> one >> > or the other)? >> > >> > For example, in the implementation >> (CompositeReadOnlyKeyValueStore#get), we >> > call StateStoreProvider#stores (WrappingStoreProvider#stores) to get all >> > stores. EmptyStateStoreException will be thrown when cannot find any >> store >> > and then we need catch it and wrap it in different exception type: >> > * If the stream's state is CREATED, we wrap EmptyStateStoreException >> with >> > StreamThreadNotStartedException. User can retry until to RUNNING. >> > * If the stream's state is RUNNING / REBALANCING, the state store >> should >> > be migrated, we wrap EmptyStateStoreException with >> > StateStoreMigratedException. User can rediscover the state store. >> > * If the stream's state is PENDING_SHUTDOWN / NOT_RUNNING / ERROR, the >> > stream thread is not available, we wrap EmptyStateStoreException with >> > StateStoreNotAvailableException. User cannot retry when this exception >> is >> > thrown. >> > >> > I hope the above reply can clarify. >> > >> > The last one that was not replied was: >> > >> >> I am also wondering, if we should introduce a fatal exception >> >> `UnkownStateStoreException` to tell users that they passed in an >> unknown >> >> store name? >> > >> > Until now, unknown state store is not thinking about in the KIP. >> > I believe it would be very useful for users. >> > >> > Looking at the related code(WrappingStoreProvider#stores), >> > I found that I can't distinguish between the state store was migrated >> or an >> > unknown state store. >> > >> > Any thoughts? >> > >> > --- >> > Vito >> > >> > >> > >> > On Sun, Nov 11, 2018 at 5:31 PM Vito Jeng <v...@is-land.com.tw> wrote: >> > >> >> Hi, Matthias, >> >> >> >> Sorry for the late reply. >> >> >> >>> I am wondering what the semantic impact/change is, if we introduce >> >>> `RetryableStateStoreException` and `FatalStateStoreException` that >> both >> >>> inherit from it. While I like the introduction of both from a high >> level >> >>> point of view, I just want to make sure it's semantically sound and >> >>> backward compatible. Atm, I think it's fine, but I want to point it >> out >> >>> such that everybody can think about this, too, so we can verify that >> >>> it's a natural evolving API change. >> >> >> >> Thank you for pointing this out. This's really important for public >> API. >> >> >> >> Just when I was replying to you, I found that KIP needs some modify. >> >> I will fix it ASAP, and then let's continue the discussion. >> >> >> >> --- >> >> Vito >> >> >> >> >> >> On Wed, Nov 7, 2018 at 7:06 AM Matthias J. Sax <matth...@confluent.io> >> >> wrote: >> >> >> >>> Hey Vito, >> >>> >> >>> I saw that you updated your PR, but did not reply to my last comments. >> >>> Any thoughts? >> >>> >> >>> >> >>> -Matthias >> >>> >> >>> On 10/19/18 10:34 AM, Matthias J. Sax wrote: >> >>>> Glad to have you back Vito :) >> >>>> >> >>>> Some follow up thoughts: >> >>>> >> >>>> - the current `InvalidStateStoreException` is documents as being >> >>>> sometimes retry-able. From the JavaDocs: >> >>>> >> >>>>> These exceptions may be transient [...] Hence, it is valid to >> backoff >> >>> and retry when handling this exception. >> >>>> >> >>>> I am wondering what the semantic impact/change is, if we introduce >> >>>> `RetryableStateStoreException` and `FatalStateStoreException` that >> both >> >>>> inherit from it. While I like the introduction of both from a high >> level >> >>>> point of view, I just want to make sure it's semantically sound and >> >>>> backward compatible. Atm, I think it's fine, but I want to point it >> out >> >>>> such that everybody can think about this, too, so we can verify that >> >>>> it's a natural evolving API change. >> >>>> >> >>>> - StateStoreClosedException: >> >>>> >> >>>>> will be wrapped to StateStoreMigratedException or >> >>> StateStoreNotAvailableException later. >> >>>> >> >>>> Can you clarify the cases (ie, when will it be wrapped with the one >> or >> >>>> the other)? >> >>>> >> >>>> - StateStoreIsEmptyException: >> >>>> >> >>>> I don't understand the semantic of this exception. Maybe it's a >> naming >> >>>> issue? >> >>>> >> >>>>> will be wrapped to StateStoreMigratedException or >> >>> StateStoreNotAvailableException later. >> >>>> >> >>>> Also, can you clarify the cases (ie, when will it be wrapped with the >> >>>> one or the other)? >> >>>> >> >>>> >> >>>> I am also wondering, if we should introduce a fatal exception >> >>>> `UnkownStateStoreException` to tell users that they passed in an >> unknown >> >>>> store name? >> >>>> >> >>>> >> >>>> >> >>>> -Matthias >> >>>> >> >>>> >> >>>> >> >>>> On 10/17/18 8:14 PM, vito jeng wrote: >> >>>>> Just open a PR for further discussion: >> >>>>> https://github.com/apache/kafka/pull/5814 >> >>>>> >> >>>>> Any suggestion is welcome. >> >>>>> Thanks! >> >>>>> >> >>>>> --- >> >>>>> Vito >> >>>>> >> >>>>> >> >>>>> On Thu, Oct 11, 2018 at 12:14 AM vito jeng <v...@is-land.com.tw> >> >>> wrote: >> >>>>> >> >>>>>> Hi John, >> >>>>>> >> >>>>>> Thanks for reviewing the KIP. >> >>>>>> >> >>>>>>> I didn't follow the addition of a new method to the >> >>> QueryableStoreType >> >>>>>>> interface. Can you elaborate why this is necessary to support the >> new >> >>>>>>> exception types? >> >>>>>> >> >>>>>> To support the new exception types, I would check stream state in >> the >> >>>>>> following classes: >> >>>>>> - CompositeReadOnlyKeyValueStore class >> >>>>>> - CompositeReadOnlySessionStore class >> >>>>>> - CompositeReadOnlyWindowStore class >> >>>>>> - DelegatingPeekingKeyValueIterator class >> >>>>>> >> >>>>>> It is also necessary to keep backward compatibility. So I plan >> passing >> >>>>>> stream >> >>>>>> instance to QueryableStoreType instance during KafkaStreams#store() >> >>>>>> invoked. >> >>>>>> It looks a most simple way, I think. >> >>>>>> >> >>>>>> It is why I add a new method to the QueryableStoreType interface. I >> >>> can >> >>>>>> understand >> >>>>>> that we should try to avoid adding the public api method. However, >> at >> >>> the >> >>>>>> moment >> >>>>>> I have no better ideas. >> >>>>>> >> >>>>>> Any thoughts? >> >>>>>> >> >>>>>> >> >>>>>>> Also, looking over your KIP again, it seems valuable to introduce >> >>>>>>> "retriable store exception" and "fatal store exception" marker >> >>> interfaces >> >>>>>>> that the various exceptions can mix in. It would be nice from a >> >>> usability >> >>>>>>> perspective to be able to just log and retry on any "retriable" >> >>> exception >> >>>>>>> and log and shutdown on any fatal exception. >> >>>>>> >> >>>>>> I agree that this is valuable to the user. >> >>>>>> I'll update the KIP. >> >>>>>> >> >>>>>> >> >>>>>> Thanks >> >>>>>> >> >>>>>> >> >>>>>> --- >> >>>>>> Vito >> >>>>>> >> >>>>>> >> >>>>>> On Tue, Oct 9, 2018 at 2:30 AM John Roesler <j...@confluent.io> >> >>> wrote: >> >>>>>> >> >>>>>>> Hi Vito, >> >>>>>>> >> >>>>>>> I'm glad to hear you're well again! >> >>>>>>> >> >>>>>>> I didn't follow the addition of a new method to the >> >>> QueryableStoreType >> >>>>>>> interface. Can you elaborate why this is necessary to support the >> new >> >>>>>>> exception types? >> >>>>>>> >> >>>>>>> Also, looking over your KIP again, it seems valuable to introduce >> >>>>>>> "retriable store exception" and "fatal store exception" marker >> >>> interfaces >> >>>>>>> that the various exceptions can mix in. It would be nice from a >> >>> usability >> >>>>>>> perspective to be able to just log and retry on any "retriable" >> >>> exception >> >>>>>>> and log and shutdown on any fatal exception. >> >>>>>>> >> >>>>>>> Thanks, >> >>>>>>> -John >> >>>>>>> >> >>>>>>> On Fri, Oct 5, 2018 at 11:47 AM Guozhang Wang <wangg...@gmail.com >> > >> >>> wrote: >> >>>>>>> >> >>>>>>>> Thanks for the explanation, that makes sense. >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> Guozhang >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> On Mon, Jun 25, 2018 at 2:28 PM, Matthias J. Sax < >> >>> matth...@confluent.io >> >>>>>>>> >> >>>>>>>> wrote: >> >>>>>>>> >> >>>>>>>>> The scenario I had I mind was, that KS is started in one thread >> >>> while >> >>>>>>> a >> >>>>>>>>> second thread has a reference to the object to issue queries. >> >>>>>>>>> >> >>>>>>>>> If a query is issue before the "main thread" started KS, and the >> >>>>>>> "query >> >>>>>>>>> thread" knows that it will eventually get started, it can >> retry. On >> >>>>>>> the >> >>>>>>>>> other hand, if KS is in state PENDING_SHUTDOWN or DEAD, it is >> >>>>>>> impossible >> >>>>>>>>> to issue any query against it now or in the future and thus the >> >>> error >> >>>>>>> is >> >>>>>>>>> not retryable. >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> -Matthias >> >>>>>>>>> >> >>>>>>>>> On 6/25/18 10:15 AM, Guozhang Wang wrote: >> >>>>>>>>>> I'm wondering if StreamThreadNotStarted could be merged into >> >>>>>>>>>> StreamThreadNotRunning, because I think users' handling logic >> for >> >>>>>>> the >> >>>>>>>>> third >> >>>>>>>>>> case would be likely the same as the second. Do you have some >> >>>>>>> scenarios >> >>>>>>>>>> where users may want to handle them differently? >> >>>>>>>>>> >> >>>>>>>>>> Guozhang >> >>>>>>>>>> >> >>>>>>>>>> On Sun, Jun 24, 2018 at 5:25 PM, Matthias J. Sax < >> >>>>>>>> matth...@confluent.io> >> >>>>>>>>>> wrote: >> >>>>>>>>>> >> >>>>>>>>>>> Sorry to hear! Get well soon! >> >>>>>>>>>>> >> >>>>>>>>>>> It's not a big deal if the KIP stalls a little bit. Feel free >> to >> >>>>>>> pick >> >>>>>>>> it >> >>>>>>>>>>> up again when you find time. >> >>>>>>>>>>> >> >>>>>>>>>>>>>> Is `StreamThreadNotRunningException` really an retryable >> >>> error? >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> When KafkaStream state is REBALANCING, I think it is a >> >>> retryable >> >>>>>>>>> error. >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> StreamThreadStateStoreProvider#stores() will throw >> >>>>>>>>>>>>> StreamThreadNotRunningException when StreamThread state is >> not >> >>>>>>>>>>> RUNNING. The >> >>>>>>>>>>>>> user can retry until KafkaStream state is RUNNING. >> >>>>>>>>>>> >> >>>>>>>>>>> I see. If this is the intention, than I would suggest to have >> two >> >>>>>>> (or >> >>>>>>>>>>> maybe three) different exceptions: >> >>>>>>>>>>> >> >>>>>>>>>>> - StreamThreadRebalancingException (retryable) >> >>>>>>>>>>> - StreamThreadNotRunning (not retryable -- thrown if in state >> >>>>>>>>>>> PENDING_SHUTDOWN or DEAD >> >>>>>>>>>>> - maybe StreamThreadNotStarted (for state CREATED) >> >>>>>>>>>>> >> >>>>>>>>>>> The last one is tricky and could also be merged into one of >> the >> >>>>>>> first >> >>>>>>>>>>> two, depending if you want to argue that it's retryable or >> not. >> >>>>>>> (Just >> >>>>>>>>>>> food for though -- not sure what others think.) >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> -Matthias >> >>>>>>>>>>> >> >>>>>>>>>>> On 6/22/18 8:06 AM, vito jeng wrote: >> >>>>>>>>>>>> Matthias, >> >>>>>>>>>>>> >> >>>>>>>>>>>> Thank you for your assistance. >> >>>>>>>>>>>> >> >>>>>>>>>>>>> what is the status of this KIP? >> >>>>>>>>>>>> >> >>>>>>>>>>>> Unfortunately, there is no further progress. >> >>>>>>>>>>>> About seven weeks ago, I was injured in sports. I had a >> broken >> >>>>>>> wrist >> >>>>>>>> on >> >>>>>>>>>>>> my left wrist. >> >>>>>>>>>>>> Many jobs are affected, including this KIP and >> implementation. >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>>> I just re-read it, and have a couple of follow up comments. >> Why >> >>>>>>> do >> >>>>>>>> we >> >>>>>>>>>>>>> discuss the internal exceptions you want to add? Also, do we >> >>>>>>> really >> >>>>>>>>> need >> >>>>>>>>>>>>> them? Can't we just throw the correct exception directly >> >>> instead >> >>>>>>> of >> >>>>>>>>>>>>> wrapping it later? >> >>>>>>>>>>>> >> >>>>>>>>>>>> I think you may be right. As I say in the previous: >> >>>>>>>>>>>> "The original idea is that we can distinguish different state >> >>>>>>> store >> >>>>>>>>>>>> exception for different handling. But to be honest, I am not >> >>> quite >> >>>>>>>> sure >> >>>>>>>>>>>> this is necessary. Maybe have some change during >> >>> implementation." >> >>>>>>>>>>>> >> >>>>>>>>>>>> During the implementation, I also feel we maybe not need >> wrapper >> >>>>>>> it. >> >>>>>>>>>>>> We can just throw the correctly directly. >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>>> Is `StreamThreadNotRunningException` really an retryable >> error? >> >>>>>>>>>>>> >> >>>>>>>>>>>> When KafkaStream state is REBALANCING, I think it is a >> retryable >> >>>>>>>> error. >> >>>>>>>>>>>> >> >>>>>>>>>>>> StreamThreadStateStoreProvider#stores() will throw >> >>>>>>>>>>>> StreamThreadNotRunningException when StreamThread state is >> not >> >>>>>>>>> RUNNING. >> >>>>>>>>>>> The >> >>>>>>>>>>>> user can retry until KafkaStream state is RUNNING. >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>>> When would we throw an `StateStoreEmptyException`? The >> >>> semantics >> >>>>>>> is >> >>>>>>>>>>>> unclear to me atm. >> >>>>>>>>>>>> >> >>>>>>>>>>>>> When the state is RUNNING, is `StateStoreClosedException` a >> >>>>>>>> retryable >> >>>>>>>>>>>> error? >> >>>>>>>>>>>> >> >>>>>>>>>>>> These two comments will be answered in another mail. >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>> --- >> >>>>>>>>>>>> Vito >> >>>>>>>>>>>> >> >>>>>>>>>>>> On Mon, Jun 11, 2018 at 8:12 AM, Matthias J. Sax < >> >>>>>>>>> matth...@confluent.io> >> >>>>>>>>>>>> wrote: >> >>>>>>>>>>>> >> >>>>>>>>>>>>> Vito, >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> what is the status of this KIP? >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> I just re-read it, and have a couple of follow up comments. >> Why >> >>>>>>> do >> >>>>>>>> we >> >>>>>>>>>>>>> discuss the internal exceptions you want to add? Also, do we >> >>>>>>> really >> >>>>>>>>> need >> >>>>>>>>>>>>> them? Can't we just throw the correct exception directly >> >>> instead >> >>>>>>> of >> >>>>>>>>>>>>> wrapping it later? >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> When would we throw an `StateStoreEmptyException`? The >> >>> semantics >> >>>>>>> is >> >>>>>>>>>>>>> unclear to me atm. >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> Is `StreamThreadNotRunningException` really an retryable >> error? >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> When the state is RUNNING, is `StateStoreClosedException` a >> >>>>>>>> retryable >> >>>>>>>>>>>>> error? >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> One more nits: ReadOnlyWindowStore got a new method #fetch(K >> >>> key, >> >>>>>>>> long >> >>>>>>>>>>>>> time); that should be added >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> Overall I like the KIP but some details are still unclear. >> >>> Maybe >> >>>>>>> it >> >>>>>>>>>>>>> might help if you open an PR in parallel? >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> -Matthias >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> On 4/24/18 8:18 AM, vito jeng wrote: >> >>>>>>>>>>>>>> Hi, Guozhang, >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> Thanks for the comment! >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> Hi, Bill, >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> I'll try to make some update to make the KIP better. >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> Thanks for the comment! >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> --- >> >>>>>>>>>>>>>> Vito >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> On Sat, Apr 21, 2018 at 5:40 AM, Bill Bejeck < >> >>> bbej...@gmail.com >> >>>>>>>> >> >>>>>>>>>>> wrote: >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> Hi Vito, >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> Thanks for the KIP, overall it's a +1 from me. >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> At this point, the only thing I would change is possibly >> >>>>>>> removing >> >>>>>>>>> the >> >>>>>>>>>>>>>>> listing of all methods called by the user and the listing >> of >> >>>>>>> all >> >>>>>>>>> store >> >>>>>>>>>>>>>>> types and focus on what states result in which exceptions >> >>>>>>> thrown >> >>>>>>>> to >> >>>>>>>>>>> the >> >>>>>>>>>>>>>>> user. >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> Thanks, >> >>>>>>>>>>>>>>> Bill >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> On Fri, Apr 20, 2018 at 2:10 PM, Guozhang Wang < >> >>>>>>>> wangg...@gmail.com> >> >>>>>>>>>>>>> wrote: >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> Thanks for the KIP Vito! >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> I made a pass over the wiki and it looks great to me. >> I'm +1 >> >>>>>>> on >> >>>>>>>> the >> >>>>>>>>>>>>> KIP. >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> About the base class InvalidStateStoreException itself, >> I'd >> >>>>>>>>> actually >> >>>>>>>>>>>>>>>> suggest we do not deprecate it but still expose it as >> part >> >>> of >> >>>>>>> the >> >>>>>>>>>>>>> public >> >>>>>>>>>>>>>>>> API, for people who do not want to handle these cases >> >>>>>>> differently >> >>>>>>>>> (if >> >>>>>>>>>>>>> we >> >>>>>>>>>>>>>>>> deprecate it then we are enforcing them to capture all >> three >> >>>>>>>>>>> exceptions >> >>>>>>>>>>>>>>>> one-by-one). >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> Guozhang >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> On Fri, Apr 20, 2018 at 9:14 AM, John Roesler < >> >>>>>>> j...@confluent.io >> >>>>>>>>> >> >>>>>>>>>>>>> wrote: >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>> Hi Vito, >> >>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>> Thanks for the KIP! >> >>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>> I think it's much nicer to give callers different >> >>> exceptions >> >>>>>>> to >> >>>>>>>>> tell >> >>>>>>>>>>>>>>> them >> >>>>>>>>>>>>>>>>> whether the state store got migrated, whether it's still >> >>>>>>>>>>> initializing, >> >>>>>>>>>>>>>>> or >> >>>>>>>>>>>>>>>>> whether there's some unrecoverable error. >> >>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>> In the KIP, it's typically not necessary to discuss >> >>>>>>>>> non-user-facing >> >>>>>>>>>>>>>>>> details >> >>>>>>>>>>>>>>>>> such as what exceptions we will throw internally. The >> KIP >> >>> is >> >>>>>>>>>>> primarily >> >>>>>>>>>>>>>>> to >> >>>>>>>>>>>>>>>>> discuss public interface changes. >> >>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>> You might consider simply removing all the internal >> details >> >>>>>>> from >> >>>>>>>>> the >> >>>>>>>>>>>>>>> KIP, >> >>>>>>>>>>>>>>>>> which will have the dual advantage that it makes the KIP >> >>>>>>> smaller >> >>>>>>>>> and >> >>>>>>>>>>>>>>>> easier >> >>>>>>>>>>>>>>>>> to agree on, as well as giving you more freedom in the >> >>>>>>> internal >> >>>>>>>>>>>>> details >> >>>>>>>>>>>>>>>>> when it comes to implementation. >> >>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>> I like your decision to have your refined exceptions >> extend >> >>>>>>>>>>>>>>>>> InvalidStateStoreException to ensure backward >> >>> compatibility. >> >>>>>>>> Since >> >>>>>>>>>>> we >> >>>>>>>>>>>>>>>> want >> >>>>>>>>>>>>>>>>> to encourage callers to catch the more specific >> exceptions, >> >>>>>>> and >> >>>>>>>> we >> >>>>>>>>>>>>>>> don't >> >>>>>>>>>>>>>>>>> expect to ever throw a raw InvalidStateStoreException >> >>>>>>> anymore, >> >>>>>>>> you >> >>>>>>>>>>>>>>> might >> >>>>>>>>>>>>>>>>> consider adding the @Deprecated annotation to >> >>>>>>>>>>>>>>> InvalidStateStoreException. >> >>>>>>>>>>>>>>>>> This will gently encourage callers to migrate to the new >> >>>>>>>> exception >> >>>>>>>>>>> and >> >>>>>>>>>>>>>>>> open >> >>>>>>>>>>>>>>>>> the possibility of removing InvalidStateStoreException >> >>>>>>> entirely >> >>>>>>>>> in a >> >>>>>>>>>>>>>>>> future >> >>>>>>>>>>>>>>>>> release. >> >>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>> Thanks, >> >>>>>>>>>>>>>>>>> -John >> >>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>> On Thu, Apr 19, 2018 at 8:58 AM, Matthias J. Sax < >> >>>>>>>>>>>>>>> matth...@confluent.io> >> >>>>>>>>>>>>>>>>> wrote: >> >>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>> Thanks for clarification! That makes sense to me. >> >>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>> Can you update the KIP to make those suggestions >> explicit? >> >>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>> -Matthias >> >>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>> On 4/18/18 2:19 PM, vito jeng wrote: >> >>>>>>>>>>>>>>>>>>> Matthias, >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>> Thanks for the feedback! >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> It's up to you to keep the details part in the KIP or >> >>> not. >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>> Got it! >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> The (incomplete) question was, if we need >> >>>>>>>>>>>>>>> `StateStoreFailException` >> >>>>>>>>>>>>>>>> or >> >>>>>>>>>>>>>>>>>>>> if existing `InvalidStateStoreException` could be >> used? >> >>> Do >> >>>>>>>> you >> >>>>>>>>>>>>>>>> suggest >> >>>>>>>>>>>>>>>>>>>> that `InvalidStateStoreException` is not thrown at >> all >> >>>>>>>> anymore, >> >>>>>>>>>>>>>>> but >> >>>>>>>>>>>>>>>>> only >> >>>>>>>>>>>>>>>>>>>> the new sub-classes (just to get a better >> >>> understanding). >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>> Yes. I suggest that `InvalidStateStoreException` is >> not >> >>>>>>> thrown >> >>>>>>>>> at >> >>>>>>>>>>>>>>> all >> >>>>>>>>>>>>>>>>>>> anymore, >> >>>>>>>>>>>>>>>>>>> but only new sub-classes. >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> Not sure what this sentence means: >> >>>>>>>>>>>>>>>>>>>>> The internal exception will be wrapped as category >> >>>>>>> exception >> >>>>>>>>>>>>>>>> finally. >> >>>>>>>>>>>>>>>>>>>> Can you elaborate? >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>> For example, `StreamThreadStateStoreProvider#stores()` >> >>> will >> >>>>>>>>> throw >> >>>>>>>>>>>>>>>>>>> `StreamThreadNotRunningException`(internal exception). >> >>>>>>>>>>>>>>>>>>> And then the internal exception will be wrapped as >> >>>>>>>>>>>>>>>>>>> `StateStoreRetryableException` or >> >>> `StateStoreFailException` >> >>>>>>>>> during >> >>>>>>>>>>>>>>>> the >> >>>>>>>>>>>>>>>>>>> `KafkaStreams.store()` and throw to the user. >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> Can you explain the purpose of the "internal >> >>> exceptions". >> >>>>>>>> It's >> >>>>>>>>>>>>>>>> unclear >> >>>>>>>>>>>>>>>>>>> to me atm why they are introduced. >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>> Hmmm...the purpose of the "internal exceptions" is to >> >>>>>>>>> distinguish >> >>>>>>>>>>>>>>>>> between >> >>>>>>>>>>>>>>>>>>> the different kinds of InvalidStateStoreException. >> >>>>>>>>>>>>>>>>>>> The original idea is that we can distinguish different >> >>>>>>> state >> >>>>>>>>> store >> >>>>>>>>>>>>>>>>>>> exception for >> >>>>>>>>>>>>>>>>>>> different handling. >> >>>>>>>>>>>>>>>>>>> But to be honest, I am not quite sure this is >> necessary. >> >>>>>>> Maybe >> >>>>>>>>>>> have >> >>>>>>>>>>>>>>>>>>> some change during implementation. >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>> Does it make sense? >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>> --- >> >>>>>>>>>>>>>>>>>>> Vito >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>> On Mon, Apr 16, 2018 at 5:59 PM, Matthias J. Sax < >> >>>>>>>>>>>>>>>>> matth...@confluent.io> >> >>>>>>>>>>>>>>>>>>> wrote: >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> Thanks for the update Vito! >> >>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> It's up to you to keep the details part in the KIP or >> >>> not. >> >>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> The (incomplete) question was, if we need >> >>>>>>>>>>>>>>> `StateStoreFailException` >> >>>>>>>>>>>>>>>> or >> >>>>>>>>>>>>>>>>>>>> if existing `InvalidStateStoreException` could be >> used? >> >>> Do >> >>>>>>>> you >> >>>>>>>>>>>>>>>> suggest >> >>>>>>>>>>>>>>>>>>>> that `InvalidStateStoreException` is not thrown at >> all >> >>>>>>>> anymore, >> >>>>>>>>>>>>>>> but >> >>>>>>>>>>>>>>>>> only >> >>>>>>>>>>>>>>>>>>>> the new sub-classes (just to get a better >> >>> understanding). >> >>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> Not sure what this sentence means: >> >>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> The internal exception will be wrapped as category >> >>>>>>> exception >> >>>>>>>>>>>>>>>> finally. >> >>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> Can you elaborate? >> >>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> Can you explain the purpose of the "internal >> >>> exceptions". >> >>>>>>>> It's >> >>>>>>>>>>>>>>>> unclear >> >>>>>>>>>>>>>>>>>>>> to me atm why they are introduced. >> >>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> -Matthias >> >>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> On 4/10/18 12:33 AM, vito jeng wrote: >> >>>>>>>>>>>>>>>>>>>>> Matthias, >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> Thanks for the review. >> >>>>>>>>>>>>>>>>>>>>> I reply separately in the following sections. >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> --- >> >>>>>>>>>>>>>>>>>>>>> Vito >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> On Sun, Apr 8, 2018 at 1:30 PM, Matthias J. Sax < >> >>>>>>>>>>>>>>>>> matth...@confluent.io >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> wrote: >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> Thanks for updating the KIP and sorry for the long >> >>>>>>> pause... >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> Seems you did a very thorough investigation of the >> >>> code. >> >>>>>>>> It's >> >>>>>>>>>>>>>>>> useful >> >>>>>>>>>>>>>>>>>> to >> >>>>>>>>>>>>>>>>>>>>>> understand what user facing interfaces are >> affected. >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> (Some parts might be even too detailed for a KIP.) >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> I also think too detailed. Especially the section >> >>>>>>> `Changes >> >>>>>>>> in >> >>>>>>>>>>>>>>> call >> >>>>>>>>>>>>>>>>>>>> trace`. >> >>>>>>>>>>>>>>>>>>>>> Do you think it should be removed? >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> To summarize my current understanding of your KIP, >> the >> >>>>>>> main >> >>>>>>>>>>>>>>> change >> >>>>>>>>>>>>>>>>> is >> >>>>>>>>>>>>>>>>>> to >> >>>>>>>>>>>>>>>>>>>>>> introduce new exceptions that extend >> >>>>>>>>>>>>>>> `InvalidStateStoreException`. >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> yep. Keep compatibility in this KIP is important >> >>> things. >> >>>>>>>>>>>>>>>>>>>>> I think the best way is that all new exceptions >> extend >> >>>>>>> from >> >>>>>>>>>>>>>>>>>>>>> `InvalidStateStoreException`. >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> Some questions: >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> - Why do we need ```? Could >> >>>>>>> `InvalidStateStoreException` >> >>>>>>>> be >> >>>>>>>>>>>>>>> used >> >>>>>>>>>>>>>>>>> for >> >>>>>>>>>>>>>>>>>>>>>> this purpose? >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> Does this question miss some word? >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> - What the superclass of >> >>>>>>> `StateStoreStreamThreadNotRunni >> >>>>>>>>>>>>>>>>> ngException` >> >>>>>>>>>>>>>>>>>>>>>> is? Should it be `InvalidStateStoreException` or >> >>>>>>>>>>>>>>>>>>>> `StateStoreFailException` >> >>>>>>>>>>>>>>>>>>>>>> ? >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> - Is `StateStoreClosed` a fatal or retryable >> >>> exception >> >>>>>>> ? >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> I apologize for not well written parts. I tried to >> >>> modify >> >>>>>>>> some >> >>>>>>>>>>>>>>> code >> >>>>>>>>>>>>>>>>> in >> >>>>>>>>>>>>>>>>>>>> the >> >>>>>>>>>>>>>>>>>>>>> recent period and modify the KIP. >> >>>>>>>>>>>>>>>>>>>>> The modification is now complete. Please look again. >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> -Matthias >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> On 2/21/18 5:15 PM, vito jeng wrote: >> >>>>>>>>>>>>>>>>>>>>>>> Matthias, >> >>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>> Sorry for not response these days. >> >>>>>>>>>>>>>>>>>>>>>>> I just finished it. Please have a look. :) >> >>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>> --- >> >>>>>>>>>>>>>>>>>>>>>>> Vito >> >>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>> On Wed, Feb 14, 2018 at 5:45 AM, Matthias J. Sax < >> >>>>>>>>>>>>>>>>>>>> matth...@confluent.io> >> >>>>>>>>>>>>>>>>>>>>>>> wrote: >> >>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>> Is there any update on this KIP? >> >>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>> -Matthias >> >>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>> On 1/3/18 12:59 AM, vito jeng wrote: >> >>>>>>>>>>>>>>>>>>>>>>>>> Matthias, >> >>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>> Thank you for your response. >> >>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>> I think you are right. We need to look at the >> state >> >>>>>>> both >> >>>>>>>>> of >> >>>>>>>>>>>>>>>>>>>>>>>>> KafkaStreams and StreamThread. >> >>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>> After further understanding of KafkaStreams >> thread >> >>>>>>> and >> >>>>>>>>> state >> >>>>>>>>>>>>>>>>> store, >> >>>>>>>>>>>>>>>>>>>>>>>>> I am currently rewriting the KIP. >> >>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>> --- >> >>>>>>>>>>>>>>>>>>>>>>>>> Vito >> >>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>> On Fri, Dec 29, 2017 at 4:32 AM, Matthias J. >> Sax < >> >>>>>>>>>>>>>>>>>>>>>> matth...@confluent.io> >> >>>>>>>>>>>>>>>>>>>>>>>>> wrote: >> >>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>> Vito, >> >>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>> Sorry for this late reply. >> >>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>> There can be two cases: >> >>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>> - either a store got migrated way and thus, is >> >>> not >> >>>>>>>>> hosted >> >>>>>>>>>>>>>>> an >> >>>>>>>>>>>>>>>>> the >> >>>>>>>>>>>>>>>>>>>>>>>>>> application instance anymore, >> >>>>>>>>>>>>>>>>>>>>>>>>>> - or, a store is hosted but the instance is in >> >>>>>>> state >> >>>>>>>>>>>>>>>> rebalance >> >>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>> For the first case, users need to rediscover >> the >> >>>>>>> store. >> >>>>>>>>> For >> >>>>>>>>>>>>>>>> the >> >>>>>>>>>>>>>>>>>>>> second >> >>>>>>>>>>>>>>>>>>>>>>>>>> case, they need to wait until rebalance is >> >>> finished. >> >>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>> If KafkaStreams is in state ERROR, >> >>>>>>> PENDING_SHUTDOWN, or >> >>>>>>>>>>>>>>>>>> NOT_RUNNING, >> >>>>>>>>>>>>>>>>>>>>>>>>>> uses cannot query at all and thus they cannot >> >>>>>>>> rediscover >> >>>>>>>>> or >> >>>>>>>>>>>>>>>>> retry. >> >>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>> Does this make sense? >> >>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>> -Matthias >> >>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>> On 12/20/17 12:54 AM, vito jeng wrote: >> >>>>>>>>>>>>>>>>>>>>>>>>>>> Matthias, >> >>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>> I try to clarify some concept. >> >>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>> When streams state is REBALANCING, it means >> the >> >>>>>>> user >> >>>>>>>> can >> >>>>>>>>>>>>>>> just >> >>>>>>>>>>>>>>>>>> plain >> >>>>>>>>>>>>>>>>>>>>>>>>>> retry. >> >>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>> When streams state is ERROR or >> PENDING_SHUTDOWN >> >>> or >> >>>>>>>>>>>>>>>> NOT_RUNNING, >> >>>>>>>>>>>>>>>>>> it >> >>>>>>>>>>>>>>>>>>>>>>>> means >> >>>>>>>>>>>>>>>>>>>>>>>>>>> state store migrated to another instance, the >> >>> user >> >>>>>>>> needs >> >>>>>>>>>>> to >> >>>>>>>>>>>>>>>>>>>>>> rediscover >> >>>>>>>>>>>>>>>>>>>>>>>>>> the >> >>>>>>>>>>>>>>>>>>>>>>>>>>> store. >> >>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>> Is my understanding correct? >> >>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>> --- >> >>>>>>>>>>>>>>>>>>>>>>>>>>> Vito >> >>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>> On Sun, Nov 5, 2017 at 12:30 AM, Matthias J. >> Sax >> >>> < >> >>>>>>>>>>>>>>>>>>>>>>>> matth...@confluent.io> >> >>>>>>>>>>>>>>>>>>>>>>>>>>> wrote: >> >>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the KIP Vito! >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> I agree with what Guozhang said. The original >> >>>>>>> idea of >> >>>>>>>>> the >> >>>>>>>>>>>>>>>> Jira >> >>>>>>>>>>>>>>>>>>>> was, >> >>>>>>>>>>>>>>>>>>>>>> to >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> give different exceptions for different >> >>> "recovery" >> >>>>>>>>>>>>>>>> strategies >> >>>>>>>>>>>>>>>>> to >> >>>>>>>>>>>>>>>>>>>> the >> >>>>>>>>>>>>>>>>>>>>>>>>>> user. >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> For example, if a store is currently >> recreated, >> >>> a >> >>>>>>>> user >> >>>>>>>>>>>>>>> just >> >>>>>>>>>>>>>>>>> need >> >>>>>>>>>>>>>>>>>>>> to >> >>>>>>>>>>>>>>>>>>>>>>>> wait >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> and can query the store later. On the other >> >>> hand, >> >>>>>>> if >> >>>>>>>> a >> >>>>>>>>>>>>>>> store >> >>>>>>>>>>>>>>>>> go >> >>>>>>>>>>>>>>>>>>>>>>>> migrated >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> to another instance, a user needs to >> rediscover >> >>>>>>> the >> >>>>>>>>> store >> >>>>>>>>>>>>>>>>>> instead >> >>>>>>>>>>>>>>>>>>>>>> of a >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> "plain retry". >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> Fatal errors might be a third category. >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> Not sure if there is something else? >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> Anyway, the KIP should contain a section that >> >>>>>>> talks >> >>>>>>>>> about >> >>>>>>>>>>>>>>>> this >> >>>>>>>>>>>>>>>>>>>> ideas >> >>>>>>>>>>>>>>>>>>>>>>>> and >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> reasoning. >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> -Matthias >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> On 11/3/17 11:26 PM, Guozhang Wang wrote: >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for writing up the KIP. >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Vito, Matthias: one thing that I wanted to >> >>> figure >> >>>>>>>> out >> >>>>>>>>>>>>>>> first >> >>>>>>>>>>>>>>>>> is >> >>>>>>>>>>>>>>>>>>>> what >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> categories of errors we want to notify the >> >>>>>>> users, if >> >>>>>>>>> we >> >>>>>>>>>>>>>>>> only >> >>>>>>>>>>>>>>>>>>>> wants >> >>>>>>>>>>>>>>>>>>>>>> to >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> distinguish fatal v.s. retriable then >> probably >> >>> we >> >>>>>>>>> should >> >>>>>>>>>>>>>>>>> rename >> >>>>>>>>>>>>>>>>>>>> the >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> proposed StateStoreMigratedException / >> >>>>>>>>>>>>>>>>>> StateStoreClosedException >> >>>>>>>>>>>>>>>>>>>>>>>>>> classes. >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> And then from there we should list what are >> the >> >>>>>>>>> possible >> >>>>>>>>>>>>>>>>>> internal >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> exceptions ever thrown in those APIs in the >> >>> call >> >>>>>>>>> trace, >> >>>>>>>>>>>>>>> and >> >>>>>>>>>>>>>>>>>> which >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> exceptions should be wrapped to what others, >> >>> and >> >>>>>>>> which >> >>>>>>>>>>>>>>> ones >> >>>>>>>>>>>>>>>>>>>> should >> >>>>>>>>>>>>>>>>>>>>>> be >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> handled without re-throwing, and which ones >> >>>>>>> should >> >>>>>>>> not >> >>>>>>>>>>> be >> >>>>>>>>>>>>>>>>>> wrapped >> >>>>>>>>>>>>>>>>>>>>>> at >> >>>>>>>>>>>>>>>>>>>>>>>>>> all >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> but directly thrown to user's face. >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Guozhang >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Wed, Nov 1, 2017 at 11:09 PM, vito jeng < >> >>>>>>>>>>>>>>>>>> v...@is-land.com.tw> >> >>>>>>>>>>>>>>>>>>>>>>>>>> wrote: >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi, >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I'd like to start discuss KIP-216: >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> https://cwiki.apache.org/ >> >>>>>>>>> confluence/display/KAFKA/KIP- >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>> 216%3A+IQ+should+throw+different+exceptions+for+ >> >>>>>>>>>>>>>>>>>>>> different+errors >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Please have a look. >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks! >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> --- >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Vito >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> -- >> >>>>>>>>>>>>>>>> -- Guozhang >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> -- >> >>>>>>>> -- Guozhang >> >>>>>>>> >> >>>>>>> >> >>>>>> >> >>>>> >> >>>> >> >>> >> >>> >> > >> >>