Hi all, apparently the year started with a node (version 3.0.15) exhibiting some data corruption (discovered by a spark job enumerating all keys).
The exception is attached below. The invalid string is a partition key, and it is supposed to be a file name. If I manually decode the bytes I get something that resembles a path but with lots of garbage inside. Now part of the garbage might be intentional, which means I am still thinking whether this is an actual data corruption or the input string was already corrupted. In the latter case, the string should not have inserted though, the driver or Cassandra should have rejected the WRITE, am I correct? I admit I am a bit stuck, because obviously getsstables doesn't work. Does anybody have any suggestion how to deal with this situation? Ideally I would like to identify the sstable, but also check that the corruption did not replicate it to other nodes, and possibly delete the offending partition. A starting point would be to generate the token associated with the offending key. Since I am using the murmur partitioner I was planning to just compute the token value of that byte sequence. Would this be a sound approach? Any suggestion is more than welcome :S Cheers, Stefano WARN [SharedPool-Worker-18] 2018-01-02 16:49:43,861 AbstractLocalAwareExecutorService.java:169 - Uncaught exception on thread Thread[SharedPool-Worker-18,5,main]: {} org.apache.cassandra.serializers.MarshalException: Invalid UTF-8 bytes 433a5c484a5c5858505c17443535575c5d425a5c515f5c202031332031335c2e4d5c2c364256563b5c203230dbb74c5c2754345c532031452121445c7f584d7f7f555c4e485757455c56203330585c465c203144334f5f5f345c29605c38495c2033415d595c4c335c203134365c364e4a5c2c46e9bdbd485c5a39397e5c203231edb9b9235cc6a7592d432d435d5c354e595c45495c1738525c442032324747485c55203230265c43355c4b353b565c4429dbb7495c23525c2031442031443b5c45552e141457 at org.apache.cassandra.serializers.AbstractTextSerializer.deserialize(AbstractTextSerializer.java:45) ~[apache-cassandra-3.0.15.jar:3.0.15] at org.apache.cassandra.serializers.AbstractTextSerializer.deserialize(AbstractTextSerializer.java:28) ~[apache-cassandra-3.0.15.jar:3.0.15] at org.apache.cassandra.db.marshal.AbstractType.getString(AbstractType.java:130) ~[apache-cassandra-3.0.15.jar:3.0.15] at org.apache.cassandra.dht.AbstractBounds.format(AbstractBounds.java:130) ~[apache-cassandra-3.0.15.jar:3.0.15] at org.apache.cassandra.dht.AbstractBounds.getString(AbstractBounds.java:123) ~[apache-cassandra-3.0.15.jar:3.0.15] at org.apache.cassandra.db.PartitionRangeReadCommand.queryStorage(PartitionRangeReadCommand.java:245) ~[apache-cassandra-3.0.15.jar:3.0.15] at org.apache.cassandra.db.ReadCommand.executeLocally(ReadCommand.java:405) ~[apache-cassandra-3.0.15.jar:3.0.15] at org.apache.cassandra.db.ReadCommandVerbHandler.doVerb(ReadCommandVerbHandler.java:45) ~[apache-cassandra-3.0.15.jar:3.0.15] at org.apache.cassandra.net.MessageDeliveryTask.run(MessageDeliveryTask.java:67) ~[apache-cassandra-3.0.15.jar:3.0.15] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_131] at org.apache.cassandra.concurrent.AbstractLocalAwareExecutorService$FutureTask.run(AbstractLocalAwareExecutorService.java:164) ~[apache-cassandra-3.0.15.jar:3.0.15] at org.apache.cassandra.concurrent.AbstractLocalAwareExecutorService$LocalSessionFutureTask.run(AbstractLocalAwareExecutorService.java:136) [apache-cassandra-3.0.15.jar:3.0.15] at org.apache.cassandra.concurrent.SEPWorker.run(SEPWorker.java:105) [apache-cassandra-3.0.15.jar:3.0.15] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]