[ 
https://issues.apache.org/jira/browse/CASSANDRA-15208?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Damien Stevenson updated CASSANDRA-15208:
-----------------------------------------
    Description: 
Listing the same data directory multiple times in the yaml can result in an 
java.lang.AssertionError: null on startup.

This error will only happen if Cassandra was stopped part way through an 
sstable operation (i.e a compaction) and is restarted

Error: 
{noformat}
Exception (java.lang.AssertionError) encountered during startup: null
java.lang.AssertionError
at 
org.apache.cassandra.db.lifecycle.LogReplicaSet.addReplica(LogReplicaSet.java:63)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at 
org.apache.cassandra.db.lifecycle.LogReplicaSet.addReplicas(LogReplicaSet.java:57)
at org.apache.cassandra.db.lifecycle.LogFile.<init>(LogFile.java:147)
at org.apache.cassandra.db.lifecycle.LogFile.make(LogFile.java:95)
at 
org.apache.cassandra.db.lifecycle.LogTransaction$LogFilesByName.removeUnfinishedLeftovers(LogTransaction.java:476)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.HashMap$EntrySpliterator.tryAdvance(HashMap.java:1717)
at 
java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at 
java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230)
at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.allMatch(ReferencePipeline.java:454)
at 
org.apache.cassandra.db.lifecycle.LogTransaction$LogFilesByName.removeUnfinishedLeftovers(LogTransaction.java:471)
at 
org.apache.cassandra.db.lifecycle.LogTransaction.removeUnfinishedLeftovers(LogTransaction.java:438)
at 
org.apache.cassandra.db.lifecycle.LogTransaction.removeUnfinishedLeftovers(LogTransaction.java:430)
at 
org.apache.cassandra.db.lifecycle.LifecycleTransaction.removeUnfinishedLeftovers(LifecycleTransaction.java:549)
at 
org.apache.cassandra.db.ColumnFamilyStore.scrubDataDirectories(ColumnFamilyStore.java:658)
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:275)
at 
org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:620)
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:732)
ERROR o.a.c.service.CassandraDaemon Exception encountered during startup
java.lang.AssertionError: null
at 
org.apache.cassandra.db.lifecycle.LogReplicaSet.addReplica(LogReplicaSet.java:63)
 ~[apache-cassandra-3.11.4.jar:3.11.4]
at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_171]
at 
org.apache.cassandra.db.lifecycle.LogReplicaSet.addReplicas(LogReplicaSet.java:57)
 ~[apache-cassandra-3.11.4.jar:3.11.4]
at org.apache.cassandra.db.lifecycle.LogFile.<init>(LogFile.java:147) 
~[apache-cassandra-3.11.4.jar:3.11.4]
at org.apache.cassandra.db.lifecycle.LogFile.make(LogFile.java:95) 
~[apache-cassandra-3.11.4.jar:3.11.4]
at 
org.apache.cassandra.db.lifecycle.LogTransaction$LogFilesByName.removeUnfinishedLeftovers(LogTransaction.java:476)
 ~[apache-cassandra-3.11.4.jar:3.11>
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) 
~[na:1.8.0_171]
at java.util.HashMap$EntrySpliterator.tryAdvance(HashMap.java:1717) 
~[na:1.8.0_171]
at 
java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
 ~[na:1.8.0_171]
at 
java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498) 
~[na:1.8.0_171]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485) 
~[na:1.8.0_171]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) 
~[na:1.8.0_171]
at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230) 
~[na:1.8.0_171]
at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196) 
~[na:1.8.0_171]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 
~[na:1.8.0_171]
at java.util.stream.ReferencePipeline.allMatch(ReferencePipeline.java:454) 
~[na:1.8.0_171]
at 
org.apache.cassandra.db.lifecycle.LogTransaction$LogFilesByName.removeUnfinishedLeftovers(LogTransaction.java:471)
 ~[apache-cassandra-3.11.4.jar:3.11>
at 
org.apache.cassandra.db.lifecycle.LogTransaction.removeUnfinishedLeftovers(LogTransaction.java:438)
 ~[apache-cassandra-3.11.4.jar:3.11.4]
at 
org.apache.cassandra.db.lifecycle.LogTransaction.removeUnfinishedLeftovers(LogTransaction.java:430)
 ~[apache-cassandra-3.11.4.jar:3.11.4]
at 
org.apache.cassandra.db.lifecycle.LifecycleTransaction.removeUnfinishedLeftovers(LifecycleTransaction.java:549)
 ~[apache-cassandra-3.11.4.jar:3.11.4]
at 
org.apache.cassandra.db.ColumnFamilyStore.scrubDataDirectories(ColumnFamilyStore.java:658)
 ~[apache-cassandra-3.11.4.jar:3.11.4]
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:275) 
[apache-cassandra-3.11.4.jar:3.11.4]
at 
org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:620) 
[apache-cassandra-3.11.4.jar:3.11.4]
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:732) 
[apache-cassandra-3.11.4.jar:3.11.4]{noformat}
 Steps to recreate this behaviour:
 * Write data to Cassandra, wait for a largish compaction to start.
 * Kill Cassandra part way through the compaction
 * Check for the existence of a transaction log file in the data directory

{noformat}
cd /var/lib/cassandra/data
find . -type f -iname '*.log'
./single/table0-3c161330a68d11e9af45010f0154fff5/md_txn_compaction_b492cd30-a68d-11e9-b727-010f0154fff5.log{noformat}
 * Duplicate the data directory entry in the yaml:

{noformat}
data_file_directories:
  - /var/lib/cassandra/data
  - /var/lib/cassandra/data{noformat}
 * Restart Cassandra.

I have tested that this behaviour exists in the following versions of Cassandra:
 * 3.11.4
 * 3.0.15

Workaround:
 * Remove the duplicate data directory entry from the Cassandra yaml

Possible solutions:
 * Validate and filter data_file_directories input to ensure each data 
directory is unique
 * Fail gracefully, with a more meaningful error message.

 

  was:
Listing the same data directory multiple times in the yaml can result in an 
java.lang.AssertionError: null on startup.

This error will only happen if Cassandra was stopped part way through an 
sstable operation (i.e a compaction) and is restarted

Error:

 
{noformat}
Exception (java.lang.AssertionError) encountered during startup: null
java.lang.AssertionError
at 
org.apache.cassandra.db.lifecycle.LogReplicaSet.addReplica(LogReplicaSet.java:63)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at 
org.apache.cassandra.db.lifecycle.LogReplicaSet.addReplicas(LogReplicaSet.java:57)
at org.apache.cassandra.db.lifecycle.LogFile.<init>(LogFile.java:147)
at org.apache.cassandra.db.lifecycle.LogFile.make(LogFile.java:95)
at 
org.apache.cassandra.db.lifecycle.LogTransaction$LogFilesByName.removeUnfinishedLeftovers(LogTransaction.java:476)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.HashMap$EntrySpliterator.tryAdvance(HashMap.java:1717)
at 
java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at 
java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230)
at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.allMatch(ReferencePipeline.java:454)
at 
org.apache.cassandra.db.lifecycle.LogTransaction$LogFilesByName.removeUnfinishedLeftovers(LogTransaction.java:471)
at 
org.apache.cassandra.db.lifecycle.LogTransaction.removeUnfinishedLeftovers(LogTransaction.java:438)
at 
org.apache.cassandra.db.lifecycle.LogTransaction.removeUnfinishedLeftovers(LogTransaction.java:430)
at 
org.apache.cassandra.db.lifecycle.LifecycleTransaction.removeUnfinishedLeftovers(LifecycleTransaction.java:549)
at 
org.apache.cassandra.db.ColumnFamilyStore.scrubDataDirectories(ColumnFamilyStore.java:658)
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:275)
at 
org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:620)
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:732)
ERROR o.a.c.service.CassandraDaemon Exception encountered during startup
java.lang.AssertionError: null
at 
org.apache.cassandra.db.lifecycle.LogReplicaSet.addReplica(LogReplicaSet.java:63)
 ~[apache-cassandra-3.11.4.jar:3.11.4]
at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_171]
at 
org.apache.cassandra.db.lifecycle.LogReplicaSet.addReplicas(LogReplicaSet.java:57)
 ~[apache-cassandra-3.11.4.jar:3.11.4]
at org.apache.cassandra.db.lifecycle.LogFile.<init>(LogFile.java:147) 
~[apache-cassandra-3.11.4.jar:3.11.4]
at org.apache.cassandra.db.lifecycle.LogFile.make(LogFile.java:95) 
~[apache-cassandra-3.11.4.jar:3.11.4]
at 
org.apache.cassandra.db.lifecycle.LogTransaction$LogFilesByName.removeUnfinishedLeftovers(LogTransaction.java:476)
 ~[apache-cassandra-3.11.4.jar:3.11>
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) 
~[na:1.8.0_171]
at java.util.HashMap$EntrySpliterator.tryAdvance(HashMap.java:1717) 
~[na:1.8.0_171]
at 
java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
 ~[na:1.8.0_171]
at 
java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498) 
~[na:1.8.0_171]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485) 
~[na:1.8.0_171]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) 
~[na:1.8.0_171]
at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230) 
~[na:1.8.0_171]
at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196) 
~[na:1.8.0_171]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 
~[na:1.8.0_171]
at java.util.stream.ReferencePipeline.allMatch(ReferencePipeline.java:454) 
~[na:1.8.0_171]
at 
org.apache.cassandra.db.lifecycle.LogTransaction$LogFilesByName.removeUnfinishedLeftovers(LogTransaction.java:471)
 ~[apache-cassandra-3.11.4.jar:3.11>
at 
org.apache.cassandra.db.lifecycle.LogTransaction.removeUnfinishedLeftovers(LogTransaction.java:438)
 ~[apache-cassandra-3.11.4.jar:3.11.4]
at 
org.apache.cassandra.db.lifecycle.LogTransaction.removeUnfinishedLeftovers(LogTransaction.java:430)
 ~[apache-cassandra-3.11.4.jar:3.11.4]
at 
org.apache.cassandra.db.lifecycle.LifecycleTransaction.removeUnfinishedLeftovers(LifecycleTransaction.java:549)
 ~[apache-cassandra-3.11.4.jar:3.11.4]
at 
org.apache.cassandra.db.ColumnFamilyStore.scrubDataDirectories(ColumnFamilyStore.java:658)
 ~[apache-cassandra-3.11.4.jar:3.11.4]
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:275) 
[apache-cassandra-3.11.4.jar:3.11.4]
at 
org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:620) 
[apache-cassandra-3.11.4.jar:3.11.4]
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:732) 
[apache-cassandra-3.11.4.jar:3.11.4]{noformat}
 

Steps to recreate this behaviour:
 * Write data to Cassandra, wait for a largish compaction to start.
 * Kill Cassandra part way through the compaction
 * Check for the existence of a transaction log file in the data directory

{noformat}
cd /var/lib/cassandra/data
find . -type f -iname '*.log'
./single/table0-3c161330a68d11e9af45010f0154fff5/md_txn_compaction_b492cd30-a68d-11e9-b727-010f0154fff5.log{noformat}

 * Duplicate the data directory entry in the yaml:

{noformat}
data_file_directories:
  - /var/lib/cassandra/data
  - /var/lib/cassandra/data{noformat}

 * Restart Cassandra.

I have tested that this behaviour exists in the following versions of Cassandra:
 * 3.11.4
 * 3.0.15

Workaround:
 * Remove the duplicate data directory entry from the Cassandra yaml

Possible solutions:
 * Validate and filter data_file_directories input to ensure each data 
directory is unique
 * Fail gracefully, with a more meaningful error message.

 


> Listing the same data directory multiple times can result in an 
> java.lang.AssertionError: null on startup
> ---------------------------------------------------------------------------------------------------------
>
>                 Key: CASSANDRA-15208
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-15208
>             Project: Cassandra
>          Issue Type: Bug
>          Components: Local/Config
>            Reporter: Damien Stevenson
>            Priority: Normal
>
> Listing the same data directory multiple times in the yaml can result in an 
> java.lang.AssertionError: null on startup.
> This error will only happen if Cassandra was stopped part way through an 
> sstable operation (i.e a compaction) and is restarted
> Error: 
> {noformat}
> Exception (java.lang.AssertionError) encountered during startup: null
> java.lang.AssertionError
> at 
> org.apache.cassandra.db.lifecycle.LogReplicaSet.addReplica(LogReplicaSet.java:63)
> at java.util.ArrayList.forEach(ArrayList.java:1257)
> at 
> org.apache.cassandra.db.lifecycle.LogReplicaSet.addReplicas(LogReplicaSet.java:57)
> at org.apache.cassandra.db.lifecycle.LogFile.<init>(LogFile.java:147)
> at org.apache.cassandra.db.lifecycle.LogFile.make(LogFile.java:95)
> at 
> org.apache.cassandra.db.lifecycle.LogTransaction$LogFilesByName.removeUnfinishedLeftovers(LogTransaction.java:476)
> at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
> at java.util.HashMap$EntrySpliterator.tryAdvance(HashMap.java:1717)
> at 
> java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
> at 
> java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
> at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
> at 
> java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
> at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230)
> at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196)
> at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
> at java.util.stream.ReferencePipeline.allMatch(ReferencePipeline.java:454)
> at 
> org.apache.cassandra.db.lifecycle.LogTransaction$LogFilesByName.removeUnfinishedLeftovers(LogTransaction.java:471)
> at 
> org.apache.cassandra.db.lifecycle.LogTransaction.removeUnfinishedLeftovers(LogTransaction.java:438)
> at 
> org.apache.cassandra.db.lifecycle.LogTransaction.removeUnfinishedLeftovers(LogTransaction.java:430)
> at 
> org.apache.cassandra.db.lifecycle.LifecycleTransaction.removeUnfinishedLeftovers(LifecycleTransaction.java:549)
> at 
> org.apache.cassandra.db.ColumnFamilyStore.scrubDataDirectories(ColumnFamilyStore.java:658)
> at 
> org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:275)
> at 
> org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:620)
> at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:732)
> ERROR o.a.c.service.CassandraDaemon Exception encountered during startup
> java.lang.AssertionError: null
> at 
> org.apache.cassandra.db.lifecycle.LogReplicaSet.addReplica(LogReplicaSet.java:63)
>  ~[apache-cassandra-3.11.4.jar:3.11.4]
> at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_171]
> at 
> org.apache.cassandra.db.lifecycle.LogReplicaSet.addReplicas(LogReplicaSet.java:57)
>  ~[apache-cassandra-3.11.4.jar:3.11.4]
> at org.apache.cassandra.db.lifecycle.LogFile.<init>(LogFile.java:147) 
> ~[apache-cassandra-3.11.4.jar:3.11.4]
> at org.apache.cassandra.db.lifecycle.LogFile.make(LogFile.java:95) 
> ~[apache-cassandra-3.11.4.jar:3.11.4]
> at 
> org.apache.cassandra.db.lifecycle.LogTransaction$LogFilesByName.removeUnfinishedLeftovers(LogTransaction.java:476)
>  ~[apache-cassandra-3.11.4.jar:3.11>
> at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) 
> ~[na:1.8.0_171]
> at java.util.HashMap$EntrySpliterator.tryAdvance(HashMap.java:1717) 
> ~[na:1.8.0_171]
> at 
> java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
>  ~[na:1.8.0_171]
> at 
> java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
>  ~[na:1.8.0_171]
> at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485) 
> ~[na:1.8.0_171]
> at 
> java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) 
> ~[na:1.8.0_171]
> at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230) 
> ~[na:1.8.0_171]
> at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196) 
> ~[na:1.8.0_171]
> at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 
> ~[na:1.8.0_171]
> at java.util.stream.ReferencePipeline.allMatch(ReferencePipeline.java:454) 
> ~[na:1.8.0_171]
> at 
> org.apache.cassandra.db.lifecycle.LogTransaction$LogFilesByName.removeUnfinishedLeftovers(LogTransaction.java:471)
>  ~[apache-cassandra-3.11.4.jar:3.11>
> at 
> org.apache.cassandra.db.lifecycle.LogTransaction.removeUnfinishedLeftovers(LogTransaction.java:438)
>  ~[apache-cassandra-3.11.4.jar:3.11.4]
> at 
> org.apache.cassandra.db.lifecycle.LogTransaction.removeUnfinishedLeftovers(LogTransaction.java:430)
>  ~[apache-cassandra-3.11.4.jar:3.11.4]
> at 
> org.apache.cassandra.db.lifecycle.LifecycleTransaction.removeUnfinishedLeftovers(LifecycleTransaction.java:549)
>  ~[apache-cassandra-3.11.4.jar:3.11.4]
> at 
> org.apache.cassandra.db.ColumnFamilyStore.scrubDataDirectories(ColumnFamilyStore.java:658)
>  ~[apache-cassandra-3.11.4.jar:3.11.4]
> at 
> org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:275) 
> [apache-cassandra-3.11.4.jar:3.11.4]
> at 
> org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:620)
>  [apache-cassandra-3.11.4.jar:3.11.4]
> at 
> org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:732) 
> [apache-cassandra-3.11.4.jar:3.11.4]{noformat}
>  Steps to recreate this behaviour:
>  * Write data to Cassandra, wait for a largish compaction to start.
>  * Kill Cassandra part way through the compaction
>  * Check for the existence of a transaction log file in the data directory
> {noformat}
> cd /var/lib/cassandra/data
> find . -type f -iname '*.log'
> ./single/table0-3c161330a68d11e9af45010f0154fff5/md_txn_compaction_b492cd30-a68d-11e9-b727-010f0154fff5.log{noformat}
>  * Duplicate the data directory entry in the yaml:
> {noformat}
> data_file_directories:
>   - /var/lib/cassandra/data
>   - /var/lib/cassandra/data{noformat}
>  * Restart Cassandra.
> I have tested that this behaviour exists in the following versions of 
> Cassandra:
>  * 3.11.4
>  * 3.0.15
> Workaround:
>  * Remove the duplicate data directory entry from the Cassandra yaml
> Possible solutions:
>  * Validate and filter data_file_directories input to ensure each data 
> directory is unique
>  * Fail gracefully, with a more meaningful error message.
>  



--
This message was sent by Atlassian JIRA
(v7.6.14#76016)

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to