[ 
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)

Reply via email to