Hi,

What I was trying to accomplish was the normal usage of the iterator
interface to enable safe remove while iterating over a collection. I
have used iterator.remove since kafka streams was released, so this
has been the real functionality since release and in the absence of
documentation to say otherwise feels like a bug has been introduced
now.  If KeyValueStore#delete doesn't mess up the internal state
during the single threaded access to the store I'm not sure why
iterator.remove would.j
Having said that, I will save the keys for removal during iteration
and delete after.

Thanks for you help.

Tom

On 22 March 2017 at 19:34, Michael Noll <mich...@confluent.io> wrote:
> 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