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 - retryable
public class StreamThreadNotStartedException extends InvalidStateStoreException
public class StreamThreadRebalancingException extends InvalidStateStoreException
public class StateStoreMigratedException extends InvalidStateStoreException
# Throw to user exception - not retryable
public class StreamThreadNotRunningException extends InvalidStateStoreException
public class StateStoreFailedException extends InvalidStateStoreException
# Internal exception
public class StateStoreIsEmptyException extends InvalidStateStoreException
public class StateStoreClosedException extends InvalidStateStoreException
- StateStoreClosedException: There will be throw StateStoreClosedException when state store is not open. This is an internal exception and will be wrapped to StateStoreMigratedException or StateStoreFailedException later.
- StateStoreIsEmptyException: will be thrown when state store cannot be found in all StateStoreProviders. This is an internal exception, and will be wrapped to StateStoreMigratedException or StateStoreFailedException later.
- StreamThreadNotRunningException: will be thrown when stream thread is not running and stream state is PENDING_SHUTDOWN /
NOT_RUNNING / ERROR. The user cannot retry when this exception is thrown. - StreamThreadNotStartedException: will be thrown when stream thread is not running and stream state is CREATED, the user can retry until to RUNNING.
- StreamThreadRebalancingException: will be thrown when stream thread is not running and stream state is REBALANCING, the user just retry and wait until rebalance finished(RUNNING).
- StateStoreMigratedException: A wrapper for StateStoreClosedException / StateStoreIsEmptyException. Will be thrown when stream thread is RUNNING/REBALANCING. The user need to rediscover the state store.
- StateStoreFailedException: A wrapper for StateStoreClosedException/StateStoreIsEmptyException. Will be thrown when stream thread is PENDING_SHUTDOWN / NOT_RUNNING / ERROR. The user cannot retry when this exception is thrown.
The interface QueryableStoreType will append a new method, this can be assign KafkaStreams instance to all ComposeReadOnlyXXXXStore instance.
public interface QueryableStoreType<T> {
void setStreams(final KafkaStreams kafkaStreams);
}
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()
}
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