[
https://issues.apache.org/jira/browse/KAFKA-4750?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16061898#comment-16061898
]
Evgeny Veretennikov commented on KAFKA-4750:
--------------------------------------------
[~mjsax], are you sure about call chain in {{RocksDBStore}}? Actually it is
{{delete(key) -> put(key, null) -> putInternal(serdes.rawKey(key),
serdes.rawValue(value)}}. Check {{RocksDBStore.put()}} method:
{code:java}
public synchronized void put(K key, V value) {
Objects.requireNonNull(key, "key cannot be null");
validateStoreOpen();
byte[] rawKey = serdes.rawKey(key);
byte[] rawValue = serdes.rawValue(value);
putInternal(rawKey, rawValue);
}
{code}
So, {{delete()}} doesn't actually delete key-value pair if
{{serdes.rawValue(null)}} doesn't return {{null}}.
For example, look at attached test. Here store uses custom serde, which
serializes null into not-null value {{"123".getBytes()}}. Test fails with
current {{RocksDBStore.delete()}} implementation and succeeds with such change:
{noformat}
---
a/streams/src/main/java/org/apache/kafka/streams/state/internals/RocksDBStore.java
+++
b/streams/src/main/java/org/apache/kafka/streams/state/internals/RocksDBStore.java
@@ -301,7 +301,9 @@ public class RocksDBStore<K, V> implements KeyValueStore<K,
V> {
public synchronized V delete(K key) {
Objects.requireNonNull(key, "key cannot be null");
V value = get(key);
- put(key, null);
+ validateStoreOpen();
+ byte[] rawKey = serdes.rawKey(key);
+ putInternal(rawKey, null);
return value;
}
{noformat}
Though, in {{ChangeLoggingKeyValueBytesStore}} this problem really doesn't
appear, that was my mistake.
> KeyValueIterator returns null values
> ------------------------------------
>
> Key: KAFKA-4750
> URL: https://issues.apache.org/jira/browse/KAFKA-4750
> Project: Kafka
> Issue Type: Bug
> Components: streams
> Affects Versions: 0.10.1.1, 0.11.0.0, 0.10.2.1
> Reporter: Michal Borowiecki
> Assignee: Evgeny Veretennikov
> Labels: newbie
>
> The API for ReadOnlyKeyValueStore.range method promises the returned iterator
> will not return null values. However, after upgrading from 0.10.0.0 to
> 0.10.1.1 we found null values are returned causing NPEs on our side.
> I found this happens after removing entries from the store and I found
> resemblance to SAMZA-94 defect. The problem seems to be as it was there, when
> deleting entries and having a serializer that does not return null when null
> is passed in, the state store doesn't actually delete that key/value pair but
> the iterator will return null value for that key.
> When I modified our serilizer to return null when null is passed in, the
> problem went away. However, I believe this should be fixed in kafka streams,
> perhaps with a similar approach as SAMZA-94.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)