You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Ilya Kasnacheev (JIRA)" <ji...@apache.org> on 2019/03/12 15:19:00 UTC
[jira] [Commented] (IGNITE-11523) Can't cast null value from
Cassandra table primitive column to primitive value used in domain object
model
[ https://issues.apache.org/jira/browse/IGNITE-11523?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16790646#comment-16790646 ]
Ilya Kasnacheev commented on IGNITE-11523:
------------------------------------------
[~irudyak] can you look into it?
> Can't cast null value from Cassandra table primitive column to primitive value used in domain object model
> ----------------------------------------------------------------------------------------------------------
>
> Key: IGNITE-11523
> URL: https://issues.apache.org/jira/browse/IGNITE-11523
> Project: Ignite
> Issue Type: Bug
> Components: cache, cassandra
> Affects Versions: 2.7
> Reporter: Xinmin Wang
> Priority: Major
>
> *Issue*
> Adding new primitive type columns to the existing tables which have data existed in
> Cassandra causes Ignite to raise an exception (see below) in Ignite 2.7.0 or
> 2.8.0 nightly build when loading the data from Cassandra into Ignite Cache
> store. This works before Ignite 2.6, and even apache-ignite-fabric-2.7.0.20180918 nightly build.
> The assumption seems not correct because both Ignite and Cassandra are (key, value) store. In fact, SQLLINE tool, we don't need to insert into primitive value, see the example blow -
> CREATE TABLE aa (col1 int PRIMARY KEY, col2 double );
> INSERT INTO aa(col1) VALUES (1);
> SELECT * FROM aa;
> *Root Cause*
> This issue is related to the implementation of public static Object getCassandraColumnValue(Row row, String col, Class clazz, Serializer serializer) in PropertyMappingHelper.java ([https://github.com/apache/ignite/blob/master/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/common/PropertyMappingHelper.java]). This class has been changed since 2.7.0. For primitive java type, I don't think we need to check null value. The assumption is that every row for primitive types in Cassandra table must have value is not correct.
> {panel:title=getCassandraColumnValue(Row row, String col, Class clazz, Serializer serializer)}
> public static Object getCassandraColumnValue(Row row, String col, Class clazz, Serializer serializer) {
> ...
> if (Long.class.equals(clazz))
> return row.isNull(col) ? null : row.getLong(col);
> // why needs to check the primitive null. NoSql is a pair of (key, value).
> // there is no pair in this case
> // all databases (relational databases and NoSql databases support null colum values)
> if (long.class.equals(clazz)) {
> if (row.isNull(col)) {
> throw new IllegalArgumentException("Can't cast null value from Cassandra table column '" + col +
> "' to " + "long value used in domain object model");
> }
> return row.getLong(col);
> }
> }
> {panel}
>
> *Detailed Exception*
> [2019-03-11
> 09:44:34,352][ERROR][cassandra-cache-loader-#61%ignite-procurant-purchase-order-cluster%][CassandraCacheStore]
> Failed to build Ignite value object from provided Cassandra row
> java.lang.IllegalArgumentException: Can't cast null value from Cassandra
> table column 'suppliertotamt' to double value used in domain object model
> at
> org.apache.ignite.cache.store.cassandra.common.PropertyMappingHelper.getCassandraColumnValue(PropertyMappingHelper.java:169)
> at
> org.apache.ignite.cache.store.cassandra.persistence.PojoField.setValueFromRow(PojoField.java:205)
> at
> org.apache.ignite.cache.store.cassandra.persistence.PersistenceController.buildObject(PersistenceController.java:405)
> at
> org.apache.ignite.cache.store.cassandra.persistence.PersistenceController.buildValueObject(PersistenceController.java:227)
> at
> org.apache.ignite.cache.store.cassandra.session.LoadCacheCustomQueryWorker$1.process(LoadCacheCustomQueryWorker.java:107)
> at
> org.apache.ignite.cache.store.cassandra.session.CassandraSessionImpl.execute(CassandraSessionImpl.java:402)
> at
> org.apache.ignite.cache.store.cassandra.session.LoadCacheCustomQueryWorker.call(LoadCacheCustomQueryWorker.java:81)
> at
> org.apache.ignite.cache.store.cassandra.session.LoadCacheCustomQueryWorker.call(LoadCacheCustomQueryWorker.java:35)
> at java.util.concurrent.FutureTask.run(FutureTask.java:266)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at java.lang.Thread.run(Thread.java:748)
> [2019-03-11
> 09:44:34,360][ERROR][cassandra-cache-loader-#61%ignite-procurant-purchase-order-cluster%][CassandraCacheStore]
> Failed to execute Cassandra loadCache operation
> class org.apache.ignite.IgniteException: Failed to execute Cassandra
> loadCache operation
> at
> org.apache.ignite.cache.store.cassandra.session.CassandraSessionImpl.execute(CassandraSessionImpl.java:415)
> at
> org.apache.ignite.cache.store.cassandra.session.LoadCacheCustomQueryWorker.call(LoadCacheCustomQueryWorker.java:81)
> at
> org.apache.ignite.cache.store.cassandra.session.LoadCacheCustomQueryWorker.call(LoadCacheCustomQueryWorker.java:35)
> at java.util.concurrent.FutureTask.run(FutureTask.java:266)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at java.lang.Thread.run(Thread.java:748)
> Caused by: class org.apache.ignite.IgniteException: Failed to build Ignite
> value object from provided Cassandra row
> at
> org.apache.ignite.cache.store.cassandra.session.LoadCacheCustomQueryWorker$1.process(LoadCacheCustomQueryWorker.java:112)
> at
> org.apache.ignite.cache.store.cassandra.session.CassandraSessionImpl.execute(CassandraSessionImpl.java:402)
> ... 6 more
> Caused by: java.lang.IllegalArgumentException: Can't cast null value from
> Cassandra table column 'suppliertotamt' to double value used in domain
> object model
> at
> org.apache.ignite.cache.store.cassandra.common.PropertyMappingHelper.getCassandraColumnValue(PropertyMappingHelper.java:169)
> at
> org.apache.ignite.cache.store.cassandra.persistence.PojoField.setValueFromRow(PojoField.java:205)
> at
> org.apache.ignite.cache.store.cassandra.persistence.PersistenceController.buildObject(PersistenceController.java:405)
> at
> org.apache.ignite.cache.store.cassandra.persistence.PersistenceController.buildValueObject(PersistenceController.java:227)
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)