[ https://issues.apache.org/jira/browse/CASSANDRA-11988?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15331441#comment-15331441 ]
Marek edited comment on CASSANDRA-11988 at 6/15/16 9:30 AM: ------------------------------------------------------------ Some more details to identify issue in 3.0.7: - it happens only with static column - it might be related to setting null to static column value - I identified that org.apache.cassandra.db.ReadCommand$1WithoutPurgeableTombstones transformation returns null in org.apache.cassandra.db.transform.BaseRows.add(...) method so staticRow is set to null - There can be also some data corruption because we lost at least one partition row after it happened Here is naive fix to mitigate this issue: {code} diff --git a/src/java/org/apache/cassandra/db/transform/BaseRows.java b/src/java/org/apache/cassandra/db/transform/BaseRows.java index 78526e8..bc92b41 100644 --- a/src/java/org/apache/cassandra/db/transform/BaseRows.java +++ b/src/java/org/apache/cassandra/db/transform/BaseRows.java @@ -1,17 +1,24 @@ package org.apache.cassandra.db.transform; +import static org.apache.cassandra.utils.Throwables.merge; + import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.PartitionColumns; -import org.apache.cassandra.db.rows.*; - -import static org.apache.cassandra.utils.Throwables.merge; +import org.apache.cassandra.db.rows.BaseRowIterator; +import org.apache.cassandra.db.rows.RangeTombstoneMarker; +import org.apache.cassandra.db.rows.Row; +import org.apache.cassandra.db.rows.Unfiltered; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public abstract class BaseRows<R extends Unfiltered, I extends BaseRowIterator<? extends Unfiltered>> extends BaseIterator<Unfiltered, I, R> implements BaseRowIterator<R> { + private static final Logger logger = LoggerFactory.getLogger(BaseRows.class); + private Row staticRow; public BaseRows(I input) @@ -82,7 +89,14 @@ implements BaseRowIterator<R> super.add(transformation); // transform any existing data - staticRow = transformation.applyToStatic(staticRow); + final Row afterTransform = transformation.applyToStatic(staticRow); + + if (staticRow != null && afterTransform == null) + logger.debug("Transformation returns NULL value : " + transformation); + + if (afterTransform != null) + staticRow = afterTransform; + next = applyOne(next, transformation); } diff --git a/src/java/org/apache/cassandra/db/transform/UnfilteredRows.java b/src/java/org/apache/cassandra/db/transform/UnfilteredRows.java index 98640ae..e497bef 100644 --- a/src/java/org/apache/cassandra/db/transform/UnfilteredRows.java +++ b/src/java/org/apache/cassandra/db/transform/UnfilteredRows.java @@ -35,6 +35,9 @@ final class UnfilteredRows extends BaseRows<Unfiltered, UnfilteredRowIterator> i @Override public boolean isEmpty() { + if (staticRow() == null) + return true; + return staticRow().isEmpty() && partitionLevelDeletion().isLive() && !hasNext(); } } {code} was (Author: marekasf): Some more details to identify issue: - it happens only with static column - it might be related to setting null to static column value - I identified that org.apache.cassandra.db.ReadCommand$1WithoutPurgeableTombstones transformation returns null in org.apache.cassandra.db.transform.BaseRows.add(...) method so staticRow is set to null - There can be also some data corruption because we lost at least one partition row after it happened Here is naive fix to mitigate this issue: {code} diff --git a/src/java/org/apache/cassandra/db/transform/BaseRows.java b/src/java/org/apache/cassandra/db/transform/BaseRows.java index 78526e8..bc92b41 100644 --- a/src/java/org/apache/cassandra/db/transform/BaseRows.java +++ b/src/java/org/apache/cassandra/db/transform/BaseRows.java @@ -1,17 +1,24 @@ package org.apache.cassandra.db.transform; +import static org.apache.cassandra.utils.Throwables.merge; + import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.PartitionColumns; -import org.apache.cassandra.db.rows.*; - -import static org.apache.cassandra.utils.Throwables.merge; +import org.apache.cassandra.db.rows.BaseRowIterator; +import org.apache.cassandra.db.rows.RangeTombstoneMarker; +import org.apache.cassandra.db.rows.Row; +import org.apache.cassandra.db.rows.Unfiltered; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public abstract class BaseRows<R extends Unfiltered, I extends BaseRowIterator<? extends Unfiltered>> extends BaseIterator<Unfiltered, I, R> implements BaseRowIterator<R> { + private static final Logger logger = LoggerFactory.getLogger(BaseRows.class); + private Row staticRow; public BaseRows(I input) @@ -82,7 +89,14 @@ implements BaseRowIterator<R> super.add(transformation); // transform any existing data - staticRow = transformation.applyToStatic(staticRow); + final Row afterTransform = transformation.applyToStatic(staticRow); + + if (staticRow != null && afterTransform == null) + logger.debug("Transformation returns NULL value : " + transformation); + + if (afterTransform != null) + staticRow = afterTransform; + next = applyOne(next, transformation); } diff --git a/src/java/org/apache/cassandra/db/transform/UnfilteredRows.java b/src/java/org/apache/cassandra/db/transform/UnfilteredRows.java index 98640ae..e497bef 100644 --- a/src/java/org/apache/cassandra/db/transform/UnfilteredRows.java +++ b/src/java/org/apache/cassandra/db/transform/UnfilteredRows.java @@ -35,6 +35,9 @@ final class UnfilteredRows extends BaseRows<Unfiltered, UnfilteredRowIterator> i @Override public boolean isEmpty() { + if (staticRow() == null) + return true; + return staticRow().isEmpty() && partitionLevelDeletion().isLive() && !hasNext(); } } {code} > NullPointerExpception when reading/compacting table > --------------------------------------------------- > > Key: CASSANDRA-11988 > URL: https://issues.apache.org/jira/browse/CASSANDRA-11988 > Project: Cassandra > Issue Type: Bug > Reporter: Nimi Wariboko Jr. > Assignee: Carl Yeksigian > Fix For: 3.6 > > > I have a table that suddenly refuses to be read or compacted. Issuing a read > on the table causes a NPE. > On compaction, it returns the error > {code} > ERROR [CompactionExecutor:6] 2016-06-09 17:10:15,724 CassandraDaemon.java:213 > - Exception in thread Thread[CompactionExecutor:6,1,main] > java.lang.NullPointerException: null > at > org.apache.cassandra.db.transform.UnfilteredRows.isEmpty(UnfilteredRows.java:38) > ~[apache-cassandra-3.6.jar:3.6] > at > org.apache.cassandra.db.partitions.PurgeFunction.applyToPartition(PurgeFunction.java:64) > ~[apache-cassandra-3.6.jar:3.6] > at > org.apache.cassandra.db.partitions.PurgeFunction.applyToPartition(PurgeFunction.java:24) > ~[apache-cassandra-3.6.jar:3.6] > at > org.apache.cassandra.db.transform.BasePartitions.hasNext(BasePartitions.java:76) > ~[apache-cassandra-3.6.jar:3.6] > at > org.apache.cassandra.db.compaction.CompactionIterator.hasNext(CompactionIterator.java:226) > ~[apache-cassandra-3.6.jar:3.6] > at > org.apache.cassandra.db.compaction.CompactionTask.runMayThrow(CompactionTask.java:182) > ~[apache-cassandra-3.6.jar:3.6] > at > org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > ~[apache-cassandra-3.6.jar:3.6] > at > org.apache.cassandra.db.compaction.CompactionTask.executeInternal(CompactionTask.java:82) > ~[apache-cassandra-3.6.jar:3.6] > at > org.apache.cassandra.db.compaction.AbstractCompactionTask.execute(AbstractCompactionTask.java:60) > ~[apache-cassandra-3.6.jar:3.6] > at > org.apache.cassandra.db.compaction.CompactionManager$BackgroundCompactionCandidate.run(CompactionManager.java:264) > ~[apache-cassandra-3.6.jar:3.6] > at > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > ~[na:1.8.0_45] > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > ~[na:1.8.0_45] > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > ~[na:1.8.0_45] > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > [na:1.8.0_45] > at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45] > {code} > Schema: > {code} > CREATE TABLE cmpayments.report_payments ( > reportid timeuuid, > userid timeuuid, > adjustedearnings decimal, > deleted set<timeuuid> static, > earnings map<timeuuid, decimal>, > gross map<timeuuid, decimal>, > organizationid text, > payall timestamp static, > status text, > PRIMARY KEY (reportid, userid) > ) WITH CLUSTERING ORDER BY (userid ASC) > AND bloom_filter_fp_chance = 0.01 > AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'} > AND comment = '' > AND compaction = {'class': > 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', > 'max_threshold': '32', 'min_threshold': '4'} > AND compression = {'chunk_length_in_kb': '64', 'class': > 'org.apache.cassandra.io.compress.LZ4Compressor'} > AND crc_check_chance = 1.0 > AND dclocal_read_repair_chance = 0.1 > AND default_time_to_live = 0 > AND gc_grace_seconds = 864000 > AND max_index_interval = 2048 > AND memtable_flush_period_in_ms = 0 > AND min_index_interval = 128 > AND read_repair_chance = 0.0 > AND speculative_retry = '99PERCENTILE'; > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)