Description
CassandraCacheStore.loadCache() method starts a generic thread pool for parallel data load. Threads in this thread pool can't deserialize Ignite internal objects (e.g. IgniteKernal) which can cause unexpected behavior. Here is one of the scenarios:
- There is column in Cassandra which stores an object as BLOB using JavaSerializer.
- CacheConfiguration.storeKeepBinary is true.
- When an object is saved, it's passed to the store as an instance of BinaryObject which is converted to a byte array and saved in Cassandra.
- When the same object is loaded in loadCache, the store takes the byte array and tries to convert it to BinaryObject. But it can't because this implies calling IgnitionEx.localIgnite() from non-Ignite thread.
To fix this we need to provide a thread factory that will create instances of IgniteThread and use it in the pool that loads the data.
Most likely the same issue exists in CacheAbstractJdbcStore.
And in general, any threads created by Ignite internals should be IgniteThread-s. This should be revisited.
Attachments
Issue Links
- is part of
-
IGNITE-1371 Key-Value store (like Cassandra) as CacheStore
- Closed
- links to