[
https://issues.apache.org/jira/browse/FLINK-8411?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16362843#comment-16362843
]
Bowen Li commented on FLINK-8411:
---------------------------------
[~aljoscha]
For the 1st functionality, isn't [the PR of this
ticket|https://github.com/apache/flink/pull/5300] merged into 1.5.0 already? If
not, I think we can just rebase any other changes to it.
For the 2nd functionality, supporting {{null}} doesn't feel right logically...
with my own experience, allowing null to be added will hide even more user
bugs. BTW, how to represent {{null}} in RocksDBListState? Is it going to be a
special char to represent {{null}} in serialization, and handle it specially in
deserialization?
Please feel free to implement it yourself to save time from back-and-forth
communication and code review.
> HeapListState#add(null) will wipe out entire list state
> -------------------------------------------------------
>
> Key: FLINK-8411
> URL: https://issues.apache.org/jira/browse/FLINK-8411
> Project: Flink
> Issue Type: Improvement
> Components: State Backends, Checkpointing
> Affects Versions: 1.4.0
> Reporter: Bowen Li
> Assignee: Bowen Li
> Priority: Blocker
> Fix For: 1.5.0
>
>
> You can see that {{HeapListState#add(null)}} will result in the whole state
> being cleared or wiped out. There's never a unit test for {{List#add(null)}}
> in {{StateBackendTestBase}}
> {code:java}
> // HeapListState
> @Override
> public void add(V value) {
> final N namespace = currentNamespace;
> if (value == null) {
> clear();
> return;
> }
> final StateTable<K, N, ArrayList<V>> map = stateTable;
> ArrayList<V> list = map.get(namespace);
> if (list == null) {
> list = new ArrayList<>();
> map.put(namespace, list);
> }
> list.add(value);
> }
> {code}
> {code:java}
> // RocksDBListState
> @Override
> public void add(V value) throws IOException {
> try {
> writeCurrentKeyWithGroupAndNamespace();
> byte[] key = keySerializationStream.toByteArray();
> keySerializationStream.reset();
> DataOutputViewStreamWrapper out = new
> DataOutputViewStreamWrapper(keySerializationStream);
> valueSerializer.serialize(value, out);
> backend.db.merge(columnFamily, writeOptions, key,
> keySerializationStream.toByteArray());
> } catch (Exception e) {
> throw new RuntimeException("Error while adding data to
> RocksDB", e);
> }
> }
> {code}
> The fix should correct the behavior to be consistent between the two state
> backends, as well as adding a unit test for {{ListState#add(null)}}. For the
> correct behavior, I believe adding null with {{add(null)}} should simply be
> ignored without any consequences.
> cc [~srichter]
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)