SAMZA-1370; Memory leak in CachedStore when using ByteBufferSerde as key Serde
authorPrateek Maheshwari <pmaheshw@linkedin.com>
Thu, 27 Jul 2017 22:10:43 +0000 (15:10 -0700)
committerJagadish <jagadish@apache.org>
Thu, 27 Jul 2017 22:10:43 +0000 (15:10 -0700)
commitc27a253283bbc09e82c4e9d669bf54d1460c5299
treeb72bcf9512770daed03e30b77ad6f357f2bc9119
parentd32e8bb3a64db5ffdcded3b299e10755e8679e0f
SAMZA-1370; Memory leak in CachedStore when using ByteBufferSerde as key Serde

ByteBufferSerde uses relative bulk get to serialize the provided ByteBuffer which changes its internal position. ByteBuffer's `equals` and `hashCode` depend upon its remaining elements, i.e. on its position. This means that when using ByteBuffers as keys in the CachedStore, flushing cache contents to the underlying store changes their hashCode. Since the hashCode for the key no longer matches the one used when inserting it into the map, the LinkedHashMap cannot correctly evict or remove these entries, leading to a memory leak.

Changing ByteBufferSerde to duplicate the provided ByteBuffer before copying should fix this issue. Prefer this over using absolute gets since there's no bulk absolute get API for ByteBuffer.

Author: Prateek Maheshwari <pmaheshw@linkedin.com>

Reviewers: Jagadish <jagadish@apache.org>

Closes #251 from prateekm/bytebufferserde
docs/learn/documentation/versioned/jobs/configuration-table.html
samza-core/src/main/scala/org/apache/samza/serializers/ByteBufferSerde.scala
samza-core/src/test/scala/org/apache/samza/serializers/TestByteBufferSerde.scala