Dont throw IOExceptions in when opening sstables Patch by marcuse; reviewed by Ariel Weisberg for CASSANDRA-13620
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/dfbe3fab Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/dfbe3fab Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/dfbe3fab Branch: refs/heads/trunk Commit: dfbe3fabd266493e698c194ef90b4dfc7d62b030 Parents: 95f1b23 Author: Marcus Eriksson <[email protected]> Authored: Mon Jun 19 15:22:57 2017 +0200 Committer: Marcus Eriksson <[email protected]> Committed: Mon Aug 28 15:37:26 2017 +0200 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../apache/cassandra/db/ColumnFamilyStore.java | 22 +++++++++++++++++--- .../io/sstable/format/SSTableReader.java | 19 +++++++++++++++-- .../unit/org/apache/cassandra/db/ScrubTest.java | 2 +- 4 files changed, 38 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/dfbe3fab/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index ba35152..5ccd5cd 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.15 + * Don't skip corrupted sstables on startup (CASSANDRA-13620) * Fix the merging of cells with different user type versions (CASSANDRA-13776) * Copy session properties on cqlsh.py do_login (CASSANDRA-13640) * Potential AssertionError during ReadRepair of range tombstone and partition deletions (CASSANDRA-13719) http://git-wip-us.apache.org/repos/asf/cassandra/blob/dfbe3fab/src/java/org/apache/cassandra/db/ColumnFamilyStore.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index f720330..7251244 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -59,8 +59,10 @@ import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.index.SecondaryIndexManager; import org.apache.cassandra.index.internal.CassandraIndex; import org.apache.cassandra.index.transactions.UpdateTransaction; +import org.apache.cassandra.io.FSError; import org.apache.cassandra.io.FSWriteError; import org.apache.cassandra.io.sstable.Component; +import org.apache.cassandra.io.sstable.CorruptSSTableException; import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.sstable.SSTableMultiWriter; import org.apache.cassandra.io.sstable.format.*; @@ -691,7 +693,8 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean } catch (IOException e) { - SSTableReader.logOpenException(entry.getKey(), e); + FileUtils.handleCorruptSSTable(new CorruptSSTableException(e, entry.getKey().filenameFor(Component.STATS))); + logger.error("Cannot read sstable {}; other IO error, skipping table", entry, e); continue; } @@ -718,9 +721,22 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean { reader = SSTableReader.open(newDescriptor, entry.getValue(), metadata); } - catch (IOException e) + catch (CorruptSSTableException ex) + { + FileUtils.handleCorruptSSTable(ex); + logger.error("Corrupt sstable {}; skipping table", entry, ex); + continue; + } + catch (FSError ex) + { + FileUtils.handleFSError(ex); + logger.error("Cannot read sstable {}; file system error, skipping table", entry, ex); + continue; + } + catch (IOException ex) { - SSTableReader.logOpenException(entry.getKey(), e); + FileUtils.handleCorruptSSTable(new CorruptSSTableException(ex, entry.getKey().filenameFor(Component.DATA))); + logger.error("Cannot read sstable {}; other IO error, skipping table", entry, ex); continue; } newSSTables.add(reader); http://git-wip-us.apache.org/repos/asf/cassandra/blob/dfbe3fab/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java index cd41b5b..d56b3e7 100644 --- a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java @@ -446,7 +446,16 @@ public abstract class SSTableReader extends SSTable implements SelfRefCounted<SS assert !descriptor.version.storeRows() || components.contains(Component.STATS) : "Stats component is missing for sstable " + descriptor; EnumSet<MetadataType> types = EnumSet.of(MetadataType.VALIDATION, MetadataType.STATS, MetadataType.HEADER); - Map<MetadataType, MetadataComponent> sstableMetadata = descriptor.getMetadataSerializer().deserialize(descriptor, types); + + Map<MetadataType, MetadataComponent> sstableMetadata; + try + { + sstableMetadata = descriptor.getMetadataSerializer().deserialize(descriptor, types); + } + catch (IOException e) + { + throw new CorruptSSTableException(e, descriptor.filenameFor(Component.STATS)); + } ValidationMetadata validationMetadata = (ValidationMetadata) sstableMetadata.get(MetadataType.VALIDATION); StatsMetadata statsMetadata = (StatsMetadata) sstableMetadata.get(MetadataType.STATS); SerializationHeader.Component header = (SerializationHeader.Component) sstableMetadata.get(MetadataType.HEADER); @@ -488,6 +497,11 @@ public abstract class SSTableReader extends SSTable implements SelfRefCounted<SS return sstable; } + catch (IOException e) + { + sstable.selfRef().release(); + throw new CorruptSSTableException(e, sstable.getFilename()); + } catch (Throwable t) { sstable.selfRef().release(); @@ -534,6 +548,7 @@ public abstract class SSTableReader extends SSTable implements SelfRefCounted<SS } catch (IOException ex) { + FileUtils.handleCorruptSSTable(new CorruptSSTableException(ex, entry.getKey().filenameFor(Component.DATA))); logger.error("Cannot read sstable {}; other IO error, skipping table", entry, ex); return; } @@ -1177,7 +1192,7 @@ public abstract class SSTableReader extends SSTable implements SelfRefCounted<SS { if (this.first.compareTo(this.last) > 0) { - throw new IllegalStateException(String.format("SSTable first key %s > last key %s", this.first, this.last)); + throw new CorruptSSTableException(new IllegalStateException(String.format("SSTable first key %s > last key %s", this.first, this.last)), getFilename()); } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/dfbe3fab/test/unit/org/apache/cassandra/db/ScrubTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/db/ScrubTest.java b/test/unit/org/apache/cassandra/db/ScrubTest.java index f97d9a9..08336a1 100644 --- a/test/unit/org/apache/cassandra/db/ScrubTest.java +++ b/test/unit/org/apache/cassandra/db/ScrubTest.java @@ -349,7 +349,7 @@ public class ScrubTest SSTableReader.open(desc, cfs.metadata); fail("SSTR validation should have caught the out-of-order rows"); } - catch (IllegalStateException ise) + catch (CorruptSSTableException ise) { /* this is expected */ } // open without validation for scrubbing --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
