To add to what Matthias said, in case the following isn't clear:

- You should not (and, in 0.10.2, cannot any longer) call the iterator's
remove() method, i.e. `KeyValueIterator#remove()` when iterating through a
`KeyValueStore`.  Perhaps this is something we should add to the
`KeyValueIterator` javadocs.

- You can of course call the store's delete() method:
`KeyValueStore#delete(K key)`.

Just mentioning this because, when reading the thread quickly, I missed the
"iterator" part and thought removal/deletion on the store wasn't working.
;-)

Best,
Michael




On Wed, Mar 22, 2017 at 8:18 PM, Matthias J. Sax <matth...@confluent.io>
wrote:

> Hi,
>
> remove() should not be supported -- thus, it's actually a bug in 0.10.1
> that got fixed in 0.10.2.
>
> Stores should only be altered by Streams and iterator over the stores
> should be read-only -- otherwise, you might mess up Streams internal state.
>
> I would highly recommend to reconsider the call to it.remove() in you
> application. Not sure what you try to accomplish, but you should do it
> differently.
>
>
> -Matthias
>
>
> On 3/22/17 8:00 AM, Tom Dearman wrote:
> > Hi, hope someone on kafka-streams team can help.  Our application uses
> >
> > KeyValueIterator it = KeyValueStore.all();
> >
> > …..
> > it.remove()
> >
> >
> > This used to work but is now broken, causes our punctuate to fail and
> StreamThread to die.  The cause seems to be that there were changes in
> 0.10.2.0 to InMemoryKeyValueStoreSupplier:
> >
> >
> >
> > public synchronized KeyValueIterator<K, V> all() {
> >     final TreeMap<K, V> copy = new TreeMap<>(this.map);
> >     return new MemoryStoreIterator<>(copy.entrySet().iterator());
> > }
> >
> > @Override
> > public synchronized KeyValueIterator<K, V> all() {
> >     final TreeMap<K, V> copy = new TreeMap<>(this.map);
> >     return new DelegatingPeekingKeyValueIterator<>(name, new
> MemoryStoreIterator<>(copy.entrySet().iterator()));
> > }
> > But the DelegatingPeekingKeyValueIterator has:
> >
> > @Override
> > public void remove() {
> >     throw new UnsupportedOperationException("remove not supported");
> > }
> > whereas the old direct call on MemoryStoreIterator allowed remove.  For
> some reason there is no call to underlying.remove() in the
> DelegatingPeekingKeyValueIterator.
> >
> > We don’t want to downgrade to 0.10.1.1 as there was a useful bug fix and
> removing dependancy on zookeeper.
> >
> > Thanks,
> > Tom
> >
>
>

Reply via email to