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 > >>>>>>>> > >>>>>>> > >>>>>> > >>>>> > >>>> > >>> > >>> > > > >