Hi, folks, Just update the KIP, please take a look.
Thanks! --- Vito On Fri, Jan 17, 2020 at 9:12 AM Vito Jeng <v...@is-land.com.tw> wrote: > Thanks Bill, John and Matthias. Glad you guys joined this discussion. > I got a lot out of the discussion. > > I would like to update KIP-216 base on John's suggestion to remove the > category. > > > --- > Vito > > > On Fri, Jan 17, 2020 at 2:30 AM Matthias J. Sax <matth...@confluent.io> > wrote: > >> > Nevertheless, if we omit the categorization, it’s moot. >> >> Ack. >> >> I am fine to remove the middle tier. As John pointed out, it might be >> weird to have only one concrete exception type per category. We can also >> explain in detail how to handle each exception in their JavaDocs. >> >> >> -Matthias >> >> On 1/16/20 6:38 AM, Bill Bejeck wrote: >> > Vito, >> > >> > Thanks for the updates, the KIP LGTM. >> > >> > -Bill >> > >> > On Wed, Jan 15, 2020 at 11:31 PM John Roesler <vvcep...@apache.org> >> wrote: >> > >> >> Hi Vito, >> >> >> >> Haha, your archive game is on point! >> >> >> >> What Matthias said in that email is essentially what I figured was the >> >> rationale. It makes sense, but the point I was making is that this >> really >> >> doesn’t seem like a good way to structure a production app. On the >> other >> >> hand, considering the exception fatal has a good chance of avoiding a >> >> frustrating debug session if you just forgot to call start. >> >> >> >> Nevertheless, if we omit the categorization, it’s moot. >> >> >> >> It would be easy to add a categorization layer later if we want it, but >> >> not very easy to change it if we get it wrong. >> >> >> >> Thanks for your consideration! >> >> -John >> >> >> >> On Wed, Jan 15, 2020, at 21:14, Vito Jeng wrote: >> >>> Hi John, >> >>> >> >>> About `StreamsNotStartedException is strange` -- >> >>> The original idea came from Matthias, two years ago. :) >> >>> You can reference here: >> >>> >> >> >> https://mail-archives.apache.org/mod_mbox/kafka-dev/201806.mbox/%3c6c32083e-b63c-435b-521d-032d45cc5...@confluent.io%3e >> >>> >> >>> About omitting the categorization -- >> >>> It looks reasonable. I'm fine with omitting the categorization but not >> >> very >> >>> sure it is a good choice. >> >>> Does any other folks provide opinion? >> >>> >> >>> >> >>> Hi, folks, >> >>> >> >>> Just update the KIP-216, please take a look. >> >>> >> >>> --- >> >>> Vito >> >>> >> >>> >> >>> On Thu, Jan 16, 2020 at 6:35 AM Vito Jeng <v...@is-land.com.tw> >> wrote: >> >>> >> >>>> >> >>>> Hi, folks, >> >>>> >> >>>> Thank you suggestion, really appreciate it. :) >> >>>> I understand your concern. I'll merge StreamsNotRunningException and >> >>>> StateStoreNotAvailableException. >> >>>> >> >>>> >> >>>> --- >> >>>> Vito >> >>>> >> >>>> >> >>>> On Thu, Jan 16, 2020 at 6:22 AM John Roesler <vvcep...@apache.org> >> >> wrote: >> >>>> >> >>>>> Hey Vito, >> >>>>> >> >>>>> Yes, thanks for the KIP. Sorry the discussion has been so long. >> >>>>> Hopefully, we can close it out soon. >> >>>>> >> >>>>> I agree we can drop StreamsNotRunningException in favor of >> >>>>> just StateStoreNotAvailableException. >> >>>>> >> >>>>> Unfortunately, I have some higher-level concerns. The value >> >>>>> of these exceptions is that they tell you how to handle the >> >>>>> various situations that can arise while querying a distributed >> >>>>> data store. >> >>>>> >> >>>>> Ideally, as a caller, I should be able to just catch "retriable" or >> >>>>> "fatal" and handle them appropriately. Otherwise, there's no >> >>>>> point in having categories, and we should just have all the >> >>>>> exceptions extend InvalidStateStoreException. >> >>>>> >> >>>>> Presently, it's not possible to tell from just the >> >>>>> "retriable"/"fatal" distinction what to do. You can tell >> >>>>> from the descriptions of the various exceptions. E.g.: >> >>>>> >> >>>>> Retriable: >> >>>>> * StreamsRebalancingException: the exact same call >> >>>>> should just be retried until the rebalance is complete >> >>>>> * StateStoreMigratedException: the store handle is >> >>>>> now invalid, so you need to re-discover the instance >> >>>>> and get a new handle on that instance. In other words, >> >>>>> the query itself may be valid, but the particular method >> >>>>> invocation on this particular instance has encountered >> >>>>> a fatal exception. >> >>>>> >> >>>>> Fatal: >> >>>>> * UnknownStateStoreException: this is truly fatal. No amount >> >>>>> of retrying or re-discovering is going to get you a handle on a >> >>>>> store that doesn't exist in the cluster. >> >>>>> * StateStoreNotAvailableException: this is actually recoverable, >> >>>>> since the store might exist in the cluster, but isn't available >> on >> >>>>> this particular instance (which is shut down or whatever). >> >>>>> >> >>>>> Personally, I'm not a fan of code bureaucracy, so I'm 100% fine >> >>>>> with omitting the categorization and just having 5 subclasses >> >>>>> of InvalidStateStoreException. Each of them would tell you >> >>>>> how to handle them, and it's not too many to really >> >>>>> understand and handle each one. >> >>>>> >> >>>>> If you really want to have a middle tier, I'd recommend: >> >>>>> * RetryableStateStoreException: the exact same call >> >>>>> should be repeated. >> >>>>> * RecoverableStateStoreException: the store handle >> >>>>> should be discarded and the caller should re-discover >> >>>>> the location of the store and repeat the query on the >> >>>>> correct instance. >> >>>>> * FatalStateStoreException: the query/request is totally >> >>>>> invalid and will never succeed. >> >>>>> >> >>>>> However, attempting to categorize the proposed exceptions >> >>>>> reveals even problems with this categorization: >> >>>>> Retriable: >> >>>>> * StreamsRebalancingException >> >>>>> Recoverable: >> >>>>> * StateStoreMigratedException >> >>>>> * StreamsNotRunningException >> >>>>> Fatal: >> >>>>> * UnknownStateStoreException >> >>>>> >> >>>>> But StreamsNotStartedException is strange... It means that >> >>>>> one code path got a handle on a specific KafkaStreams object >> >>>>> instance and sent it a query before another code path >> >>>>> invoked the start() method on the exact same object instance. >> >>>>> It seems like the most likely scenario is that whoever wrote >> >>>>> the program just forgot to call start() before querying, in >> >>>>> which case, retrying isn't going to help, and a fatal exception >> >>>>> is more appropriate. I.e., it sounds like a "first 15 minutes >> >>>>> experience" problem, and making it fatal would be more >> >>>>> helpful. Even in a production context, there's no reason not >> >>>>> to sequence your application startup such that you don't >> >>>>> accept queries until after Streams is started. Thus, I guess >> >>>>> I'd categorize it under "fatal". >> >>>>> >> >>>>> Regardless of whether you make it fatal or retriable, you'd >> >>>>> still have a whole category with only one exception in it, >> >>>>> and the other two categories only have two exceptions. >> >>>>> Plus, as you pointed out in the KIP, you can't get all >> >>>>> exceptions in all cases anyway: >> >>>>> * store() can only throw NotStarted, NotRunning, >> >>>>> and Unknown >> >>>>> * actual store queries can only throw Rebalancing, >> >>>>> Migrated, and NotRunning >> >>>>> >> >>>>> Thus, in practice also, there are exactly three categories >> >>>>> and also exactly three exception types. It doesn't seem >> >>>>> like there's a great advantage to the categories here. To >> >>>>> avoid the categorization problem and also to clarify what >> >>>>> exceptions can actually be thrown in different circumstances, >> >>>>> it seems like we should just: >> >>>>> * get rid of the middle tier and make all the exceptions >> >>>>> extend InvalidStateStoreException >> >>>>> * drop StateStoreNotAvailableException in favor of >> >>>>> StreamsNotRunningException >> >>>>> * clearly document on all public methods which exceptions >> >>>>> need to be handled >> >>>>> >> >>>>> How do you feel about this? >> >>>>> Thanks, >> >>>>> -John >> >>>>> >> >>>>> On Wed, Jan 15, 2020, at 15:13, Bill Bejeck wrote: >> >>>>>> Thanks for KIP Vito. >> >>>>>> >> >>>>>> Overall the KIP LGTM, but I'd have to agree with others on merging >> >> the >> >>>>>> `StreamsNotRunningException` and `StateStoreNotAvailableException` >> >>>>> classes. >> >>>>>> >> >>>>>> Since in both cases, the thread state is in `PENDING_SHUTDOWN || >> >>>>>> NOT_RUNNING || ERROR` I'm not even sure how we could distinguish >> >> when to >> >>>>>> use the different >> >>>>>> exceptions. Maybe a good middle ground would be to have a detailed >> >>>>>> exception message. >> >>>>>> >> >>>>>> The KIP freeze is close, so I think if we can agree on this, we can >> >>>>> wrap up >> >>>>>> the voting soon. >> >>>>>> >> >>>>>> Thanks, >> >>>>>> Bill >> >>>>>> >> >>>>>> On Tue, Jan 14, 2020 at 2:12 PM Matthias J. Sax < >> >> matth...@confluent.io> >> >>>>>> wrote: >> >>>>>> >> >>>>>>> Vito, >> >>>>>>> >> >>>>>>> It's still unclear to me what the advantage is, to have both >> >>>>>>> `StreamsNotRunningException` and >> >> `StateStoreNotAvailableException`? >> >>>>>>> >> >>>>>>> For both cased, the state is `PENDING_SHUTDOWN / NOT_RUNNING / >> >> ERROR` >> >>>>>>> and thus, for a user point of view, why does it matter if the >> >> store is >> >>>>>>> closed on not? I don't understand why/how this information would >> >> be >> >>>>>>> useful? Do you have a concrete example in mind how a user would >> >> react >> >>>>>>> differently to both exceptions? >> >>>>>>> >> >>>>>>> >> >>>>>>> @Vinoth: about `StreamsRebalancingException` -- to me, it seems >> >> best >> >>>>> to >> >>>>>>> actually do this on a per-query basis, ie, have an overload >> >>>>>>> `KafkaStreams#store(...)` that takes a boolean flag that allow to >> >>>>>>> _disable_ the exception and opt-in to query a active store during >> >>>>>>> recovery. However, as KIP-535 actually introduces this change in >> >>>>>>> behavior, I think KIP-216 should not cover this, but KIP-535 >> >> should be >> >>>>>>> updated. I'll follow up on the other KIP thread to raise this >> >> point. >> >>>>>>> >> >>>>>>> >> >>>>>>> -Matthias >> >>>>>>> >> >>>>>>> On 1/11/20 12:26 AM, Vito Jeng wrote: >> >>>>>>>> Hi, Matthias & Vinoth, >> >>>>>>>> >> >>>>>>>> Thanks for the feedback. >> >>>>>>>> >> >>>>>>>>> What is still unclear to me is, what we gain by having both >> >>>>>>>>> `StreamsNotRunningException` and >> >>>>> `StateStoreNotAvailableException`. Both >> >>>>>>>>> exception are thrown when KafkaStreams is in state >> >>>>> PENDING_SHUTDOWN / >> >>>>>>>>> NOT_RUNNING / ERROR. Hence, as a user what do I gain to know >> >> if the >> >>>>>>>>> state store is closed on not -- I can't query it anyway? Maybe >> >> I >> >>>>> miss >> >>>>>>>>> something thought? >> >>>>>>>> >> >>>>>>>> Yes, both `StreamsNotRunningException` and >> >>>>>>>> `StateStoreNotAvailableException` are fatal exception. >> >>>>>>>> But `StateStoreNotAvailableException` is fatal exception about >> >> state >> >>>>>>> store >> >>>>>>>> related. >> >>>>>>>> I think it would be helpful that if user need to distinguish >> >> these >> >>>>> two >> >>>>>>>> different case to handle it. >> >>>>>>>> >> >>>>>>>> I'm not very sure, does that make sense? >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> --- >> >>>>>>>> Vito >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> On Fri, Jan 10, 2020 at 3:35 AM Vinoth Chandar < >> >> vin...@apache.org> >> >>>>>>> wrote: >> >>>>>>>> >> >>>>>>>>> +1 on merging `StreamsNotRunningException` and >> >>>>>>>>> `StateStoreNotAvailableException`, both exceptions are fatal >> >>>>> anyway. IMO >> >>>>>>>>> its best to have these exceptions be about the state store >> >> (and not >> >>>>>>> streams >> >>>>>>>>> state), to easier understanding. >> >>>>>>>>> >> >>>>>>>>> Additionally, KIP-535 allows for querying of state stores in >> >>>>> rebalancing >> >>>>>>>>> state. So do we need the StreamsRebalancingException? >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> On 2020/01/09 03:38:11, "Matthias J. Sax" < >> >> matth...@confluent.io> >> >>>>>>> wrote: >> >>>>>>>>>> Sorry that I dropped the ball on this... >> >>>>>>>>>> >> >>>>>>>>>> Thanks for updating the KIP. Overall LGTM now. Feel free to >> >> start >> >>>>> a >> >>>>>>> VOTE >> >>>>>>>>>> thread. >> >>>>>>>>>> >> >>>>>>>>>> What is still unclear to me is, what we gain by having both >> >>>>>>>>>> `StreamsNotRunningException` and >> >>>>> `StateStoreNotAvailableException`. >> >>>>>>> Both >> >>>>>>>>>> exception are thrown when KafkaStreams is in state >> >>>>> PENDING_SHUTDOWN / >> >>>>>>>>>> NOT_RUNNING / ERROR. Hence, as a user what do I gain to know >> >> if >> >>>>> the >> >>>>>>>>>> state store is closed on not -- I can't query it anyway? >> >> Maybe I >> >>>>> miss >> >>>>>>>>>> something thought? >> >>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>>> -Matthias >> >>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>>> On 11/3/19 6:07 PM, Vito Jeng wrote: >> >>>>>>>>>>> Sorry for the late reply, thanks for the review. >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>>> About `StateStoreMigratedException`: >> >>>>>>>>>>>> >> >>>>>>>>>>>> Why is it only thrown if the state is REBALANCING? A store >> >>>>> might be >> >>>>>>>>>>>> migrated during a rebalance, and Kafka Streams might resume >> >>>>> back to >> >>>>>>>>>>>> RUNNING state and afterward somebody tries to use an old >> >> store >> >>>>>>> handle. >> >>>>>>>>>>>> Also, if state is REBALANCING, should we throw >> >>>>>>>>>>>> `StreamThreadRebalancingException`? Hence, I think >> >>>>>>>>>>>> `StateStoreMigratedException` does only make sense during >> >>>>> `RUNNING` >> >>>>>>>>> state. >> >>>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> Thank you point this, already updated. >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> Why do we need to distinguish between >> >>>>>>> `KafkaStreamsNotRunningException` >> >>>>>>>>>>>> and `StateStoreNotAvailableException`? >> >>>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> `KafkaStreamsNotRunningException` may be caused by various >> >>>>> reasons, I >> >>>>>>>>> think >> >>>>>>>>>>> it would be helpful that the >> >>>>>>>>>>> user can distinguish whether it is caused by the state store >> >>>>> closed. >> >>>>>>>>>>> (Maybe I am wrong...) >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> Last, why do we distinguish between `KafkaStreams` instance >> >> and >> >>>>>>>>>>>> `StreamsThread`? To me, it seems we should always refer to >> >> the >> >>>>>>>>> instance, >> >>>>>>>>>>>> because that is the level of granularity in which we >> >>>>> enable/disable >> >>>>>>>>> IQ atm. >> >>>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> Totally agree. Do you mean the naming of state store >> >> exceptions? >> >>>>>>>>>>> I don't have special reason to distinguish these two. >> >>>>>>>>>>> Your suggestion look more reasonable for the exception >> >> naming. >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> Last, for `StateStoreMigratedException`, I would add that a >> >> user >> >>>>> need >> >>>>>>>>> to >> >>>>>>>>>>>> rediscover the store and cannot blindly retry as the store >> >>>>> handle is >> >>>>>>>>>>>> invalid and a new store handle must be retrieved. That is a >> >>>>>>> difference >> >>>>>>>>>>>> to `StreamThreadRebalancingException` that allows for >> >> "blind" >> >>>>> retries >> >>>>>>>>>>>> that either resolve (if the store is still on the same >> >> instance >> >>>>> after >> >>>>>>>>>>>> rebalancing finishes, or changes to >> >>>>> `StateStoreMigratedException` if >> >>>>>>>>> the >> >>>>>>>>>>>> store was migrated away during rebalancing). >> >>>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> Nice, it's great! Thank you. >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> The KIP already updated, please take a look. :) >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> On Wed, Oct 23, 2019 at 1:48 PM Matthias J. Sax < >> >>>>>>> matth...@confluent.io >> >>>>>>>>>> >> >>>>>>>>>>> wrote: >> >>>>>>>>>>> >> >>>>>>>>>>>> Any update on this KIP? >> >>>>>>>>>>>> >> >>>>>>>>>>>> On 10/7/19 3:35 PM, Matthias J. Sax wrote: >> >>>>>>>>>>>>> Sorry for the late reply. The 2.4 deadline kept us quite >> >> busy. >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> About `StateStoreMigratedException`: >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> Why is it only thrown if the state is REBALANCING? A store >> >>>>> might be >> >>>>>>>>>>>>> migrated during a rebalance, and Kafka Streams might resume >> >>>>> back to >> >>>>>>>>>>>>> RUNNING state and afterward somebody tries to use an old >> >> store >> >>>>>>>>> handle. >> >>>>>>>>>>>>> Also, if state is REBALANCING, should we throw >> >>>>>>>>>>>>> `StreamThreadRebalancingException`? Hence, I think >> >>>>>>>>>>>>> `StateStoreMigratedException` does only make sense during >> >>>>> `RUNNING` >> >>>>>>>>>>>> state. >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> Why do we need to distinguish between >> >>>>>>>>> `KafkaStreamsNotRunningException` >> >>>>>>>>>>>>> and `StateStoreNotAvailableException`? >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> Last, why do we distinguish between `KafkaStreams` >> >> instance and >> >>>>>>>>>>>>> `StreamsThread`? To me, it seems we should always refer to >> >> the >> >>>>>>>>> instance, >> >>>>>>>>>>>>> because that is the level of granularity in which we >> >>>>> enable/disable >> >>>>>>>>> IQ >> >>>>>>>>>>>> atm. >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> Last, for `StateStoreMigratedException`, I would add that a >> >>>>> user >> >>>>>>>>> need to >> >>>>>>>>>>>>> rediscover the store and cannot blindly retry as the store >> >>>>> handle is >> >>>>>>>>>>>>> invalid and a new store handle must be retrieved. That is a >> >>>>>>>>> difference >> >>>>>>>>>>>>> to `StreamThreadRebalancingException` that allows for >> >> "blind" >> >>>>>>> retries >> >>>>>>>>>>>>> that either resolve (if the store is still on the same >> >> instance >> >>>>>>> after >> >>>>>>>>>>>>> rebalancing finishes, or changes to >> >>>>> `StateStoreMigratedException` if >> >>>>>>>>> the >> >>>>>>>>>>>>> store was migrated away during rebalancing). >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> -Matthias >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> On 8/9/19 10:20 AM, Vito Jeng wrote: >> >>>>>>>>>>>>>> My bad. The short link `https://shorturl.at/CDNT9` >> <https://shorturl.at/CDNT9> >> >> <https://shorturl.at/CDNT9> >> >>>>> <https://shorturl.at/CDNT9> >> >>>>>>> <https://shorturl.at/CDNT9> >> >>>>>>>>> <https://shorturl.at/CDNT9> >> >>>>>>>>>>>> <https://shorturl.at/CDNT9> >> >>>>>>>>>>>>>> <https://shorturl.at/CDNT9> seems incorrect. >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> Please use the following instead: >> >> https://shorturl.at/bkKQU >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> --- >> >>>>>>>>>>>>>> Vito >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> On Fri, Aug 9, 2019 at 10:53 AM Vito Jeng < >> >>>>> v...@is-land.com.tw> >> >>>>>>>>> wrote: >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> Thanks, Matthias! >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> About `StreamThreadNotStartedException`: >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> Thank you for explanation. I agree with your opinion. >> >>>>>>>>>>>>>>> `CompositeReadOnlyXxxStore#get()` would never throw >> >>>>>>>>>>>>>>> `StreamThreadNotStartedException`. >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> For the case that corresponding thread crashes after we >> >>>>> handed out >> >>>>>>>>> the >> >>>>>>>>>>>>>>> store handle. We may throw >> >> `KafkaStreamsNotRunningException` >> >>>>> or >> >>>>>>>>>>>>>>> `StateStoreMigratedException`. >> >>>>>>>>>>>>>>> In `StreamThreadStateStoreProvider`, we would throw >> >>>>>>>>>>>>>>> `KafkaStreamsNotRunningException` when stream thread is >> >> not >> >>>>>>>>> running( >> >>>>>>>>>>>>>>> https://shorturl.at/CDNT9) or throw >> >>>>> `StateStoreMigratedException` >> >>>>>>>>> when >> >>>>>>>>>>>>>>> store is closed(https://shorturl.at/hrvAN). So I think >> >> we >> >>>>> do not >> >>>>>>>>> need >> >>>>>>>>>>>> to >> >>>>>>>>>>>>>>> add a new type for this case. Does that make sense? >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> About `KafkaStreamsNotRunningException` vs >> >>>>>>>>>>>>>>> `StreamThreadNotRunningException`: >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> I understand your point. I rename >> >>>>>>>>> `StreamThreadNotRunningException` to >> >>>>>>>>>>>>>>> `KafkaStreamsNotRunningException`. >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> About check unknown state store names: >> >>>>>>>>>>>>>>> Thank you for the hint. I add a new type >> >>>>>>>>> `UnknownStateStoreException` >> >>>>>>>>>>>> for >> >>>>>>>>>>>>>>> this case. >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> Also, we should still have fatal exception >> >>>>>>>>>>>>>>> `StateStoreNotAvailableException`? Not sure why you >> >> remove >> >>>>> it? >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> Thank you point this, already add it again. >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> The KIP already updated, please take a look. >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> --- >> >>>>>>>>>>>>>>> Vito >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>> >> >>>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>> >> >>>>> >> >>>> >> >>> >> >> >> > >> >>