Status
Current state: Under Discussion
Discussion thread: here
JIRA:
Unable to render Jira issues macro, execution error.
Please keep the discussion on the mailing list rather than commenting on the wiki (wiki discussions get unwieldy fast).
Motivation
Currently, IQ throws InvalidStateStoreException for any types of error, that means a user cannot handle different types of error.
Because of that, we should throw different exceptions for each type.
Proposed Changes
The main change is to introduce new exceptions that extend from InvalidStateStoreException. InvalidStateStoreException is not thrown at all anymore, but only new sub-classes.
# Throw to user exception
public class StateStoreMigratedException extends InvalidStateStoreException
public class StateStoreRetryableException extends InvalidStateStoreException
public class StateStoreFailException extends InvalidStateStoreException
# Internal exception
public class StateStoreClosedException extends InvalidStateStoreException
public class StateStoreEmptyException extends InvalidStateStoreException
public class StreamThreadNotRunningException extends InvalidStateStoreException
Three categories exception throw to the user:
Three internal exceptions: StateStoreClosedException, StateStoreEmptyException, StreamThreadNotRunningException
The purpose of the internal exceptions is to distinguish between the different kinds of InvalidStateStoreException. The internal exception will be wrapped as user's category exception finally.
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.
The following is the public method that users will call:
- KafkaStreams
- ReadOnlyKeyValueStore(CompositeReadOnlyKeyValueStore)
- get(k)
- range(from, to)
- all()
- approximateNumEntries()
- ReadOnlySessionStore(CompositeReadOnlySessionStore)
- ReadOnlyWindowStore(CompositeReadOnlyWindowStore)
- fetch(k, rf, tt)
- fetch(from, to, rf, tt)
- all()
- fetchAll()
- KeyValueIterator(DelegatingPeekingKeyValueIterator)
- next()
- hasNext()
- peekNextKey()
- WindowStoreIterator(MeteredWindowStoreIterator)
- next()
- hasNext()
- peekNextKey()
public class KafkaStreams {
public <T> T store(final String storeName, final QueryableStoreType<T> queryableStoreType);
}
public class CompositeReadOnlyKeyValueStore<K, V> implements ReadOnlyKeyValueStore<K, V> {
public V get(final K key);
public KeyValueIterator<K, V> range(final K from, final K to);
public KeyValueIterator<K, V> all();
public long approximateNumEntries();
}
public class CompositeReadOnlySessionStore<K, V> implements ReadOnlySessionStore<K, V> {
public KeyValueIterator<Windowed<K>, V> fetch(final K key);
public KeyValueIterator<Windowed<K>, V> fetch(final K from, final K to);
}
public class CompositeReadOnlyWindowStore<K, V> implements ReadOnlyWindowStore<K, V> {
public WindowStoreIterator<V> fetch(final K key, final long timeFrom, final long timeTo);
public KeyValueIterator<Windowed<K>, V> fetch(final K from, final K to, final long timeFrom, final long timeTo);
public KeyValueIterator<Windowed<K>, V> all();
public KeyValueIterator<Windowed<K>, V> fetchAll(final long timeFrom, final long timeTo);
}
class DelegatingPeekingKeyValueIterator<K, V> implements KeyValueIterator<K, V>, PeekingKeyValueIterator<K, V> {
public synchronized boolean hasNext();
public synchronized KeyValue<K, V> next();
public KeyValue<K, V> peekNext();
}
class MeteredWindowStoreIterator<V> implements WindowStoreIterator<V> {
public boolean hasNext();
public KeyValue<Long, V> next();
public Long peekNextKey()
}
During user call one of above methods, we should check KafkaStreams state by the following rule when InvalidStateStoreException is thrown:
- If state is RUNNING or REBALANCING:
- StateStoreClosedException: should be wrapped to StateStoreRetryableException
- StreamThreadNotRunningException: should be wrapped to StateStoreRetryableException
- StateStoreEmptyException: should be wrapped to StateStoreMigratedException
- if state is PENDING_SHUTDOWN or ERROR or NOT_RUNNING:
- wrap InvalidStateStoreException(include sub classes) to StateStoreFailException
Call Trace
Call trace 1: KafkaStreams#store()
- KafkaStreams#store() (v)
- QueryableStoreProvider#getStore() (v)
- GlobalStateStoreProvider#stores() (v)
- StreamThreadStateStroeProvider#stores() (v)
Call trace 2: ReadOnlyKeyValueStore#get()
- CompositeReadOnlyKeyValueStore#get() (v)
- WrappingStoreProvider#stores() (v)
- StreamThreadStateStoreProvider#stores() (v)
- MeteredKeyValueBytesStore#get()
- InnerMeteredKeyValueStore#get()
- CachingKeyValueStore#get()
- AbstractStateStore#validateStoreOpen() (v)
- CachingKeyValueStore#getInternal()
- ChangeLoggingKeyValueBytesStore#get()
- RocksDBStore#get()
- RocksDBStore#validateStoreOpen() (v)
- RocksDBStore#getInternal()
Call trace 3: ReadOnlyKeyValueStore#range()
- CompositeReadOnlyKeyValueStore#range() (v)
- WrappingStoreProvider#stores() (v)
- StreamThreadStateStoreProvider#stores() (v)
- return new DelegatingPeekingKeyValueIterator
- DelegatingPeekingKeyValueIterator#hasNext() (v)
- CompositKeyValueIterator#hasNext()
- NextIteratorFunction#apply() (v)
- MeteredKeyValueBytesStore#range()
- InnerMeteredKeyValueStore#range()
- CachingKeyValueStore#range()
- AbstractStateStore#validateStoreOpen() (v)
- ChangeLoggingKeyValueBytesStore#range()
- RocksDBStore#range()
- RocksDBStore#validateStoreOpen() (v)
- return new RocksDBRangeIterator()
- return new MergedSortedCacheKeyValueBytesStoreIterator()
- return new MeteredKeyValueIterator()
- return
- return
- return
- CompositKeyValueIterator#next()
- MeteredKeyValueIterator#next()
- MergedSortedCacheKeyValueBytesStoreIterator#next()
AbstractMergedSortedCacheStoreIterator#next()
- RocksDBRangeIterator#hasNext()
RocksDBIterator#hasNext() (v) - AbstractMergedStortedCacheStoreIterator#nextSrtoreValue()
- RocksDBRangeIterator#next()
RocksDBIterator#next()- RocksDbIterator#hasNext() (v)
- RocksDbIterator#getKeyValue()
- RocksIterator#next()
- return keyvalue entry
- return
- return
- return outerkeyvalue
- return
- return
- DelegatingPeekingKeyValueIterator#next()
Call trace 4: ReadOnlyKeyValueStore#all()
- CompositeReadOnlyKeyValueStore#all() (v)
- WrappingStoreProvider#stores() (v)
- StreamThreadStateStoreProvider#stores() (v)
- return new DelegatingPeekingKeyValueIterator
- DelegatingPeekingKeyValueIterator#hasNext() (v)
- CompositKeyValueIterator#hasNext()
- NextIteratorFunction#apply() (v)
- MeteredKeyValueBytesStore#all()
- InnerMeteredKeyValueStore#all()
CachingKeyValueStore#all()- AbstractStateStore#validateStoreOpen() (v)
- ChangeLoggingKeyValueBytesStore#all()
- RocksDBStore#all()
- RocksDBStore#validateStoreOpen() (v)
- return new RocksDBIterator()
- return
- return new MergedSortedCacheKeyValueBytesStoreIterator()
- return new MeteredKeyValueIterator()
- return
- return
- return
- CompositKeyValueIterator#next()
- MeteredKeyValueIterator#next()
- MergedSortedCacheKeyValueBytesStoreIterator#next()
AbstractMergedSortedCacheStoreIterator#next()- MemoryLRUCacheBytesIterator.hasNext()
- DelegatingPeekingKeyValueIterator.hasNext() (v)
- AbstractMergedSortedCacheStoreIterator#nextStoreValue()
- DelegatingPeekingKeyValueIterator#next()
- DelegatingPeekingKeyValueIterator#hasNext() (v)
- return
- return
- return outerkeyvalue
- return
- return
- DelegatingPeekingKeyValueIterator#next()
Call trace 5: ReadOnlyKeyValueStore#approximateNumEntries()
- CompositeReadOnlyKeyValueStore#approximateNumEntries() (v)
- WrappingStoreProvider#stores() (v)
- StreamThreadStateStoreProvider#stores() (v)
- MeteredKeyValueBytesStore#approximateNumEntries()
- InnerMeteredKeyValueStore#approximateNumEntries()
- CachingKeyValueStore#approximateNumEntries()
- AbstractStateStore#validateStoreOpen() (v)
- RocksDBStore#approximateNumEntries()
- RocksDBStore#validateStoreOpen() (v)
- return value
- return
- return
- return
- return total
Call trace 6: ReadOnlySessionStore#fetch(key)
- CompositeReadOnlySessionStore#fetch(key) (v)
- WrappingStoreProvider#stores() (v)
- StreamThreadStateStoreProvider#stores() (v)
- MeteredSessionStore#fetch(key)
- MeteredSessionStore#findSessions()
- CachingSessionStore#findSessions()
- AbstractStateStore#validateStoreOpen() (v)
- ChangeLoggingSessionBytesStore#findSessions()
- RocksDBSessionStore.findSessions(k)
- RocksDBSessionStore.findSessions(from, to)
- RocksDBSegmentedBytesStore#fetch()
- SessionKeySchema#segmentsToSearch()
- Segments#segments() (v)
- Segments#getSegment()
- ConcurrentHashMap#get()
- Segments#isSegment()
- return segment
- retiurn segments
- return
- return new SegmentIterator()
- return new WrappedSessionStoreIterator()
- return
- return
- return new MergedSortedCacheSessionStoreIterator()
- return new MeteredWindowedKeyValueIterator()
- return
- MeteredWindowedKeyValueIterator#hasNext()
- MergedSortedCacheSessionStoreIterator#hasNext()
AbstraceMergedSortedCacheStoreIterator#hasNext()- FilteredCacheIterator#hasNext()
- WrappedSessionStoreIterator#hasNext()
- SegmentIterator#hasNext()
- Segment.range(from, to)
RocksDBStore.range(from, to)- RocksDBStore.validateStoreOpen() (v)
- return new RocksDBRangeIterator()
- return
- return
- return
- return iterator(MeteredWindowedKeyValueIterator)
- MeteredWindowedKeyValueIterator#next()
- MergedSortedCacheSessionStoreIterator#next()
AbstractMergedSortedCacheStoreIterator#next()- AbstractMergedSortedCacheStoreIterator#hasNext()
- FilteredCacheIterator#hasNext()
- WrappedSessionStoreIterator#hasNext()
- SegmentIterator#hasNext()
- Segment.range(from, to)
RocksDBStore.range(from, to)- RocksDBStore.validateStoreOpen() (v)
- return new RocksDBRangeIterator()
- return
- return
- MergedSortedCacheSessionStoreIterator#nextStoreValue()
AbstractMergedSortedCacheStoreIterator#nextStoreValue()
- WrappedSessionStoreIterator#next()
- SegmentIterator#next()
- RocksDBRangeIterator#next()
RocksDbIterator#next()- RocksDbIterator#getKeyValue()
- RocksIterator#next()
- return entry
- return
- return
- return
- return
- return
Call trace 7: ReadOnlySessionStore#fetch(from, to)
- CompositeReadOnlySessionStore#fetch(from, to) (v)
- WrappingStoreProvider#stores() (v)
- StreamThreadStateStoreProvider#stores() (v)
- return new DelegatingPeekingKeyValueIterator<>()
- DelegatingPeekingKeyValueIterator#hasNext() (v)
- CompositKeyValueIterator#hasNext()
- NextIteratorFunction#apply(store)
- MeteredSessionStore#fetch(from, to)
- MeteredSessionStore#findSession(from, to, 0, t)
- CachingSessionStore#findSession(from, to, 0, t)
- CachingSessionStore#validStoreOpen()
AbstractStateStore#validStoreOpen() (v)
- ChangeLoggingSessionBytesStore#isOpen()
- RocksDBSessionStore#isOpen()
AbstractStateStore#isOpen()
- RocksDBSegmentedBytesStore#isOpen()
- return
- return
- return
- ChangeLoggingSessionBytesStore#findSesisons()
- RocksDBSessionStore#findSessions()
- RocksDBSegmentedBytesStore#fetch()
- SessionKeySchema#segmentsToSearch()
- Segments#segments() (v)
- return new SegmentIterator()
- return new WrappedSessionStoreIterator()
- return
- return
- return new MergedSortedCacheSessionStoreIterator()
- return MeteredWindowedKeyValueIterator()
- return
- return
- MeteredWindowedKeyValueIterator#hasNext()
- MergedSortedCacheSessionStoreIterator#hasNext()
AbstractMergedSortedCacheStoreIterator#hasNext()
- FilteredCacheIterator#hasNext()
- WrappedSessionStoreIterator#hasNext()
- SegmentIterator#hasNext()
- Segment.range(from, to)
RocksDBStore.range(from, to)
- RocksDBStore.validateStoreOpen() (v)
- return new RocksDBRangeIterator()
- return
- return
- return
- return
- return
- CompositeKeyValueIterator#next()
- return
- DelegatingPeekingKeyValueIterator#next()
Call trace 8: ReadOnlyWindowStore#fetch(key)
- CompositeReadOnlySessionStore#fetch(key) (v)
- WrappingStoreProvider#stores() (v)
- StreamThreadStateStoreProvider#stores() (v)
- MeteredWindowStore#fetch()
- CachingWindowStore#fetch(k, tf, tt)
- AbstractStateStore#validateStoreOpen()
- ChangeLoggingWindowBytesStore#isOpen()
- AbstractStateStore#isOpen()
- RocksDBWindowBytesStore#isOpen()
- RocksDBSegmentedBytesStore#isOpen()
- return
- return
- return
- return
- ChangeLoggingWindowBytesStore#fetch()
- RocksDBWindowStoreBytesStore#fetch()
- RocksDBSegmentedBytesStore#fetch()
- WindowKeySchema#segmentsToSearch()
- Segments#segments()
- RocksDBStore#isOpen()
- return segments
- return
- return new SegmentIterator()
- WindowStoreIteratorWrapper.bytesIterator()
- return new WrappedWindowStoreBytesIterator()
- return
- return
- ThreadCache#range()
- return new MemoryLRUCacheBytesIterator
- return new MergedSortedCacheWindowStoreIterator
- return new MeteredWindowStoreIterator
- MeteredWindowStoreIterator#hasNext()
AbstractMergedSortedCacheStoreIterator#hasNext()- WrappedWindowStoreIterator#hasNext()
- SegmentIterator#hasNext()
- Segment#range()
RocksDBStore#range()- RocksDBStore#validateStoreOpen()
- return RocksDBRangeIterator
- return
- return
- return
- return
- MeteredWindowStoreIterator#hasNext()
- MeteredSortedCacheWindowStoreIterator#hasNext()
AbstractMergedSortedCacheStoreIterator#hasNext()- WrappedWindowStoreIterator#hasNext()
- SegmentIterator#hasNext()
- Segment#range()
RocksDBStore#range()- RocksDBStore#validateStoreOpen() (v)
- return RocksDBRangeIterator
- return
- return
- return
- return
- MeteredWindowStoreIterator#next()
- MergedSortedCacheWindowStoreIterator#next()
AbstractMergedSortedCacheStoreIterator#next()- WrappedWindowStoreBytesIterator#hasNext()
- SegmentIterator#hasNext()
- return
- AbstractMergedSortedCacheStoreIterator#nextStoreValue()
- WrappedWindowStoreBytesIterator#next()
- SegmentIterator#next()
- SegmentIterator#hasNext()
- RocksDBRangeIterator#next()
- RocksDBRangeIterator#hasNext()
- RocksDBIterator#hasNext() (v)
- return
- RocksIterator#next()
- return entry
- return
- return keyvalue
- return
- return
- return keyvalue
Call trace 9: ReadOnlyWindowStore#fetch(from, to)
- CompositeReadOnlyWindowStore#fetch(from, to)
- WrappingStoreProvider#stores() (v)
- StreamThreadStateStoreProvider#stores() (v)
- return
- return new DelegatingPeekingKeyValueIterator()
- DelegatingPeekingKeyValueIterator#hasNext() (v)
- CompositeKeyValueIterator#hasNext()
- NextIteratorFunciton#apply()
- MeteredWindowStore#fetch()
- CachingWindowStore#fetch()
- AbstractStateStore#validateStoreOpen() (v)
- ChangeLoggingWindowBytesStore#fetch()
- RocksDBWindowBytesStore#fetch()
- RocksDBSegmentedBytesStore#fetch()
- WindowKeySchema#segmentsToSearch()
- Segments#segments() (v)
- return
- return SegmentIterator
- return keyvalueIterator
- return
- ThreadCache.range()
- return new MemoryLRUCacheBytesIterator
- WindowKeySchema#hasNextCondition()
- return new MergedSortedCacheWindowStoreKeyValueIterator()
- return MeteredWindowKeyValueIterator()
- return
- MeteredWindowedKeyValueIterator#hasNext()
- MergedSortedCacheWindowStoreKeyValueIterator#hasNext()
AbstractMergedSortedCacheStoreIterator
- WrappedWindowStoreBytesIterator#hasNext()
WrappedKeyValueIterator#hasNext()
- SegementIterator#hasNext()
- Segment#range()
RocksDBStore#range()- RocksDBStore#validateStoreOpen() (v)
- return RocksDBRangeIterator
- return
- return
- return
- return
- CompositeKeyValueIterator#next()
- MeteredWindowedKeyValueIterator#next()
- MergedSortedCacheWindowStoreKeyValueIterator#next()
AbstractMergedSortedCacheStoreIterator#next()
- AbstractMergedSortedCacheStoreIterator#hasNext()
- AbstractMergedSortedCacheStoreIterator#nextStoreValue()
- WrappedWindowStoreBytesIterator#next()
- SegmentIteator#hasNext()
- SegmentIterator#next()
- SegmentIterator#hasNext() (v)
- RocksDBRangeIterator#next()
RocksDbIterator#next()- RocksDbIterator#hasNext()
- RocksIterator#next()
- return entry
- return
- return keyvalue
- return
- return keyvalue
- return
- return
- return
- DelegatingPeekingKeyValueIterator#next()
- DelegatingPeekingKeyValueIterator#hasNext()
- return
Call trace 10: ReadOnlyWindowStore#all()
- CompositeReadOnlyWindowStore#all()
- WrappingStoreProvider#stores() (v)
- StreamThreadStateStoreProvider#stores() (v)
- return
- return new DelegatingPeekingKeyValueIterator()
- DelegatingPeekingKeyValueIterator#hasNext() (v)
- CompositeKeyValueIterator#hasNext()
- NextIteratorFunciton#apply()
- MeteredWindowStore#all()
- CachingWindowStore#all()
- AbstractStateStore#validateStoreOpen() (v)
- ChangeLoggingWindowBytesStore#all()
- RocksDBWindowBytesStore#all()
- RocksDBSegmentedBytesStore#all()
- Segments#allSegments() (v)
- return new SegmentIterator()
- return keyValueIterator
- return
- ThreadCache#all()
- return new MemoryLRUCacheBytesIterator
- return new MergedSortedCacheWindowStoreKeyValueIterator
- return new MeteredWindowedKeyValueIterator()
- return
- MeteredWindowedKeyValueIterator#hasNext()
- MergedSortedCacheWindowStoreKeyValueIterator#hasNext()
AbstractMergedSortedCacheStoreIterator#hasNext()
- WrappedKeyValueIterator#hasNext()
- SegmentIterator#hasNext() (v)
- return
- return
- return
- return
- CompositeKeyValueIterator#next()
- MeteredWindowedKeyValueIterator#next()
- MergedSortedCacheWindowStoreKeyValueIterator#next()
AbstractMergedSortedCacheStoreIterator#next()
- WrappedKeyValueIterator#hasNext()
- SegmentIterator#hasNext()
- AbstractMergedSortedCacheStoreIterator#nextStoreValue()
- WrappedKeyValueIterator#next()
- SegmentIterator#next()
- RocksDbIterator#next()
- RocksDbIterator#hasNext() (v)
- RocksIterator.next()
- return entry
- return
- return keyvalue
- return
- return
- return keyvalue
- return
- return
- DelegatingPeekingKeyValueIterator#next()
- DelegatingPeekingKeyValueIterator#hasNext()
- return
Call trace 11: ReadOnlyWindowStore#fetchAll()
- CompositeReadOnlyWindowStore#fetchAll()
- WrappingStoreProvider#stores() (v)
- StreamThreadStateStoreProvider#stores() (v)
- return
- return new DelegatingPeekingKeyValueIterator()
- DelegatingPeekingKeyValueIterator#hasNext() (v)
- CompositeKeyValueIterator#hasNext()
- NextIteratorFunciton#apply()
- MeteredWindowStore#fetchAll()
- CachingWindowStore#fetchAll()
- AbstractStateStore#validateStoreOpen() (v)
- ChangeLoggingWindowBytesStore#fetchAll()
- RocksDBWindowBytesStore#fetchAll()
- RocksDBSegmentedBytesStore#fetchAll()
- Segments#allSegments() (v)
- return new SegmentIterator()
- return keyValueIterator
- return
- ThreadCache#all()
- return new MemoryLRUCacheBytesIterator
- return new MergedSortedCacheWindowStoreKeyValueIterator
- return new MeteredWindowedKeyValueIterator()
- return
- MeteredWindowedKeyValueIterator#hasNext()
- MergedSortedCacheWindowStoreKeyValueIterator#hasNext()
AbstractMergedSortedCacheStoreIterator#hasNext()
- WrappedKeyValueIterator#hasNext()
- SegmentIterator#hasNext() (v)
- return
- return
- return
- return
- CompositeKeyValueIterator#next()
- MeteredWindowedKeyValueIterator#next()
- MergedSortedCacheWindowStoreKeyValueIterator#next()
AbstractMergedSortedCacheStoreIterator#next()
- WrappedKeyValueIterator#hasNext()
- SegmentIterator#hasNext() (v)
- return
- AbstractMergedSortedCacheStoreIterator#nextStoreValue()
- WrappedKeyValueIterator#next()
- SegmentIterator#next()
- RocksDbIterator#next()
- RocksDbIterator#hasNext() (v)
- RocksIterator.next()
- return entry
- return
- return keyvalue
- return
- return
- return keyvalue
- return
- return
- DelegatingPeekingKeyValueIterator#next()
- DelegatingPeekingKeyValueIterator#hasNext()
- return
Compatibility, Deprecation, and Migration Plan
- All new exceptions extend from InvalidStateStoreException, this change will be fully backward compatible.
Rejected Alternatives
None.
Text-to-speech function is limited to 200 characters