From e8651b6625c7f6260852f2a9c45fb189c63ab528 Mon Sep 17 00:00:00 2001 From: Paulo Motta Date: Fri, 5 Feb 2016 12:38:39 -0300 Subject: [PATCH] Support streaming of older version sstables in 3.0 patch by Paulo Motta; reviewed by Yuki Morishita for CASSANDRA-10990 --- CHANGES.txt | 1 + .../cassandra/db/ColumnFamilyStore.java | 2 + .../org/apache/cassandra/db/Directories.java | 30 + .../cassandra/db/SerializationHeader.java | 5 + .../org/apache/cassandra/db/Serializers.java | 122 ++-- .../AbstractSSTableIterator.java | 4 +- .../cassandra/hints/ChecksummedDataInput.java | 8 +- .../apache/cassandra/hints/HintMessage.java | 4 +- .../compress/CompressedSequentialWriter.java | 8 +- .../io/sstable/SSTableSimpleIterator.java | 11 +- .../io/sstable/format/SSTableReader.java | 2 +- .../io/sstable/format/SSTableWriter.java | 2 +- .../io/sstable/format/big/BigTableWriter.java | 4 +- .../cassandra/io/util/BytesReadTracker.java | 30 + .../util/{FileMark.java => DataPosition.java} | 3 +- .../cassandra/io/util/FileDataInput.java | 8 +- .../io/util/FileSegmentInputStream.java | 6 +- .../cassandra/io/util/RandomAccessReader.java | 8 +- .../io/util/RewindableDataInput.java | 30 + .../util/RewindableDataInputStreamPlus.java | 569 ++++++++++++++++++ .../cassandra/io/util/SequentialWriter.java | 6 +- .../util/TrackedDataInputPlus.java} | 9 +- .../cassandra/io/util/TrackedInputStream.java | 76 +++ .../cassandra/service/StorageService.java | 1 + .../cassandra/streaming/StreamReader.java | 84 ++- .../compress/CompressedStreamReader.java | 18 +- .../streaming/messages/FileMessageHeader.java | 4 +- .../cassandra/tools/nodetool/Repair.java | 2 +- .../cassandra/utils/CloseableIterator.java | 1 - ...y_jb_clust_compact-jb-1-CompressionInfo.db | Bin 0 -> 83 bytes ...ables-legacy_jb_clust_compact-jb-1-Data.db | Bin 0 -> 5270 bytes ...les-legacy_jb_clust_compact-jb-1-Filter.db | Bin 0 -> 24 bytes ...bles-legacy_jb_clust_compact-jb-1-Index.db | Bin 0 -> 157685 bytes ...legacy_jb_clust_compact-jb-1-Statistics.db | Bin 0 -> 6791 bytes ...es-legacy_jb_clust_compact-jb-1-Summary.db | Bin 0 -> 71 bytes ...ables-legacy_jb_clust_compact-jb-1-TOC.txt | 7 + ...st_counter_compact-jb-1-CompressionInfo.db | Bin 0 -> 75 bytes ...gacy_jb_clust_counter_compact-jb-1-Data.db | Bin 0 -> 4228 bytes ...cy_jb_clust_counter_compact-jb-1-Filter.db | Bin 0 -> 24 bytes ...acy_jb_clust_counter_compact-jb-1-Index.db | Bin 0 -> 157685 bytes ...b_clust_counter_compact-jb-1-Statistics.db | Bin 0 -> 6791 bytes ...y_jb_clust_counter_compact-jb-1-Summary.db | Bin 0 -> 71 bytes ...gacy_jb_clust_counter_compact-jb-1-TOC.txt | 7 + ..._jb_simple_compact-jb-1-CompressionInfo.db | Bin 0 -> 43 bytes ...bles-legacy_jb_simple_compact-jb-1-Data.db | Bin 0 -> 108 bytes ...es-legacy_jb_simple_compact-jb-1-Filter.db | Bin 0 -> 24 bytes ...les-legacy_jb_simple_compact-jb-1-Index.db | Bin 0 -> 75 bytes ...egacy_jb_simple_compact-jb-1-Statistics.db | Bin 0 -> 4395 bytes ...s-legacy_jb_simple_compact-jb-1-Summary.db | Bin 0 -> 71 bytes ...bles-legacy_jb_simple_compact-jb-1-TOC.txt | 7 + ...le_counter_compact-jb-1-CompressionInfo.db | Bin 0 -> 43 bytes ...acy_jb_simple_counter_compact-jb-1-Data.db | Bin 0 -> 118 bytes ...y_jb_simple_counter_compact-jb-1-Filter.db | Bin 0 -> 24 bytes ...cy_jb_simple_counter_compact-jb-1-Index.db | Bin 0 -> 75 bytes ..._simple_counter_compact-jb-1-Statistics.db | Bin 0 -> 4395 bytes ..._jb_simple_counter_compact-jb-1-Summary.db | Bin 0 -> 71 bytes ...acy_jb_simple_counter_compact-jb-1-TOC.txt | 7 + ...y_ka_clust_compact-ka-1-CompressionInfo.db | Bin 0 -> 83 bytes ...ables-legacy_ka_clust_compact-ka-1-Data.db | Bin 0 -> 5277 bytes ...s-legacy_ka_clust_compact-ka-1-Digest.sha1 | 1 + ...les-legacy_ka_clust_compact-ka-1-Filter.db | Bin 0 -> 24 bytes ...bles-legacy_ka_clust_compact-ka-1-Index.db | Bin 0 -> 157685 bytes ...legacy_ka_clust_compact-ka-1-Statistics.db | Bin 0 -> 6859 bytes ...es-legacy_ka_clust_compact-ka-1-Summary.db | Bin 0 -> 83 bytes ...ables-legacy_ka_clust_compact-ka-1-TOC.txt | 8 + ...st_counter_compact-ka-1-CompressionInfo.db | Bin 0 -> 75 bytes ...gacy_ka_clust_counter_compact-ka-1-Data.db | Bin 0 -> 4527 bytes ..._ka_clust_counter_compact-ka-1-Digest.sha1 | 1 + ...cy_ka_clust_counter_compact-ka-1-Filter.db | Bin 0 -> 24 bytes ...acy_ka_clust_counter_compact-ka-1-Index.db | Bin 0 -> 157685 bytes ...a_clust_counter_compact-ka-1-Statistics.db | Bin 0 -> 6859 bytes ...y_ka_clust_counter_compact-ka-1-Summary.db | Bin 0 -> 83 bytes ...gacy_ka_clust_counter_compact-ka-1-TOC.txt | 8 + ..._ka_simple_compact-ka-1-CompressionInfo.db | Bin 0 -> 43 bytes ...bles-legacy_ka_simple_compact-ka-1-Data.db | Bin 0 -> 105 bytes ...-legacy_ka_simple_compact-ka-1-Digest.sha1 | 1 + ...es-legacy_ka_simple_compact-ka-1-Filter.db | Bin 0 -> 24 bytes ...les-legacy_ka_simple_compact-ka-1-Index.db | Bin 0 -> 75 bytes ...egacy_ka_simple_compact-ka-1-Statistics.db | Bin 0 -> 4453 bytes ...s-legacy_ka_simple_compact-ka-1-Summary.db | Bin 0 -> 83 bytes ...bles-legacy_ka_simple_compact-ka-1-TOC.txt | 8 + ...le_counter_compact-ka-1-CompressionInfo.db | Bin 0 -> 43 bytes ...acy_ka_simple_counter_compact-ka-1-Data.db | Bin 0 -> 124 bytes ...ka_simple_counter_compact-ka-1-Digest.sha1 | 1 + ...y_ka_simple_counter_compact-ka-1-Filter.db | Bin 0 -> 24 bytes ...cy_ka_simple_counter_compact-ka-1-Index.db | Bin 0 -> 75 bytes ..._simple_counter_compact-ka-1-Statistics.db | Bin 0 -> 4453 bytes ..._ka_simple_counter_compact-ka-1-Summary.db | Bin 0 -> 83 bytes ...acy_ka_simple_counter_compact-ka-1-TOC.txt | 8 + .../la-1-big-CompressionInfo.db | Bin 0 -> 83 bytes .../legacy_la_clust_compact/la-1-big-Data.db | Bin 0 -> 5286 bytes .../la-1-big-Digest.adler32 | 1 + .../la-1-big-Filter.db | Bin 0 -> 24 bytes .../legacy_la_clust_compact/la-1-big-Index.db | Bin 0 -> 157685 bytes .../la-1-big-Statistics.db | Bin 0 -> 6859 bytes .../la-1-big-Summary.db | Bin 0 -> 75 bytes .../legacy_la_clust_compact/la-1-big-TOC.txt | 8 + .../la-1-big-CompressionInfo.db | Bin 0 -> 75 bytes .../la-1-big-Data.db | Bin 0 -> 4527 bytes .../la-1-big-Digest.adler32 | 1 + .../la-1-big-Filter.db | Bin 0 -> 24 bytes .../la-1-big-Index.db | Bin 0 -> 157685 bytes .../la-1-big-Statistics.db | Bin 0 -> 6859 bytes .../la-1-big-Summary.db | Bin 0 -> 75 bytes .../la-1-big-TOC.txt | 8 + .../la-1-big-CompressionInfo.db | Bin 0 -> 43 bytes .../legacy_la_simple_compact/la-1-big-Data.db | Bin 0 -> 106 bytes .../la-1-big-Digest.adler32 | 1 + .../la-1-big-Filter.db | Bin 0 -> 24 bytes .../la-1-big-Index.db | Bin 0 -> 75 bytes .../la-1-big-Statistics.db | Bin 0 -> 4453 bytes .../la-1-big-Summary.db | Bin 0 -> 75 bytes .../legacy_la_simple_compact/la-1-big-TOC.txt | 8 + .../la-1-big-CompressionInfo.db | Bin 0 -> 43 bytes .../la-1-big-Data.db | Bin 0 -> 124 bytes .../la-1-big-Digest.adler32 | 1 + .../la-1-big-Filter.db | Bin 0 -> 24 bytes .../la-1-big-Index.db | Bin 0 -> 75 bytes .../la-1-big-Statistics.db | Bin 0 -> 4453 bytes .../la-1-big-Summary.db | Bin 0 -> 75 bytes .../la-1-big-TOC.txt | 8 + .../ma-1-big-CompressionInfo.db | Bin 0 -> 83 bytes .../legacy_ma_clust_compact/ma-1-big-Data.db | Bin 0 -> 5393 bytes .../ma-1-big-Digest.crc32 | 1 + .../ma-1-big-Filter.db | Bin 0 -> 24 bytes .../legacy_ma_clust_compact/ma-1-big-Index.db | Bin 0 -> 157553 bytes .../ma-1-big-Statistics.db | Bin 0 -> 7046 bytes .../ma-1-big-Summary.db | Bin 0 -> 47 bytes .../legacy_ma_clust_compact/ma-1-big-TOC.txt | 8 + .../ma-1-big-CompressionInfo.db | Bin 0 -> 75 bytes .../ma-1-big-Data.db | Bin 0 -> 4606 bytes .../ma-1-big-Digest.crc32 | 1 + .../ma-1-big-Filter.db | Bin 0 -> 24 bytes .../ma-1-big-Index.db | Bin 0 -> 157553 bytes .../ma-1-big-Statistics.db | Bin 0 -> 7055 bytes .../ma-1-big-Summary.db | Bin 0 -> 47 bytes .../ma-1-big-TOC.txt | 8 + .../ma-1-big-CompressionInfo.db | Bin 0 -> 43 bytes .../legacy_ma_simple_compact/ma-1-big-Data.db | Bin 0 -> 91 bytes .../ma-1-big-Digest.crc32 | 1 + .../ma-1-big-Filter.db | Bin 0 -> 24 bytes .../ma-1-big-Index.db | Bin 0 -> 26 bytes .../ma-1-big-Statistics.db | Bin 0 -> 4640 bytes .../ma-1-big-Summary.db | Bin 0 -> 47 bytes .../legacy_ma_simple_compact/ma-1-big-TOC.txt | 8 + .../ma-1-big-CompressionInfo.db | Bin 0 -> 43 bytes .../ma-1-big-Data.db | Bin 0 -> 114 bytes .../ma-1-big-Digest.crc32 | 1 + .../ma-1-big-Filter.db | Bin 0 -> 24 bytes .../ma-1-big-Index.db | Bin 0 -> 27 bytes .../ma-1-big-Statistics.db | Bin 0 -> 4649 bytes .../ma-1-big-Summary.db | Bin 0 -> 47 bytes .../ma-1-big-TOC.txt | 8 + .../AbstractSerializationsTester.java | 1 - .../apache/cassandra/db/DirectoriesTest.java | 104 ++-- .../cassandra/gms/SerializationsTest.java | 1 - .../CompressedRandomAccessReaderTest.java | 6 +- .../CompressedSequentialWriterTest.java | 4 +- .../io/sstable/LegacySSTableTest.java | 372 ++++++------ .../io/util/BufferedRandomAccessFileTest.java | 4 +- .../io/util/RandomAccessReaderTest.java | 2 +- .../RewindableDataInputStreamPlusTest.java | 539 +++++++++++++++++ .../cassandra/utils/BytesReadTrackerTest.java | 104 +++- 163 files changed, 1944 insertions(+), 387 deletions(-) create mode 100644 src/java/org/apache/cassandra/io/util/BytesReadTracker.java rename src/java/org/apache/cassandra/io/util/{FileMark.java => DataPosition.java} (96%) create mode 100644 src/java/org/apache/cassandra/io/util/RewindableDataInput.java create mode 100644 src/java/org/apache/cassandra/io/util/RewindableDataInputStreamPlus.java rename src/java/org/apache/cassandra/{utils/BytesReadTracker.java => io/util/TrackedDataInputPlus.java} (94%) create mode 100644 src/java/org/apache/cassandra/io/util/TrackedInputStream.java create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_compact/legacy_tables-legacy_jb_clust_compact-jb-1-CompressionInfo.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_compact/legacy_tables-legacy_jb_clust_compact-jb-1-Data.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_compact/legacy_tables-legacy_jb_clust_compact-jb-1-Filter.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_compact/legacy_tables-legacy_jb_clust_compact-jb-1-Index.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_compact/legacy_tables-legacy_jb_clust_compact-jb-1-Statistics.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_compact/legacy_tables-legacy_jb_clust_compact-jb-1-Summary.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_compact/legacy_tables-legacy_jb_clust_compact-jb-1-TOC.txt create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_counter_compact/legacy_tables-legacy_jb_clust_counter_compact-jb-1-CompressionInfo.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_counter_compact/legacy_tables-legacy_jb_clust_counter_compact-jb-1-Data.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_counter_compact/legacy_tables-legacy_jb_clust_counter_compact-jb-1-Filter.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_counter_compact/legacy_tables-legacy_jb_clust_counter_compact-jb-1-Index.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_counter_compact/legacy_tables-legacy_jb_clust_counter_compact-jb-1-Statistics.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_counter_compact/legacy_tables-legacy_jb_clust_counter_compact-jb-1-Summary.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_counter_compact/legacy_tables-legacy_jb_clust_counter_compact-jb-1-TOC.txt create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_compact/legacy_tables-legacy_jb_simple_compact-jb-1-CompressionInfo.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_compact/legacy_tables-legacy_jb_simple_compact-jb-1-Data.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_compact/legacy_tables-legacy_jb_simple_compact-jb-1-Filter.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_compact/legacy_tables-legacy_jb_simple_compact-jb-1-Index.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_compact/legacy_tables-legacy_jb_simple_compact-jb-1-Statistics.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_compact/legacy_tables-legacy_jb_simple_compact-jb-1-Summary.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_compact/legacy_tables-legacy_jb_simple_compact-jb-1-TOC.txt create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_counter_compact/legacy_tables-legacy_jb_simple_counter_compact-jb-1-CompressionInfo.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_counter_compact/legacy_tables-legacy_jb_simple_counter_compact-jb-1-Data.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_counter_compact/legacy_tables-legacy_jb_simple_counter_compact-jb-1-Filter.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_counter_compact/legacy_tables-legacy_jb_simple_counter_compact-jb-1-Index.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_counter_compact/legacy_tables-legacy_jb_simple_counter_compact-jb-1-Statistics.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_counter_compact/legacy_tables-legacy_jb_simple_counter_compact-jb-1-Summary.db create mode 100644 test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_counter_compact/legacy_tables-legacy_jb_simple_counter_compact-jb-1-TOC.txt create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_compact/legacy_tables-legacy_ka_clust_compact-ka-1-CompressionInfo.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_compact/legacy_tables-legacy_ka_clust_compact-ka-1-Data.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_compact/legacy_tables-legacy_ka_clust_compact-ka-1-Digest.sha1 create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_compact/legacy_tables-legacy_ka_clust_compact-ka-1-Filter.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_compact/legacy_tables-legacy_ka_clust_compact-ka-1-Index.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_compact/legacy_tables-legacy_ka_clust_compact-ka-1-Statistics.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_compact/legacy_tables-legacy_ka_clust_compact-ka-1-Summary.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_compact/legacy_tables-legacy_ka_clust_compact-ka-1-TOC.txt create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-CompressionInfo.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-Data.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-Digest.sha1 create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-Filter.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-Index.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-Statistics.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-Summary.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-TOC.txt create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-CompressionInfo.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Data.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Digest.sha1 create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Filter.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Index.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Statistics.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Summary.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-TOC.txt create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-CompressionInfo.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-Data.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-Digest.sha1 create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-Filter.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-Index.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-Statistics.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-Summary.db create mode 100644 test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-TOC.txt create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-CompressionInfo.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Data.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Digest.adler32 create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Filter.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Index.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Statistics.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Summary.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-TOC.txt create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_counter_compact/la-1-big-CompressionInfo.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_counter_compact/la-1-big-Data.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_counter_compact/la-1-big-Digest.adler32 create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_counter_compact/la-1-big-Filter.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_counter_compact/la-1-big-Index.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_counter_compact/la-1-big-Statistics.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_counter_compact/la-1-big-Summary.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_counter_compact/la-1-big-TOC.txt create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-CompressionInfo.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Data.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Digest.adler32 create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Filter.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Index.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Statistics.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Summary.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-TOC.txt create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_counter_compact/la-1-big-CompressionInfo.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_counter_compact/la-1-big-Data.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_counter_compact/la-1-big-Digest.adler32 create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_counter_compact/la-1-big-Filter.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_counter_compact/la-1-big-Index.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_counter_compact/la-1-big-Statistics.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_counter_compact/la-1-big-Summary.db create mode 100644 test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_counter_compact/la-1-big-TOC.txt create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_compact/ma-1-big-CompressionInfo.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_compact/ma-1-big-Data.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_compact/ma-1-big-Digest.crc32 create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_compact/ma-1-big-Filter.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_compact/ma-1-big-Index.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_compact/ma-1-big-Statistics.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_compact/ma-1-big-Summary.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_compact/ma-1-big-TOC.txt create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_counter_compact/ma-1-big-CompressionInfo.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_counter_compact/ma-1-big-Data.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_counter_compact/ma-1-big-Digest.crc32 create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_counter_compact/ma-1-big-Filter.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_counter_compact/ma-1-big-Index.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_counter_compact/ma-1-big-Statistics.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_counter_compact/ma-1-big-Summary.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_counter_compact/ma-1-big-TOC.txt create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-CompressionInfo.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-Data.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-Digest.crc32 create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-Filter.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-Index.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-Statistics.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-Summary.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-TOC.txt create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-CompressionInfo.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-Data.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-Digest.crc32 create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-Filter.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-Index.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-Statistics.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-Summary.db create mode 100644 test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-TOC.txt create mode 100644 test/unit/org/apache/cassandra/io/util/RewindableDataInputStreamPlusTest.java diff --git a/CHANGES.txt b/CHANGES.txt index defc25adb5..51cfc16bcd 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.5 + * Support streaming pre-3.0 sstables (CASSANDRA-10990) * Add backpressure to compressed commit log (CASSANDRA-10971) * SSTableExport supports secondary index tables (CASSANDRA-11330) * Fix sstabledump to include missing info in debug output (CASSANDRA-11321) diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index c564d8d73a..f28df1c04d 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -571,6 +571,8 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean // clear ephemeral snapshots that were not properly cleared last session (CASSANDRA-7357) clearEphemeralSnapshots(directories); + directories.removeTemporaryDirectories(); + logger.trace("Removing temporary or obsoleted files from unfinished operations for table {}", metadata.cfName); LifecycleTransaction.removeUnfinishedLeftovers(metadata); diff --git a/src/java/org/apache/cassandra/db/Directories.java b/src/java/org/apache/cassandra/db/Directories.java index 8744d43245..83321acb67 100644 --- a/src/java/org/apache/cassandra/db/Directories.java +++ b/src/java/org/apache/cassandra/db/Directories.java @@ -94,9 +94,11 @@ public class Directories public static final String BACKUPS_SUBDIR = "backups"; public static final String SNAPSHOT_SUBDIR = "snapshots"; + public static final String TMP_SUBDIR = "tmp"; public static final String SECONDARY_INDEX_NAME_SEPARATOR = "."; public static final DataDirectory[] dataDirectories; + static { String[] locations = DatabaseDescriptor.getAllDataFileLocations(); @@ -321,6 +323,34 @@ public class Directories return getLocationForDisk(getWriteableLocation(writeSize)); } + /** + * Returns a temporary subdirectory on non-blacklisted data directory + * that _currently_ has {@code writeSize} bytes as usable space. + * This method does not create the temporary directory. + * + * @throws IOError if all directories are blacklisted. + */ + public File getTemporaryWriteableDirectoryAsFile(long writeSize) + { + File location = getLocationForDisk(getWriteableLocation(writeSize)); + if (location == null) + return null; + return new File(location, TMP_SUBDIR); + } + + public void removeTemporaryDirectories() + { + for (File dataDir : dataPaths) + { + File tmpDir = new File(dataDir, TMP_SUBDIR); + if (tmpDir.exists()) + { + logger.debug("Removing temporary directory {}", tmpDir); + FileUtils.deleteRecursive(tmpDir); + } + } + } + /** * Returns a non-blacklisted data directory that _currently_ has {@code writeSize} bytes as usable space. * diff --git a/src/java/org/apache/cassandra/db/SerializationHeader.java b/src/java/org/apache/cassandra/db/SerializationHeader.java index 6e037564aa..0fd12813b6 100644 --- a/src/java/org/apache/cassandra/db/SerializationHeader.java +++ b/src/java/org/apache/cassandra/db/SerializationHeader.java @@ -70,6 +70,11 @@ public class SerializationHeader this.typeMap = typeMap; } + public static SerializationHeader makeWithoutStats(CFMetaData metadata) + { + return new SerializationHeader(true, metadata, metadata.partitionColumns(), EncodingStats.NO_STATS); + } + public static SerializationHeader forKeyCache(CFMetaData metadata) { // We don't save type information in the key cache (we could change diff --git a/src/java/org/apache/cassandra/db/Serializers.java b/src/java/org/apache/cassandra/db/Serializers.java index 9b29d89e4b..348fda3e6b 100644 --- a/src/java/org/apache/cassandra/db/Serializers.java +++ b/src/java/org/apache/cassandra/db/Serializers.java @@ -29,8 +29,6 @@ import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.utils.ByteBufferUtil; -import static org.apache.cassandra.io.sstable.IndexHelper.IndexInfo; - /** * Holds references on serializers that depend on the table definition. */ @@ -48,62 +46,77 @@ public class Serializers // unecessary (since IndexInfo.Serializer won't depend on the metadata either). public ISerializer indexEntryClusteringPrefixSerializer(final Version version, final SerializationHeader header) { - if (!version.storeRows()) + if (!version.storeRows() || header == null) //null header indicates streaming from pre-3.0 sstables { - return new ISerializer() - { - public void serialize(ClusteringPrefix clustering, DataOutputPlus out) throws IOException - { - // We should only use this for reading old sstable, never write new ones. - throw new UnsupportedOperationException(); - } - - public ClusteringPrefix deserialize(DataInputPlus in) throws IOException - { - // We're reading the old cellname/composite - ByteBuffer bb = ByteBufferUtil.readWithShortLength(in); - assert bb.hasRemaining(); // empty cellnames were invalid - - int clusteringSize = metadata.clusteringColumns().size(); - // If the table has no clustering column, then the cellname will just be the "column" name, which we ignore here. - if (clusteringSize == 0) - return Clustering.EMPTY; - - if (!metadata.isCompound()) - return new Clustering(bb); - - List components = CompositeType.splitName(bb); - byte eoc = CompositeType.lastEOC(bb); - - if (eoc == 0 || components.size() >= clusteringSize) - { - // That's a clustering. - if (components.size() > clusteringSize) - components = components.subList(0, clusteringSize); - - return new Clustering(components.toArray(new ByteBuffer[clusteringSize])); - } - else - { - // It's a range tombstone bound. It is a start since that's the only part we've ever included - // in the index entries. - Slice.Bound.Kind boundKind = eoc > 0 - ? Slice.Bound.Kind.EXCL_START_BOUND - : Slice.Bound.Kind.INCL_START_BOUND; - - return Slice.Bound.create(boundKind, components.toArray(new ByteBuffer[components.size()])); - } - } - - public long serializedSize(ClusteringPrefix clustering) - { - // We should only use this for reading old sstable, never write new ones. - throw new UnsupportedOperationException(); - } - }; + return oldFormatSerializer(version); } + return newFormatSerializer(version, header); + } + + private ISerializer oldFormatSerializer(final Version version) + { return new ISerializer() + { + SerializationHeader newHeader = SerializationHeader.makeWithoutStats(metadata); + + public void serialize(ClusteringPrefix clustering, DataOutputPlus out) throws IOException + { + //we deserialize in the old format and serialize in the new format + ClusteringPrefix.serializer.serialize(clustering, out, + version.correspondingMessagingVersion(), + newHeader.clusteringTypes()); + } + + public ClusteringPrefix deserialize(DataInputPlus in) throws IOException + { + // We're reading the old cellname/composite + ByteBuffer bb = ByteBufferUtil.readWithShortLength(in); + assert bb.hasRemaining(); // empty cellnames were invalid + + int clusteringSize = metadata.clusteringColumns().size(); + // If the table has no clustering column, then the cellname will just be the "column" name, which we ignore here. + if (clusteringSize == 0) + return Clustering.EMPTY; + + if (!metadata.isCompound()) + return new Clustering(bb); + + List components = CompositeType.splitName(bb); + byte eoc = CompositeType.lastEOC(bb); + + if (eoc == 0 || components.size() >= clusteringSize) + { + // That's a clustering. + if (components.size() > clusteringSize) + components = components.subList(0, clusteringSize); + + return new Clustering(components.toArray(new ByteBuffer[clusteringSize])); + } + else + { + // It's a range tombstone bound. It is a start since that's the only part we've ever included + // in the index entries. + Slice.Bound.Kind boundKind = eoc > 0 + ? Slice.Bound.Kind.EXCL_START_BOUND + : Slice.Bound.Kind.INCL_START_BOUND; + + return Slice.Bound.create(boundKind, components.toArray(new ByteBuffer[components.size()])); + } + } + + public long serializedSize(ClusteringPrefix clustering) + { + return ClusteringPrefix.serializer.serializedSize(clustering, version.correspondingMessagingVersion(), + newHeader.clusteringTypes()); + } + }; + } + + + private ISerializer newFormatSerializer(final Version version, final SerializationHeader header) + { + return new ISerializer() //Reading and writing from/to the new sstable format { public void serialize(ClusteringPrefix clustering, DataOutputPlus out) throws IOException { @@ -121,4 +134,5 @@ public class Serializers } }; } + } diff --git a/src/java/org/apache/cassandra/db/columniterator/AbstractSSTableIterator.java b/src/java/org/apache/cassandra/db/columniterator/AbstractSSTableIterator.java index 8ac3dcbe4b..0e2012ea13 100644 --- a/src/java/org/apache/cassandra/db/columniterator/AbstractSSTableIterator.java +++ b/src/java/org/apache/cassandra/db/columniterator/AbstractSSTableIterator.java @@ -30,7 +30,7 @@ import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.sstable.CorruptSSTableException; import org.apache.cassandra.io.sstable.IndexHelper; import org.apache.cassandra.io.util.FileDataInput; -import org.apache.cassandra.io.util.FileMark; +import org.apache.cassandra.io.util.DataPosition; import org.apache.cassandra.utils.ByteBufferUtil; abstract class AbstractSSTableIterator implements SliceableUnfilteredRowIterator @@ -401,7 +401,7 @@ abstract class AbstractSSTableIterator implements SliceableUnfilteredRowIterator private int currentIndexIdx; // Marks the beginning of the block corresponding to currentIndexIdx. - private FileMark mark; + private DataPosition mark; public IndexState(Reader reader, ClusteringComparator comparator, RowIndexEntry indexEntry, boolean reversed) { diff --git a/src/java/org/apache/cassandra/hints/ChecksummedDataInput.java b/src/java/org/apache/cassandra/hints/ChecksummedDataInput.java index 1dc6d1ecad..095d7f4109 100644 --- a/src/java/org/apache/cassandra/hints/ChecksummedDataInput.java +++ b/src/java/org/apache/cassandra/hints/ChecksummedDataInput.java @@ -22,13 +22,9 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.util.zip.CRC32; -import org.apache.cassandra.io.FSError; -import org.apache.cassandra.io.FSReadError; -import org.apache.cassandra.io.compress.ICompressor; import org.apache.cassandra.io.util.ChannelProxy; -import org.apache.cassandra.io.util.FileMark; +import org.apache.cassandra.io.util.DataPosition; import org.apache.cassandra.io.util.RandomAccessReader; -import org.apache.cassandra.schema.CompressionParams; /** * A {@link RandomAccessReader} wrapper that calctulates the CRC in place. @@ -48,7 +44,7 @@ public class ChecksummedDataInput extends RandomAccessReader.RandomAccessReaderW private boolean crcUpdateDisabled; private long limit; - private FileMark limitMark; + private DataPosition limitMark; protected ChecksummedDataInput(Builder builder) { diff --git a/src/java/org/apache/cassandra/hints/HintMessage.java b/src/java/org/apache/cassandra/hints/HintMessage.java index e78738d7b9..723ab6d6b2 100644 --- a/src/java/org/apache/cassandra/hints/HintMessage.java +++ b/src/java/org/apache/cassandra/hints/HintMessage.java @@ -33,7 +33,7 @@ import org.apache.cassandra.io.util.DataInputPlus; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.net.MessageOut; import org.apache.cassandra.net.MessagingService; -import org.apache.cassandra.utils.BytesReadTracker; +import org.apache.cassandra.io.util.TrackedDataInputPlus; import org.apache.cassandra.utils.UUIDSerializer; /** @@ -117,7 +117,7 @@ public final class HintMessage UUID hostId = UUIDSerializer.serializer.deserialize(in, version); long hintSize = in.readUnsignedVInt(); - BytesReadTracker countingIn = new BytesReadTracker(in); + TrackedDataInputPlus countingIn = new TrackedDataInputPlus(in); try { return new HintMessage(hostId, Hint.serializer.deserialize(countingIn, version)); diff --git a/src/java/org/apache/cassandra/io/compress/CompressedSequentialWriter.java b/src/java/org/apache/cassandra/io/compress/CompressedSequentialWriter.java index 14f1ba7795..9bd114550b 100644 --- a/src/java/org/apache/cassandra/io/compress/CompressedSequentialWriter.java +++ b/src/java/org/apache/cassandra/io/compress/CompressedSequentialWriter.java @@ -32,7 +32,7 @@ import org.apache.cassandra.io.FSWriteError; import org.apache.cassandra.io.sstable.CorruptSSTableException; import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.io.util.DataIntegrityMetadata; -import org.apache.cassandra.io.util.FileMark; +import org.apache.cassandra.io.util.DataPosition; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.SequentialWriter; import org.apache.cassandra.schema.CompressionParams; @@ -153,7 +153,7 @@ public class CompressedSequentialWriter extends SequentialWriter } @Override - public FileMark mark() + public DataPosition mark() { if (!buffer.hasRemaining()) doFlush(0); @@ -161,7 +161,7 @@ public class CompressedSequentialWriter extends SequentialWriter } @Override - public synchronized void resetAndTruncate(FileMark mark) + public synchronized void resetAndTruncate(DataPosition mark) { assert mark instanceof CompressedFileWriterMark; @@ -306,7 +306,7 @@ public class CompressedSequentialWriter extends SequentialWriter /** * Class to hold a mark to the position of the file */ - protected static class CompressedFileWriterMark implements FileMark + protected static class CompressedFileWriterMark implements DataPosition { // chunk offset in the compressed file final long chunkOffset; diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleIterator.java b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleIterator.java index 365d4693ba..f82db4ef42 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleIterator.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleIterator.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.io.IOError; import java.util.Iterator; +import org.apache.cassandra.io.util.RewindableDataInput; import org.apache.cassandra.utils.AbstractIterator; import org.apache.cassandra.config.CFMetaData; @@ -29,7 +30,7 @@ import org.apache.cassandra.db.*; import org.apache.cassandra.db.rows.*; import org.apache.cassandra.io.util.DataInputPlus; import org.apache.cassandra.io.util.FileDataInput; -import org.apache.cassandra.io.util.FileMark; +import org.apache.cassandra.io.util.DataPosition; import org.apache.cassandra.net.MessagingService; /** @@ -113,11 +114,9 @@ public abstract class SSTableSimpleIterator extends AbstractIterator // need to extract them. Which imply 2 passes (one to extract the static, then one for other value). if (metadata.isStaticCompactTable()) { - // Because we don't support streaming from old file version, the only case we should get there is for compaction, - // where the DataInput should be a file based one. - assert in instanceof FileDataInput; - FileDataInput file = (FileDataInput)in; - FileMark mark = file.mark(); + assert in instanceof RewindableDataInput; + RewindableDataInput file = (RewindableDataInput)in; + DataPosition mark = file.mark(); Row staticRow = LegacyLayout.extractStaticColumns(metadata, file, metadata.partitionColumns().statics); file.reset(mark); 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 8a778b710e..b9561ec631 100644 --- a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java @@ -427,7 +427,7 @@ public abstract class SSTableReader extends SSTable implements SelfRefCountedmaxMemBufferSize will be cached in memory (heap). If more than + * maxMemBufferSize bytes are read while the stream is marked, the + * following bytes are cached on the spillFile for up to maxDiskBufferSize. + * + * Please note that successive calls to {@link this#mark()} and {@link this#reset()} will write + * sequentially to the same spillFile until maxDiskBufferSize is reached. + * At this point, if less than maxDiskBufferSize bytes are currently cached on the + * spillFile, the remaining bytes are written to the beginning of the file, + * treating the spillFile as a circular buffer. + * + * If more than maxMemBufferSize + maxDiskBufferSize are cached while the stream is marked, + * the following {@link this#reset()} invocation will throw a {@link IllegalStateException}. + * + */ +public class RewindableDataInputStreamPlus extends FilterInputStream implements RewindableDataInput, Closeable +{ + private boolean marked = false; + private boolean exhausted = false; + private AtomicBoolean closed = new AtomicBoolean(false); + + protected int memAvailable = 0; + protected int diskTailAvailable = 0; + protected int diskHeadAvailable = 0; + + private final File spillFile; + private final int initialMemBufferSize; + private final int maxMemBufferSize; + private final int maxDiskBufferSize; + + private volatile byte memBuffer[]; + private int memBufferSize; + private RandomAccessFile spillBuffer; + + private final DataInputPlus dataReader; + + public RewindableDataInputStreamPlus(InputStream in, int initialMemBufferSize, int maxMemBufferSize, + File spillFile, int maxDiskBufferSize) + { + super(in); + dataReader = new DataInputStreamPlus(this); + this.initialMemBufferSize = initialMemBufferSize; + this.maxMemBufferSize = maxMemBufferSize; + this.spillFile = spillFile; + this.maxDiskBufferSize = maxDiskBufferSize; + } + + /* RewindableDataInput methods */ + + /** + * Marks the current position of a stream to return to this position later via the {@link this#reset(DataPosition)} method. + * @return An empty @link{DataPosition} object + */ + public DataPosition mark() + { + mark(0); + return new RewindableDataInputPlusMark(); + } + + /** + * Rewinds to the previously marked position via the {@link this#mark()} method. + * @param mark it's not possible to return to a custom position, so this parameter is ignored. + * @throws IOException if an error ocurs while resetting + */ + public void reset(DataPosition mark) throws IOException + { + reset(); + } + + public long bytesPastMark(DataPosition mark) + { + return maxMemBufferSize - memAvailable + (diskTailAvailable == -1? 0 : maxDiskBufferSize - diskHeadAvailable - diskTailAvailable); + } + + + protected static class RewindableDataInputPlusMark implements DataPosition + { + } + + /* InputStream methods */ + + public boolean markSupported() + { + return true; + } + + /** + * Marks the current position of a stream to return to this position + * later via the {@link this#reset()} method. + * @param readlimit the maximum amount of bytes to cache + */ + public synchronized void mark(int readlimit) + { + if (marked) + throw new IllegalStateException("Cannot mark already marked stream."); + + if (memAvailable > 0 || diskHeadAvailable > 0 || diskTailAvailable > 0) + throw new IllegalStateException("Can only mark stream after reading previously marked data."); + + marked = true; + memAvailable = maxMemBufferSize; + diskHeadAvailable = -1; + diskTailAvailable = -1; + } + + public synchronized void reset() throws IOException + { + if (!marked) + throw new IOException("Must call mark() before calling reset()."); + + if (exhausted) + throw new IOException(String.format("Read more than capacity: %d bytes.", maxMemBufferSize + maxDiskBufferSize)); + + memAvailable = maxMemBufferSize - memAvailable; + memBufferSize = memAvailable; + + if (diskTailAvailable == -1) + { + diskHeadAvailable = 0; + diskTailAvailable = 0; + } + else + { + int initialPos = diskTailAvailable > 0 ? 0 : (int)getIfNotClosed(spillBuffer).getFilePointer(); + int diskMarkpos = initialPos + diskHeadAvailable; + getIfNotClosed(spillBuffer).seek(diskMarkpos); + + diskHeadAvailable = diskMarkpos - diskHeadAvailable; + diskTailAvailable = (maxDiskBufferSize - diskTailAvailable) - diskMarkpos; + } + + marked = false; + } + + public int available() throws IOException + { + + return super.available() + (marked? 0 : memAvailable + diskHeadAvailable + diskTailAvailable); + } + + public int read() throws IOException + { + int read = readOne(); + if (read == -1) + return read; + + if (marked) + { + //mark exhausted + if (isExhausted(1)) + { + exhausted = true; + return read; + } + + writeOne(read); + } + + return read; + } + + public int read(byte[] b, int off, int len) throws IOException + { + int readBytes = readMulti(b, off, len); + if (readBytes == -1) + return readBytes; + + if (marked) + { + //check we have space on buffer + if (isExhausted(readBytes)) + { + exhausted = true; + return readBytes; + } + + writeMulti(b, off, readBytes); + } + + return readBytes; + } + + private void maybeCreateDiskBuffer() throws IOException + { + if (spillBuffer == null) + { + if (!spillFile.getParentFile().exists()) + spillFile.getParentFile().mkdirs(); + spillFile.createNewFile(); + + this.spillBuffer = new RandomAccessFile(spillFile, "rw"); + } + } + + + private int readOne() throws IOException + { + if (!marked) + { + if (memAvailable > 0) + { + int pos = memBufferSize - memAvailable; + memAvailable--; + return getIfNotClosed(memBuffer)[pos] & 0xff; + } + + if (diskTailAvailable > 0 || diskHeadAvailable > 0) + { + int read = getIfNotClosed(spillBuffer).read(); + if (diskTailAvailable > 0) + diskTailAvailable--; + else if (diskHeadAvailable > 0) + diskHeadAvailable++; + if (diskTailAvailable == 0) + spillBuffer.seek(0); + return read; + } + } + + return getIfNotClosed(in).read(); + } + + private boolean isExhausted(int readBytes) + { + return exhausted || readBytes > memAvailable + (long)(diskTailAvailable == -1? maxDiskBufferSize : diskTailAvailable + diskHeadAvailable); + } + + private int readMulti(byte[] b, int off, int len) throws IOException + { + int readBytes = 0; + if (!marked) + { + if (memAvailable > 0) + { + readBytes += memAvailable < len ? memAvailable : len; + int pos = memBufferSize - memAvailable; + System.arraycopy(memBuffer, pos, b, off, readBytes); + memAvailable -= readBytes; + off += readBytes; + len -= readBytes; + } + if (len > 0 && diskTailAvailable > 0) + { + int readFromTail = diskTailAvailable < len? diskTailAvailable : len; + getIfNotClosed(spillBuffer).read(b, off, readFromTail); + readBytes += readFromTail; + diskTailAvailable -= readFromTail; + off += readFromTail; + len -= readFromTail; + if (diskTailAvailable == 0) + spillBuffer.seek(0); + } + if (len > 0 && diskHeadAvailable > 0) + { + int readFromHead = diskHeadAvailable < len? diskHeadAvailable : len; + getIfNotClosed(spillBuffer).read(b, off, readFromHead); + readBytes += readFromHead; + diskHeadAvailable -= readFromHead; + off += readFromHead; + len -= readFromHead; + } + } + + if (len > 0) + readBytes += getIfNotClosed(in).read(b, off, len); + + return readBytes; + } + + private void writeMulti(byte[] b, int off, int len) throws IOException + { + if (memAvailable > 0) + { + if (memBuffer == null) + memBuffer = new byte[initialMemBufferSize]; + int pos = maxMemBufferSize - memAvailable; + int memWritten = memAvailable < len? memAvailable : len; + if (pos + memWritten >= getIfNotClosed(memBuffer).length) + growMemBuffer(pos, memWritten); + System.arraycopy(b, off, memBuffer, pos, memWritten); + off += memWritten; + len -= memWritten; + memAvailable -= memWritten; + } + + if (len > 0) + { + if (diskTailAvailable == -1) + { + maybeCreateDiskBuffer(); + diskHeadAvailable = (int)spillBuffer.getFilePointer(); + diskTailAvailable = maxDiskBufferSize - diskHeadAvailable; + } + + if (len > 0 && diskTailAvailable > 0) + { + int diskTailWritten = diskTailAvailable < len? diskTailAvailable : len; + getIfNotClosed(spillBuffer).write(b, off, diskTailWritten); + off += diskTailWritten; + len -= diskTailWritten; + diskTailAvailable -= diskTailWritten; + if (diskTailAvailable == 0) + spillBuffer.seek(0); + } + + if (len > 0 && diskTailAvailable > 0) + { + int diskHeadWritten = diskHeadAvailable < len? diskHeadAvailable : len; + getIfNotClosed(spillBuffer).write(b, off, diskHeadWritten); + } + } + } + + private void writeOne(int value) throws IOException + { + if (memAvailable > 0) + { + if (memBuffer == null) + memBuffer = new byte[initialMemBufferSize]; + int pos = maxMemBufferSize - memAvailable; + if (pos == getIfNotClosed(memBuffer).length) + growMemBuffer(pos, 1); + getIfNotClosed(memBuffer)[pos] = (byte)value; + memAvailable--; + return; + } + + if (diskTailAvailable == -1) + { + maybeCreateDiskBuffer(); + diskHeadAvailable = (int)spillBuffer.getFilePointer(); + diskTailAvailable = maxDiskBufferSize - diskHeadAvailable; + } + + if (diskTailAvailable > 0 || diskHeadAvailable > 0) + { + getIfNotClosed(spillBuffer).write(value); + if (diskTailAvailable > 0) + diskTailAvailable--; + else if (diskHeadAvailable > 0) + diskHeadAvailable--; + if (diskTailAvailable == 0) + spillBuffer.seek(0); + return; + } + } + + public int read(byte[] b) throws IOException + { + return read(b, 0, b.length); + } + + private void growMemBuffer(int pos, int writeSize) + { + int newSize = Math.min(2 * (pos + writeSize), maxMemBufferSize); + byte newBuffer[] = new byte[newSize]; + System.arraycopy(memBuffer, 0, newBuffer, 0, (int)pos); + memBuffer = newBuffer; + } + + public long skip(long n) throws IOException + { + long skipped = 0; + + if (marked) + { + //if marked, we need to cache skipped bytes + while (n-- > 0 && read() != -1) + { + skipped++; + } + return skipped; + } + + if (memAvailable > 0) + { + skipped += memAvailable < n ? memAvailable : n; + memAvailable -= skipped; + n -= skipped; + } + if (n > 0 && diskTailAvailable > 0) + { + int skipFromTail = diskTailAvailable < n? diskTailAvailable : (int)n; + getIfNotClosed(spillBuffer).skipBytes(skipFromTail); + diskTailAvailable -= skipFromTail; + skipped += skipFromTail; + n -= skipFromTail; + if (diskTailAvailable == 0) + spillBuffer.seek(0); + } + if (n > 0 && diskHeadAvailable > 0) + { + int skipFromHead = diskHeadAvailable < n? diskHeadAvailable : (int)n; + getIfNotClosed(spillBuffer).skipBytes(skipFromHead); + diskHeadAvailable -= skipFromHead; + skipped += skipFromHead; + n -= skipFromHead; + } + + if (n > 0) + skipped += getIfNotClosed(in).skip(n); + + return skipped; + } + + private T getIfNotClosed(T in) throws IOException { + if (closed.get()) + throw new IOException("Stream closed"); + return in; + } + + public void close() throws IOException + { + close(true); + } + + public void close(boolean closeUnderlying) throws IOException + { + if (closed.compareAndSet(false, true)) + { + Throwable fail = null; + if (closeUnderlying) + { + try + { + super.close(); + } + catch (IOException e) + { + fail = merge(fail, e); + } + } + try + { + if (spillBuffer != null) + { + this.spillBuffer.close(); + this.spillBuffer = null; + } + } catch (IOException e) + { + fail = merge(fail, e); + } + try { + if (spillFile.exists()) + { + spillFile.delete(); + } + } + catch (Throwable e) + { + fail = merge(fail, e); + } + maybeFail(fail, IOException.class); + } + } + + /* DataInputPlus methods */ + + public void readFully(byte[] b) throws IOException + { + dataReader.readFully(b); + } + + public void readFully(byte[] b, int off, int len) throws IOException + { + dataReader.readFully(b, off, len); + } + + public int skipBytes(int n) throws IOException + { + return dataReader.skipBytes(n); + } + + public boolean readBoolean() throws IOException + { + return dataReader.readBoolean(); + } + + public byte readByte() throws IOException + { + return dataReader.readByte(); + } + + public int readUnsignedByte() throws IOException + { + return dataReader.readUnsignedByte(); + } + + public short readShort() throws IOException + { + return dataReader.readShort(); + } + + public int readUnsignedShort() throws IOException + { + return dataReader.readUnsignedShort(); + } + + public char readChar() throws IOException + { + return dataReader.readChar(); + } + + public int readInt() throws IOException + { + return dataReader.readInt(); + } + + public long readLong() throws IOException + { + return dataReader.readLong(); + } + + public float readFloat() throws IOException + { + return dataReader.readFloat(); + } + + public double readDouble() throws IOException + { + return dataReader.readDouble(); + } + + public String readLine() throws IOException + { + return dataReader.readLine(); + } + + public String readUTF() throws IOException + { + return dataReader.readUTF(); + } +} diff --git a/src/java/org/apache/cassandra/io/util/SequentialWriter.java b/src/java/org/apache/cassandra/io/util/SequentialWriter.java index dd4986812f..26316a2432 100644 --- a/src/java/org/apache/cassandra/io/util/SequentialWriter.java +++ b/src/java/org/apache/cassandra/io/util/SequentialWriter.java @@ -297,7 +297,7 @@ public class SequentialWriter extends BufferedDataOutputStreamPlus implements Tr return bufferOffset + (buffer == null ? 0 : buffer.position()); } - public FileMark mark() + public DataPosition mark() { return new BufferedFileWriterMark(current()); } @@ -306,7 +306,7 @@ public class SequentialWriter extends BufferedDataOutputStreamPlus implements Tr * Drops all buffered data that's past the limits of our new file mark + buffer capacity, or syncs and truncates * the underlying file to the marked position */ - public void resetAndTruncate(FileMark mark) + public void resetAndTruncate(DataPosition mark) { assert mark instanceof BufferedFileWriterMark; @@ -404,7 +404,7 @@ public class SequentialWriter extends BufferedDataOutputStreamPlus implements Tr /** * Class to hold a mark to the position of the file */ - protected static class BufferedFileWriterMark implements FileMark + protected static class BufferedFileWriterMark implements DataPosition { final long pointer; diff --git a/src/java/org/apache/cassandra/utils/BytesReadTracker.java b/src/java/org/apache/cassandra/io/util/TrackedDataInputPlus.java similarity index 94% rename from src/java/org/apache/cassandra/utils/BytesReadTracker.java rename to src/java/org/apache/cassandra/io/util/TrackedDataInputPlus.java index 5e98b25f19..dc5bbb6599 100644 --- a/src/java/org/apache/cassandra/utils/BytesReadTracker.java +++ b/src/java/org/apache/cassandra/io/util/TrackedDataInputPlus.java @@ -15,24 +15,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.cassandra.utils; +package org.apache.cassandra.io.util; import java.io.DataInput; import java.io.DataInputStream; import java.io.IOException; -import org.apache.cassandra.io.util.DataInputPlus; - /** * This class is to track bytes read from given DataInput */ -public class BytesReadTracker implements DataInputPlus +public class TrackedDataInputPlus implements DataInputPlus, BytesReadTracker { - private long bytesRead; final DataInput source; - public BytesReadTracker(DataInput source) + public TrackedDataInputPlus(DataInput source) { this.source = source; } diff --git a/src/java/org/apache/cassandra/io/util/TrackedInputStream.java b/src/java/org/apache/cassandra/io/util/TrackedInputStream.java new file mode 100644 index 0000000000..f398d3093e --- /dev/null +++ b/src/java/org/apache/cassandra/io/util/TrackedInputStream.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.cassandra.io.util; + +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * This class is to track bytes read from given DataInputStream + */ +public class TrackedInputStream extends FilterInputStream implements BytesReadTracker +{ + private long bytesRead; + + public TrackedInputStream(InputStream source) + { + super(source); + } + + public long getBytesRead() + { + return bytesRead; + } + + /** + * reset counter to @param count + */ + public void reset(long count) + { + bytesRead = count; + } + + public int read() throws IOException + { + int read = super.read(); + bytesRead += 1; + return read; + } + + public int read(byte[] b, int off, int len) throws IOException + { + int read = super.read(b, off, len); + bytesRead += read; + return read; + } + + public int read(byte[] b) throws IOException + { + int read = super.read(b); + bytesRead += read; + return read; + } + + public long skip(long n) throws IOException + { + long skip = super.skip(n); + bytesRead += skip; + return skip; + } +} diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index f445e25fce..fd7f4b67c9 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -4221,6 +4221,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE return Collections.unmodifiableList(keyspaceNamesList); } + public List getNonSystemKeyspaces() { List keyspaceNamesList = new ArrayList<>(Schema.instance.getNonSystemKeyspaces()); diff --git a/src/java/org/apache/cassandra/streaming/StreamReader.java b/src/java/org/apache/cassandra/streaming/StreamReader.java index 268f974240..f8db26bd70 100644 --- a/src/java/org/apache/cassandra/streaming/StreamReader.java +++ b/src/java/org/apache/cassandra/streaming/StreamReader.java @@ -40,10 +40,13 @@ import org.apache.cassandra.io.sstable.SSTableMultiWriter; import org.apache.cassandra.io.sstable.SSTableSimpleIterator; import org.apache.cassandra.io.sstable.format.SSTableFormat; import org.apache.cassandra.io.sstable.format.Version; +import org.apache.cassandra.io.util.RewindableDataInputStreamPlus; import org.apache.cassandra.io.util.DataInputPlus; +import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.streaming.messages.FileMessageHeader; import org.apache.cassandra.utils.ByteBufferUtil; -import org.apache.cassandra.utils.BytesReadTracker; +import org.apache.cassandra.io.util.TrackedInputStream; +import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.Pair; @@ -105,9 +108,9 @@ public class StreamReader session.planId(), fileSeqNum, session.peer, repairedAt, totalSize, cfs.keyspace.getName(), cfs.getColumnFamilyName()); - DataInputStream dis = new DataInputStream(new LZFInputStream(Channels.newInputStream(channel))); - BytesReadTracker in = new BytesReadTracker(dis); - StreamDeserializer deserializer = new StreamDeserializer(cfs.metadata, in, inputVersion, header.toHeader(cfs.metadata)); + TrackedInputStream in = new TrackedInputStream(new LZFInputStream(Channels.newInputStream(channel))); + StreamDeserializer deserializer = new StreamDeserializer(cfs.metadata, in, inputVersion, getHeader(cfs.metadata), + totalSize, session.planId()); SSTableMultiWriter writer = null; try { @@ -131,12 +134,22 @@ public class StreamReader { writer.abort(e); } - drain(dis, in.getBytesRead()); + drain(in, in.getBytesRead()); if (e instanceof IOException) throw (IOException) e; else throw Throwables.propagate(e); } + finally + { + if (deserializer != null) + deserializer.cleanup(); + } + } + + protected SerializationHeader getHeader(CFMetaData metadata) + { + return header != null? header.toHeader(metadata) : null; //pre-3.0 sstable have no SerializationHeader } protected SSTableMultiWriter createWriter(ColumnFamilyStore cfs, long totalSize, long repairedAt, SSTableFormat.Type format) throws IOException @@ -146,8 +159,7 @@ public class StreamReader throw new IOException("Insufficient disk space to store " + totalSize + " bytes"); desc = Descriptor.fromFilename(cfs.getSSTablePath(cfs.getDirectories().getLocationForDisk(localDir), format)); - - return cfs.createSSTableMultiWriter(desc, estimatedKeys, repairedAt, sstableLevel, header.toHeader(cfs.metadata), session.getTransaction(cfId)); + return cfs.createSSTableMultiWriter(desc, estimatedKeys, repairedAt, sstableLevel, getHeader(cfs.metadata), session.getTransaction(cfId)); } protected void drain(InputStream dis, long bytesRead) throws IOException @@ -185,6 +197,13 @@ public class StreamReader public static class StreamDeserializer extends UnmodifiableIterator implements UnfilteredRowIterator { + public static final int INITIAL_MEM_BUFFER_SIZE = Integer.getInteger("cassandra.streamdes.initial_mem_buffer_size", 32768); + public static final int MAX_MEM_BUFFER_SIZE = Integer.getInteger("cassandra.streamdes.max_mem_buffer_size", 1048576); + public static final int MAX_SPILL_FILE_SIZE = Integer.getInteger("cassandra.streamdes.max_spill_file_size", Integer.MAX_VALUE); + + public static final String BUFFER_FILE_PREFIX = "buf"; + public static final String BUFFER_FILE_SUFFIX = "dat"; + private final CFMetaData metadata; private final DataInputPlus in; private final SerializationHeader header; @@ -196,11 +215,20 @@ public class StreamReader private Row staticRow; private IOException exception; - public StreamDeserializer(CFMetaData metadata, DataInputPlus in, Version version, SerializationHeader header) + public StreamDeserializer(CFMetaData metadata, InputStream in, Version version, SerializationHeader header, + long totalSize, UUID sessionId) throws IOException { - assert version.storeRows() : "We don't allow streaming from pre-3.0 nodes"; this.metadata = metadata; - this.in = in; + // streaming pre-3.0 sstables require mark/reset support from source stream + if (version.correspondingMessagingVersion() < MessagingService.VERSION_30) + { + logger.trace("Initializing rewindable input stream for reading legacy sstable with {} bytes with following " + + "parameters: initial_mem_buffer_size={}, max_mem_buffer_size={}, max_spill_file_size={}.", + totalSize, INITIAL_MEM_BUFFER_SIZE, MAX_MEM_BUFFER_SIZE, MAX_SPILL_FILE_SIZE); + File bufferFile = getTempBufferFile(metadata, totalSize, sessionId); + this.in = new RewindableDataInputStreamPlus(in, INITIAL_MEM_BUFFER_SIZE, MAX_MEM_BUFFER_SIZE, bufferFile, MAX_SPILL_FILE_SIZE); + } else + this.in = new DataInputPlus.DataInputStreamPlus(in); this.helper = new SerializationHelper(metadata, version.correspondingMessagingVersion(), SerializationHelper.Flag.PRESERVE_SIZE); this.header = header; } @@ -292,5 +320,41 @@ public class StreamReader public void close() { } + + /* We have a separate cleanup method because sometimes close is called before exhausting the + StreamDeserializer (for instance, when enclosed in an try-with-resources wrapper, such as in + BigTableWriter.append()). + */ + public void cleanup() + { + if (in instanceof RewindableDataInputStreamPlus) + { + try + { + ((RewindableDataInputStreamPlus) in).close(false); + } + catch (IOException e) + { + logger.warn("Error while closing RewindableDataInputStreamPlus.", e); + } + } + } + + private static File getTempBufferFile(CFMetaData metadata, long totalSize, UUID sessionId) throws IOException + { + ColumnFamilyStore cfs = Keyspace.open(metadata.ksName).getColumnFamilyStore(metadata.cfName); + if (cfs == null) + { + // schema was dropped during streaming + throw new RuntimeException(String.format("CF %s.%s was dropped during streaming", metadata.ksName, metadata.cfName)); + } + + long maxSize = Math.min(MAX_SPILL_FILE_SIZE, totalSize); + File tmpDir = cfs.getDirectories().getTemporaryWriteableDirectoryAsFile(maxSize); + if (tmpDir == null) + throw new IOException(String.format("No sufficient disk space to stream legacy sstable from {}.{}. " + + "Required disk space: %s.", FBUtilities.prettyPrintMemory(maxSize))); + return new File(tmpDir, String.format("%s-%s.%s", BUFFER_FILE_PREFIX, sessionId, BUFFER_FILE_SUFFIX)); + } } } diff --git a/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java b/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java index 5210d5b23c..9719587f25 100644 --- a/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java +++ b/src/java/org/apache/cassandra/streaming/compress/CompressedStreamReader.java @@ -24,7 +24,6 @@ import java.nio.channels.ReadableByteChannel; import com.google.common.base.Throwables; -import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.io.sstable.SSTableMultiWriter; import org.slf4j.Logger; @@ -38,7 +37,7 @@ import org.apache.cassandra.streaming.ProgressInfo; import org.apache.cassandra.streaming.StreamReader; import org.apache.cassandra.streaming.StreamSession; import org.apache.cassandra.streaming.messages.FileMessageHeader; -import org.apache.cassandra.utils.BytesReadTracker; +import org.apache.cassandra.io.util.TrackedInputStream; import org.apache.cassandra.utils.Pair; /** @@ -83,8 +82,10 @@ public class CompressedStreamReader extends StreamReader CompressedInputStream cis = new CompressedInputStream(Channels.newInputStream(channel), compressionInfo, inputVersion.compressedChecksumType(), cfs::getCrcCheckChance); - BytesReadTracker in = new BytesReadTracker(new DataInputStream(cis)); - StreamDeserializer deserializer = new StreamDeserializer(cfs.metadata, in, inputVersion, header.toHeader(cfs.metadata)); + TrackedInputStream in = new TrackedInputStream(cis); + + StreamDeserializer deserializer = new StreamDeserializer(cfs.metadata, in, inputVersion, getHeader(cfs.metadata), + totalSize, session.planId()); SSTableMultiWriter writer = null; try { @@ -115,17 +116,22 @@ public class CompressedStreamReader extends StreamReader { if (deserializer != null) logger.warn("[Stream {}] Error while reading partition {} from stream on ks='{}' and table='{}'.", - session.planId(), deserializer.partitionKey(), cfs.keyspace.getName(), cfs.getColumnFamilyName()); + session.planId(), deserializer.partitionKey(), cfs.keyspace.getName(), cfs.getTableName()); if (writer != null) { writer.abort(e); } - drain(cis, in.getBytesRead()); + drain(in, in.getBytesRead()); if (e instanceof IOException) throw (IOException) e; else throw Throwables.propagate(e); } + finally + { + if (deserializer != null) + deserializer.cleanup(); + } } @Override diff --git a/src/java/org/apache/cassandra/streaming/messages/FileMessageHeader.java b/src/java/org/apache/cassandra/streaming/messages/FileMessageHeader.java index e1e13b7bde..2b5047d766 100644 --- a/src/java/org/apache/cassandra/streaming/messages/FileMessageHeader.java +++ b/src/java/org/apache/cassandra/streaming/messages/FileMessageHeader.java @@ -204,7 +204,7 @@ public class FileMessageHeader out.writeLong(header.repairedAt); out.writeInt(header.sstableLevel); - if (version >= StreamMessage.VERSION_30) + if (version >= StreamMessage.VERSION_30 && header.version.storeRows()) SerializationHeader.serializer.serialize(header.version, header.header, out); return compressionInfo; } @@ -227,7 +227,7 @@ public class FileMessageHeader CompressionInfo compressionInfo = CompressionInfo.serializer.deserialize(in, MessagingService.current_version); long repairedAt = in.readLong(); int sstableLevel = in.readInt(); - SerializationHeader.Component header = version >= StreamMessage.VERSION_30 + SerializationHeader.Component header = version >= StreamMessage.VERSION_30 && sstableVersion.storeRows() ? SerializationHeader.serializer.deserialize(sstableVersion, in) : null; diff --git a/src/java/org/apache/cassandra/tools/nodetool/Repair.java b/src/java/org/apache/cassandra/tools/nodetool/Repair.java index 84b463cf90..bd1a916dc0 100644 --- a/src/java/org/apache/cassandra/tools/nodetool/Repair.java +++ b/src/java/org/apache/cassandra/tools/nodetool/Repair.java @@ -56,7 +56,7 @@ public class Repair extends NodeToolCmd private boolean localDC = false; @Option(title = "specific_dc", name = {"-dc", "--in-dc"}, description = "Use -dc to repair specific datacenters") - private List specificDataCenters = new ArrayList<>(); + private List specificDataCenters = new ArrayList<>();; @Option(title = "specific_host", name = {"-hosts", "--in-hosts"}, description = "Use -hosts to repair specific hosts") private List specificHosts = new ArrayList<>(); diff --git a/src/java/org/apache/cassandra/utils/CloseableIterator.java b/src/java/org/apache/cassandra/utils/CloseableIterator.java index a7c4300dbd..57034ae609 100644 --- a/src/java/org/apache/cassandra/utils/CloseableIterator.java +++ b/src/java/org/apache/cassandra/utils/CloseableIterator.java @@ -17,7 +17,6 @@ */ package org.apache.cassandra.utils; -import java.io.Closeable; import java.util.Iterator; // so we can instantiate anonymous classes implementing both interfaces diff --git a/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_compact/legacy_tables-legacy_jb_clust_compact-jb-1-CompressionInfo.db b/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_compact/legacy_tables-legacy_jb_clust_compact-jb-1-CompressionInfo.db new file mode 100644 index 0000000000000000000000000000000000000000..5eddda7cad0a85fa3d9714c257a569fa71e2a944 GIT binary patch literal 83 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 Uu4=}8_sxBqc0?MRU9B+te_{&OZ~y=R literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_compact/legacy_tables-legacy_jb_clust_compact-jb-1-Statistics.db b/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_compact/legacy_tables-legacy_jb_clust_compact-jb-1-Statistics.db new file mode 100644 index 0000000000000000000000000000000000000000..ab83acce520652cd7bdfc840951e4434adfed1ef GIT binary patch literal 6791 zcmeI!Sx8i27zW^T&dj)_Q!`qok+@`w#Aq(5kxl7@8iA%Qwo#Kaq(Le(Lzx+d*^Pu* zR2F2mfP_WTt`-$o+P+9+MTNm+QPfnlXhoBy;`e@+T}09G=A4K3cR2t434%~1^!|x` z&;AFu)F1Rc70gOz6|)PoE3+H32eT)$npwl_!#tdMBy$LJ7;_}^Wabp+xy;L%iN&%%x}r`+dc3%$0M{swlKe0@{`J*X=9j9<69k2YT>Ew019g z*aEbF8#*u?J-P<1%R2Fx7+eeT^yV!%7d#jM%r zYFwY9;~wNvChlkHDq4|s6WS}4xc-%Qu0yW6Tmg1@TL*T_bb{T#o56#=dxO;`T#p*V z3&?#Mhk=Jb@duA=&j5$q!ubyC!ugJ>JP+*?I-Y@NOvCS+?{9~E#cM5ieOf(uS9ct^ z;UbRD;|3T{(PPL*+FsNrZvvMD9|T`(j-ZytoQCsN+M&KnbA^8)tPe%wVt1M=3*Dzs zs}{9Ge_ir(3u*4!VE;tzZkYaodQd?f}*?QNP5QKYs|d&h>tdiGU!@1*&NLt9=_ z2SukGqaJgA-el_V+c`(5}GP+AYfM7?TJlU(2aylFM@ z%-!{e>Gv#j#K+L}oR?v!tt9QsmNm3?5bt^P_-rllx%~&~>G#^3!`fm8a#6eC`nN>l z)D<7UmJV33_Pyg7+%wOl&Cgef`G2Xodha|zh-CeTJ>HYaH5Uw!Tyw#22)|u(_5O@p zbICOqSx}-}a~&hYA^h2zOUzgjbYrxjF6|an+^cI*|9m-+dnR9A7=hmV8*r2ey1^$rtxOQ@s2D Dfod|4 literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_compact/legacy_tables-legacy_jb_clust_compact-jb-1-Summary.db b/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_compact/legacy_tables-legacy_jb_clust_compact-jb-1-Summary.db new file mode 100644 index 0000000000000000000000000000000000000000..896a5296981a49ea518a5d9216dd991f1a5c2db4 GIT binary patch literal 71 vcmZQzU}#`qU|nki`n+K`G`02!rh~gyu4V(7ek4txpJ` literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_counter_compact/legacy_tables-legacy_jb_clust_counter_compact-jb-1-Data.db b/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_counter_compact/legacy_tables-legacy_jb_clust_counter_compact-jb-1-Data.db new file mode 100644 index 0000000000000000000000000000000000000000..b511d3076778edeed7b964719fd3a5608297c78c GIT binary patch literal 4228 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 literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_counter_compact/legacy_tables-legacy_jb_clust_counter_compact-jb-1-Statistics.db b/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_clust_counter_compact/legacy_tables-legacy_jb_clust_counter_compact-jb-1-Statistics.db new file mode 100644 index 0000000000000000000000000000000000000000..aa3c75748741a05572b94b0470ba02b4c498f003 GIT binary patch literal 6791 zcmeI!eN4=890%~;GL4dlW>-qmh9lQ1vz1Gnr{#1vWm9(DNEl20i6w^E zsIavblV=snA5oqknhC?QofzXV4<+lIUCrnH`O_c9{QBqjd+q)0_WM461VJbl+<#)< zv;V;@^#^@V1+$V_#q7cC$?V1K!|cnfW)5HuVjjvof;o&if;pObDswXPeC8F*8<_Vn zpJr}Hi)=o`$t<@qH=(5=%tdGg`+da$%#|5vRSeo=8rqZf*Q*C}pH{T513hpnT2qA{ zya*lKh8`J-9#e_d8qskF(FqsPX@k(qhN1K4qDxHZYPNn`^_V+C`t06EV#o)`MdLj5 zL0q4r;{oJSI__ubI$B}84egamT>r{@Hz8MDEd_hLuLXOhJHg()7Vv=HK(N}3>oGw8 z3i6}qo}2^=iz*n_NwpGToGIV>qF77)SKqY0`KY6 zswM5vUyr<;0-Af)+rLnI>k~gw4+v?5{p4rV+@-m{BBg~oFfJU{^AL6SKAI0dy7M*l zs7cAEsK-8BFqJy;ZuW8N_+=X_sP&Jd7El{1SH)6ig`b;2z2=)=Cw1wS+9c|u>H9;e zZNqyNkXT_8 z?YoGTqwi=^sJps0(D_k)E!#uy56|&|oij;$ukw?HXNY}L54Bi{eKSkn(f+F+1-z#H z54e|nT0`0oGL@{R_rb6lU89!dA=f%JbiPJ^OiC#s`GgEdIIRa_W8So=Nv>;u*|?T? z&VjmP^m`UN;$!K0&Nb+(%Sij;<@K!{#1&7TUaTf=I((##ey_bbqAl)ME^4;i{GLFZ zvhs6J(Ju@6eeZY%yXKj+`S~g_|1UL{`_2=DXx4w&fzhD;|Ns9D42%r_g_z3{a~K#{H4o1fD`{(h*v25XHpd1K+XTo~FnVy7fprH%09aq)G4VS9)>aw@ literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_compact/legacy_tables-legacy_jb_simple_compact-jb-1-Filter.db b/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_compact/legacy_tables-legacy_jb_simple_compact-jb-1-Filter.db new file mode 100644 index 0000000000000000000000000000000000000000..c3cb27ca204cbc779b7b25014f9909eaa3edf034 GIT binary patch literal 24 fcmZQzU|?lnU|?$GU^Eg*bYe_ka#Uwva9{uc8Bzj< literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_compact/legacy_tables-legacy_jb_simple_compact-jb-1-Index.db b/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_compact/legacy_tables-legacy_jb_simple_compact-jb-1-Index.db new file mode 100644 index 0000000000000000000000000000000000000000..d2ec21831e198cf32d6b0b426affb63e09a64a43 GIT binary patch literal 75 kcmZQzG+;mmjD}F29++k{f^uUZTw^G=3&J&la(94e08W1b%m4rY literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_compact/legacy_tables-legacy_jb_simple_compact-jb-1-Statistics.db b/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_compact/legacy_tables-legacy_jb_simple_compact-jb-1-Statistics.db new file mode 100644 index 0000000000000000000000000000000000000000..792e73322ff74b833254d5bb2a589e7a0b2a335d GIT binary patch literal 4395 zcmeI!>q}E%90%}o*>svNH?7Q2x_BpMXl6mW)QK8_rj>T1PHv=9Dsz;Xp_sjqFpJED z>?vMy|A>qC6N^s2Fs$TRg`H(OL7N)-{(Jwwl~lDobR)7p4-`v8cUT@rB$F>@oWgh&kz6ISCqKL zQ7hLCz<6B>^Gay$+F>20b~7Y>rJfYf1?R~#Tl;|KUSetwwRcPq?B{9f(Ze*Kac2KJ z>RIzs&QXUv$y!Vu@gTRAdeO#RN2v|Z=4DZ59NQXAofC9v3H7!go5x5`hPI}w7yG6@_<`ITDo3=Uy@U+Nj`U_Er`|w(NXVv)Fjsryy@CbyzEF@ z3w@rownfo&KNn;enrcb^s!biegTzOlzqryweD&n1Hu}8Q?(qJYiJaH&zWXbII5q#< z&&mmN#g1$F9js(5cNOFdNBh6jT=K9Z0oW=HfFp%(@rMsVhf0WmtEkMpg8;jU22fx7+Rds?t}-5ryW> zI;lv?$u;S6q~cf%01?(2asU7T literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_counter_compact/legacy_tables-legacy_jb_simple_counter_compact-jb-1-Filter.db b/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_counter_compact/legacy_tables-legacy_jb_simple_counter_compact-jb-1-Filter.db new file mode 100644 index 0000000000000000000000000000000000000000..c3cb27ca204cbc779b7b25014f9909eaa3edf034 GIT binary patch literal 24 fcmZQzU|?lnU|?$GU^Eg*bYe_ka#Uwva9{uc8Bzj< literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_counter_compact/legacy_tables-legacy_jb_simple_counter_compact-jb-1-Index.db b/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_counter_compact/legacy_tables-legacy_jb_simple_counter_compact-jb-1-Index.db new file mode 100644 index 0000000000000000000000000000000000000000..48c153cd3c283731cabf57382602580449da01b7 GIT binary patch literal 75 lcmZQzG+;mmjD}F2KbU4Tf^z3UxW-WKTL{+#!ez7p(Ewvj0~Y`Q literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_counter_compact/legacy_tables-legacy_jb_simple_counter_compact-jb-1-Statistics.db b/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_counter_compact/legacy_tables-legacy_jb_simple_counter_compact-jb-1-Statistics.db new file mode 100644 index 0000000000000000000000000000000000000000..86570509f7b6bebff3c858c075b76f30745ab551 GIT binary patch literal 4395 zcmeI!|4+iVLx8Yy3zT_%Z5o$9PITPbqBEg#)YHOj7A62_8WVu?v? zzS|nH8lf**eu(lVN;6?<*-ngc7%9=Qb)R`X-+zH0?tXc{ANPFU?eqS2_u@FNnwxm> z_Ev6K3vys@MaBxoO2$r%of*3@c4O?pSjE_zu`lBQ#=(rIGmc<9kMUy0$#%>0&Sdh< zjCV1vV%)&E56v_C!7pHPGvhY2Fqv^FT4cUoJc+qt6Xv?^b`NQR`{b!t_t4x+OzEKZi3x}EJXtk*oaR$5AAV0g zZGQ4K>Y2}1FQ$&{$*H4Wv~l-oYTe7ZtEtn^Y>lSQ4!^mCy6C6p5Ou}f+9c}B87D%i zA61tfq8`4{yOfxp<+-VuIy*6u-haL}t&!e;-gZ<)@4sNQ4BR507Y47yl@N<&-g1Ok z5!S6vp&l98MfXSfqq2(re>l(f8Hy+4U8=8^Tqkx*J=b9(_Q3)TMO-d;z`J7eOa9R&UM}6o}kzCvNwq-l<@{{#f z=<}?zE{dk-IX_)jQ%S~`ZEETqBtHGBzqN+A?fiv$`n;C*h~AigIj`Q=^(%omCGY!K z=|6LY_P+cZtYj+0qKh*2eL>ri~$7Zu>%Sv7+)%ot!_7)%boud!qA`48LHPSXI zJIAQWmI@1{e1l2S7;?;-gdJvMs>xt984YQY$((D>Eyy>@#f*W>pXbCPY0KX?COUrr DP9#MS literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_counter_compact/legacy_tables-legacy_jb_simple_counter_compact-jb-1-Summary.db b/test/data/legacy-sstables/jb/legacy_tables/legacy_jb_simple_counter_compact/legacy_tables-legacy_jb_simple_counter_compact-jb-1-Summary.db new file mode 100644 index 0000000000000000000000000000000000000000..af5e7816e2580bebfb5228c8b3a3511bcf6274b1 GIT binary patch literal 71 ucmZQzU}#`qU|8 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 Uu4=}8_sxBqc0?MRU9B+te_{&OZ~y=R literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_compact/legacy_tables-legacy_ka_clust_compact-ka-1-Statistics.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_compact/legacy_tables-legacy_ka_clust_compact-ka-1-Statistics.db new file mode 100644 index 0000000000000000000000000000000000000000..ab55258e8861452a53a39d8dddf6ed4116be0beb GIT binary patch literal 6859 zcmeI$Ye-X3902fp?%mupw{)7OrajG+nC2rDw52W72sEv<7q#3-g*4_Uv!XEVgM?XB z7W57zOp>(nk=X}J?WHA=6&VYbg;A?0vohD6oB02qzV#uB?uE-ezx~hM&OP@${)}N5 zj6Dq8{CrKWRm${Q$er+kQV9pxTuLcI?%mx>!Gw_vlLl#8%A>ifB4I4-h|PjHCC0QjOqEVhJt zUg>uncWTFWHe-)3!B(8Y_E?GS-HkmZ7<=YPY-I*^9#wXN}eK3V}HTF&zLF&FE4jK@SdYhwn%HrTh@wKO})}eQ}_^wBlmn zC19uI(`|ZS=e1?;;PcC$xc0;6cYTmprvUXQXi7K1{lM#-s!0jrez*D*@O{nrn2=No z;35%#7{4&thwS4~@h7ayyshV5Bpj*fuiIX6{ZSq|zKuWx8K0-t!++gu6U za^`FeY_F*`s5^2jP87TE4#fi}<$V5LG-f8>UdC(iuQ?bC?y(mCmz>MC=P^tu_55g# z^D!akLLDUJT&O#k-_E&gUnAsPLe2#S6cKW+TF@QLpUt^Q>gp+HpE5psWQ;hl-pF-I zN3Nma?|1V5Z>aYDXqGg0RP*iA!ZzB=M07DEWKL*Uc*NYusA!=i^noxAgt_o{uLu0n W#V=dJVkIot!lor`-2Y7S!u$lU!9;KX literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_compact/legacy_tables-legacy_ka_clust_compact-ka-1-Summary.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_compact/legacy_tables-legacy_ka_clust_compact-ka-1-Summary.db new file mode 100644 index 0000000000000000000000000000000000000000..774cbd112a177d5c5649dfa03840f93acff196bf GIT binary patch literal 83 zcmZQzU}#`qU|0co-eAir^ E0K72=(*OVf literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_compact/legacy_tables-legacy_ka_clust_compact-ka-1-TOC.txt b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_compact/legacy_tables-legacy_ka_clust_compact-ka-1-TOC.txt new file mode 100644 index 0000000000..7f7fe79312 --- /dev/null +++ b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_compact/legacy_tables-legacy_ka_clust_compact-ka-1-TOC.txt @@ -0,0 +1,8 @@ +Filter.db +TOC.txt +Statistics.db +Summary.db +Index.db +Data.db +Digest.sha1 +CompressionInfo.db diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-CompressionInfo.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-CompressionInfo.db new file mode 100644 index 0000000000000000000000000000000000000000..e3b71a4ec311160222e0d1d34081ebc4bf41ed0e GIT binary patch literal 75 zcmZSJ^@%cZ&d)6nki`n+K`G`15C*#wgywn+q50+j0I`V) A5C8xG literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-Data.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-Data.db new file mode 100644 index 0000000000000000000000000000000000000000..90d42a5cb11342d543980cb87653e6336c42e78f GIT binary patch literal 4527 zcmai%e^6A{6~`a(VRjeTw_$(MxW07}cKIQ9-|}m%qZd-^kI}J9GPG{(uUA(7NhhD<9M+D1F=sE}qPWG2-qbWjtA+B)={$KLnu zqm#*hd+z<-d(Yl`KKFZ{AfyRD6VgJhv$L}Y;rA^u844-k(z5c3%E)qy0L`7y(+bI~FF(s15 zYbY&SD=;ZGzSe-sa-;HUJ1Q%5rDaN_k6VH$tu#tw>rfier8sHJUTBn-R$%I#3y+ww z?d|C)(JhBd)W!rciT!rBoZM23ngkUC!ZWEb-FwCZVb@$p)2n^^{IL0_S==%(DLRF^yRuUA0Oxy$SY2sf^+})#{qh=SqpoFjK zd;)m3vnr0IMjVEqpkP0Aa1f^_1OUS0DmO|iyHQ%9OA(!?XHZ#bRCeG2$PuIRuj9}t zZBU`=l%~Xm7J@lDKw zh1790)D3@01JCiUfhEUun^!AP>dcMv7l88{5iU!g^T4?i(v9N|ZF1u5dvusv%X!N* zY<24e?s}{t0Ewo!Bi0ejjFmrit?nGsZyVxjF;(fk#P#wp>@|bV^%n!7Zt>7IT}$0X zHl9Iu?M*Ii;y#W4m@P}(7w^3XNipiAOgCc2sFOCYZS+VCI_Xfn7djbqQvdB2y&QDX z{RV)p9qcPD+zQOKCWXfYA|}T+K>(Mx$2{;zbaM7Za{hg?*PUWANjz28t*%tm6jdE^ z*WvRqB=q&ja>krR$l`hZk~8>uemTeM*T62rI|Zi{RK4~9lClAJL@vFo`rZL4E;_OG zhbmNM^R&NCptgLT_CD6HT)}A()+bk)u(@)cc&7(jBb*qQJEcN6?soxzxIuAw0?M3( zL)>VDaFO|$V%T*Cq37FuLsmBlD>do*e;PH*Yo|mV#zjqW4jHteyI0*dpRxjp5+;!-jO=q1c~<%6ql4jk$QS<{C%;w_|j$_53=}M9kmcL z3tW7J=hnA)Fr!7vZPDqXi*F5ZWliLTNCdk<~CteY(=BYdsGB}{; z=Ah95<&V%pHNDRf<+jA<+whgwq-w>Xo1pJI?{9)Di47pWZhk!RebD34QYF5Js(~`E zU$Pv%UK_e(_Y2!N9z8S7evZeSk_DF`WI*OTd!iP?6p$q6*e6FIWG0yNd!KuS^XJH8 zX)6@i)d?L&vgFks*nRepB)Q-1kHJue>XHv**R2Lrb6?%4F#AlB+{-)e=19Yvv2NEz zRWvs?CtgrdRjpNRvIr3#)!dneFGjVjO;{;KRa9#bsij45R={7E%1Dh=C$21xemnOp^;h=A^lp+rVPG=geZvmtntGK6B5&Av zrwwd3icj)o9Z0Tk&kltdR!q-sHsvS@i*ZDN+zYhh{62fLD%Y>F&4dyIk-mc$7=b8U3AY zULb@yqkrH>$Z3j1>i=XWiQCLj%ys?&%sfRR$=x`z$)y@&St}58J!UXQQs}C<1pBPP zSoDv7t=C~Bg*DaiCBb@q#S7Z(QsP5r3cmy`F254@r zBL!B#+Oys$e0PSF(Zb|N$5laioqdXi6pOH($F=ya#24dQ@usj-+OOhTfLwlrMa!vd1+S)zzEq2hX>vk;>IH?O;G&^V86Z?ytrxMZoIb< zKu!xGFik{!?>x*6N~gJ@GDu>lJ902CC^regy%X{qdF0~D}^AW>1L zLxOU6nq$qiMo!}Q9M3&R^U=&>CL<>IaX$ZiuRXun+4=1HpC3N?@$&NWr|W;8eLP>E zpI?=B^imVN1JQcDd|w+2zW;%hi+`%(6!> zcgbCHSFzmnjlfZH(u=(0kMX^il61$4Uu3vs_+g&TafskPgV^|r(=9`t=#VlqqtBhHZ zx7J^`?XH#IK*%tLF|3SXL+-Lg&n#v!tBhHZw|>9Ble_!|LWVJnVPy=Puf4hpS;#_G z8L}d7z4~JtyVmoyXO0L%7{baBHeY+9h%96ws|;C@wqAc9A3u6EJG+R>f4`c|6lT+m zW;83K*}nGx4Fy78uF5fvajcAE5y55(vrVn3Ei<+I(#PHXoWgAH#m)U*+`BuQ{^t9C zS3=~j2MV+0F1btYDtVfxFk9}DyCj_b2`A^eMD9|UO)hffoKQd2yF68xO)q+J;$2Q; zTA|2Y3bV;Yu1s_3XE|I^h1v9?7cmYOqyJh(?oyadE^_ssMnAz6I~8Wri(c%QVn?r4 zi`=C!+snJWyvxhGioU!{VYZqt(Npy76{5!fcO!Nw%r>>AcKr1CjtoyR6=u_mUM$LB z(V=%Ca+ktva*^xMnepdx38ygIX1&dNoAre@>mzn4%oe-EE^#VXoI3P=D9ol8y$+og ze=dV^k-HRTlZ#wL${^DCyPz5vcaggkW|NCt9O~!LF>9|d+cBeKM#qfh zju{nZg9}{XDg;-{X$rI91uu9N!Yekrb_=r?SD!k2{aj%-&1gomLYlQG)~*z0+sL<( z-{!$p{w@7TWeT&&MJ`_D_iEogQkYFIdhMGGpUWy*W63u*4zX+Lf#bFx zIIOr8SJOWA2~Wf>h1pZrk3RIFPv7ZLnB8~%8OT5ej+?>AT?(_utr}@aLz*lzqcGcM zz0G=?^@TR;BX%jw&hii<&gNqaO8+pFD-xju{;@I%X_)%&0IMT;Kv%A-LLe7KPdHf)~6B z;T4-*yM@`yt51FK_dg1=X+|@e71FFlv38{}`}pm|wwkVN(A%It^+ZJ~Q<#0~b*353 zXm*+@Q<#04b!8T_n01=jirl3z`!uUdE^?9U)U%~9`_wDUF^+NUeNI{AE`{0eb4@8l zDN5bmL@CU^y|rc=+t_yeyhZL(n0@?85{XDe>M=(OvwN&M?|8?%sgoDEOJVlZ^`j4c z=+k$46lV8be+Dv;f#YT{a+ktvZ*26&MsI8^`Nl?t+2hC;lf)!3sqf50>{6KB_b!l- zge06gg9@{!t{iu`!<`<}6S+%ac8|5E9`&eq{NyRjwpnkp-e!HF&H9L43bT*LUx*T- zgs2{Kq%gb3s`HL_yqh|Ck-HRTPhCIy(1$*Kr$=FS-}Pr80~t7O1|xSV%pSLDq#+Gy zvdoOaY{!g_867j0J7!dv4K8qjs}Nl6nUBJ3c)<%^h46~auHC}y)zzmy{PU^8Y?{%G zW`#6sQLJ4l%+9hY+3txehXoD`-aMC)$`oe5d4&i<5Q1c$4~5y8?+!ot$G&-=-ar#%5P5%>Ex+BpFKp literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-Statistics.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-Statistics.db new file mode 100644 index 0000000000000000000000000000000000000000..8360ed5edfbd50bb52fc343dd64e2a208c3fd340 GIT binary patch literal 6859 zcmeI$dq`7J7y$5l?%jNE>9q2Z_R<~_(=;`~T-i#EK-0|iqHb=aK`L{USy7nvhm=`V z7W57zERwYHQCU!F?@S^qG8Qa*Q7ci?6xW@b^nIuQ`Xh?&h08s^edliHo_ii2V;F{G zY{w|!LWDC-I9cJ$XF_uHtCf5%pOL9kX7G7=e7084E47&hW!wgXE=jM|>2=yT18#*x%+Zgv$mi*?!Yr z9K2ZD01s*@3bnWhcrml-(%HDSJ@%qU=rCpYnLh!IZ-&$52k7 zyomB@%9|+fr(8|B6`N4+gG5qs1LX#6b|mFOY>xVV?l6u^tm6|L(r^Hw=r9A@k$PUI zJ{)&x!ge!b58IBdIF3DH3AS$w_Lvat3CFON8tkYe*l|~|lZRuk^uf+sfL+XEms8`n zNsZ&?0K0AThy;8^aiUp>eFTqBVt$I^Y$~45>|Jb5^AOdSNbvZVJid?O(%U7-4qqye zol-5x&I3AR*8xvtxfYK{5A{0~_o^F#?ET6Y*}pXfdHf^%zJq)4`wlO?hU(8SzCoTh z3%75vuL;H1d{Q89O{zpb)H@xy_9pJ1wp!Gm#KpY})+eg?oyc3pokqTQBNUpQScBGA z_JI5ejB~#EXnb&W%bj6dlJ6V~EnU`%p4TBKD<8%kYfatI&gwax(5?aXXg5u>fw z`{Z!`vpUnO%iw<2cs8~Gm@^R5USLV!BSj)~PtPX!ex%<@_rv|eak6LoEKuL6?0mrm zV3(v5je20W6(yhH^UI%me1OmI@i?Jc0qPIui*wM(ILH(jtwM|Cgqc7X8lmj=M zJXHzXYq}BK67@4q6x;6i#{nm<>FO)|X(rEJ#%u7eIT#D>u@?WAoXfW7F-#cs{Ai8~ zF)`;t9VF&ls5_Y7&be$~Bj#LU&IJY(5p%98&>hU5&ACX*vN5M#Fn&8^jC691k$Zl9 z@EWG^-Xi?Jq1rXKs=4t!FSJh!+h{Kn$@$RGsbS&MA|j)vM~fw~55#dG&V|2wJrI^I VVc8NFD{;XVH!X4F{%4XG<_ApKL}dT~ literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-Summary.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-Summary.db new file mode 100644 index 0000000000000000000000000000000000000000..774cbd112a177d5c5649dfa03840f93acff196bf GIT binary patch literal 83 zcmZQzU}#`qU|0co-eAir^ E0K72=(*OVf literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-TOC.txt b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-TOC.txt new file mode 100644 index 0000000000..7f7fe79312 --- /dev/null +++ b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_clust_counter_compact/legacy_tables-legacy_ka_clust_counter_compact-ka-1-TOC.txt @@ -0,0 +1,8 @@ +Filter.db +TOC.txt +Statistics.db +Summary.db +Index.db +Data.db +Digest.sha1 +CompressionInfo.db diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-CompressionInfo.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-CompressionInfo.db new file mode 100644 index 0000000000000000000000000000000000000000..d530b73f0af8a17523b6b7ab7876a9805dd60f75 GIT binary patch literal 43 fcmZSJ^@%cZ&d)6fzhD;|Ns9D42%r_g_z3{a~K#{HMc)t-n0QI%bk{=uaJ~j1jJQ9E~B9y w1B*THg$_Li26-b8Tm0Su5Zf5Y)>o|VVqlav0WvK#?^whz1b{Vd@0UCT03;(D;{X5v literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Digest.sha1 b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Digest.sha1 new file mode 100644 index 0000000000..be8e5fb190 --- /dev/null +++ b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Digest.sha1 @@ -0,0 +1 @@ +606280675 \ No newline at end of file diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Filter.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Filter.db new file mode 100644 index 0000000000000000000000000000000000000000..c3cb27ca204cbc779b7b25014f9909eaa3edf034 GIT binary patch literal 24 fcmZQzU|?lnU|?$GU^Eg*bYe_ka#Uwva9{uc8Bzj< literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Index.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Index.db new file mode 100644 index 0000000000000000000000000000000000000000..d2ec21831e198cf32d6b0b426affb63e09a64a43 GIT binary patch literal 75 kcmZQzG+;mmjD}F29++k{f^uUZTw^G=3&J&la(94e08W1b%m4rY literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Statistics.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Statistics.db new file mode 100644 index 0000000000000000000000000000000000000000..e3fd85560d31184a7ba566d78a1a31a529f560e0 GIT binary patch literal 4453 zcmeI$`%6<%902h9*!7iLIxTgUm1(BL49!%?Ryt85&@|J^$mNC_q_T}ND-5%KkT8qP zgx-OON|u(dUXZ0dEK4FwG!`riqgJ7&DXy#T()WA*gJ=gX=X~z>Y&*|;52GlGrDoFt zKBM_7nZFqR%BKQzwV85No+=|tBhOIjbgCS+RwY+w>E)68^_qCCTBFsd6I5D#wmv&I zN265~7kr4h=6Znt@O1Jto6S>V51Kpm^C(?5x@fquhH1Dv$r&aGocM6XOr_c1v=nEu z={CSL-4>XH_6qkzLcx-Agl!1h61F4kK-iJ6gs?MVSHkXu7ZP4dIKX0|A3;QX4dGbA zTL@U4u5$m^8 ziQ^_OWZLTocIsyA^LTyIrZ*_gB;ozcJjG^HU!eLTk+A+}Z;M`ap*Z)r6xrr`4YFO5 z8QFeHgFI)-1zDoT>(N>H8O2>&=Oeqnmmx3gO+;SWjpsXH49|CP*?m+$!tfD!!+PAl ztuiBu@BS)9J{(_48l{q7M z4dbjVAFU6zb%#BSi}LN)LUU=osJ}M3+4(ST+hQDrwpT_EL(lPQL;FdbDt!s#PHbEU zv`eTjTF-8h@v|`QS$lE_ddaHT257&xDQlnuUuIo{4o^RH0b1F&G6g#E;+_!b4Bw`8 z(0hN22cb(J)x<#8CRKVvKd&f00X=%FCmNVuF5cA&oe>oU_di{e&xgzz9QM=3(o@~ z!CyKgAg<{B)V2?J*9gn}jiU(Q@Yw}XU&B}aRlzh^yjp#id< zxzKP>)-x9x59^uBdgcNP;@>)R(TQn`ul7-%$HWxp-)vwTuFvHD{b7at{~L;aSyPEf N_ki!78gvmC{{WsRRj>d6 literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Summary.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_compact/legacy_tables-legacy_ka_simple_compact-ka-1-Summary.db new file mode 100644 index 0000000000000000000000000000000000000000..af8ad8bce0ff3e6dcc969d07c91cbcb0f9f2029c GIT binary patch literal 83 zcmZQzU}#`qU|3Hd${PXM3gWNY82INgh{+p+WEA@?<^g3) WKy1zDAN(1F0vLeSFwE6exB~zr!y=*p literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-Digest.sha1 b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-Digest.sha1 new file mode 100644 index 0000000000..a71f766297 --- /dev/null +++ b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-Digest.sha1 @@ -0,0 +1 @@ +616768162 \ No newline at end of file diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-Filter.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-Filter.db new file mode 100644 index 0000000000000000000000000000000000000000..c3cb27ca204cbc779b7b25014f9909eaa3edf034 GIT binary patch literal 24 fcmZQzU|?lnU|?$GU^Eg*bYe_ka#Uwva9{uc8Bzj< literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-Index.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-Index.db new file mode 100644 index 0000000000000000000000000000000000000000..48c153cd3c283731cabf57382602580449da01b7 GIT binary patch literal 75 lcmZQzG+;mmjD}F2KbU4Tf^z3UxW-WKTL{+#!ez7p(Ewvj0~Y`Q literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-Statistics.db b/test/data/legacy-sstables/ka/legacy_tables/legacy_ka_simple_counter_compact/legacy_tables-legacy_ka_simple_counter_compact-ka-1-Statistics.db new file mode 100644 index 0000000000000000000000000000000000000000..4a6e940f9d100acd3aa4b1e8cc556d3c9dba143c GIT binary patch literal 4453 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 G%l`pU$H-X# literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Digest.adler32 b/test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Digest.adler32 new file mode 100644 index 0000000000..943dd1e400 --- /dev/null +++ b/test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Digest.adler32 @@ -0,0 +1 @@ +1372047449 \ No newline at end of file diff --git a/test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Filter.db b/test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Filter.db new file mode 100644 index 0000000000000000000000000000000000000000..c3cb27ca204cbc779b7b25014f9909eaa3edf034 GIT binary patch literal 24 fcmZQzU|?lnU|?$GU^Eg*bYe_ka#Uwva9{uc8Bzj< literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Index.db b/test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Index.db new file mode 100644 index 0000000000000000000000000000000000000000..9e18f8e4c4d3ef71d30d77d12649bac7fc03edf7 GIT binary patch literal 157685 zcmeI*L2g@B6b4|YwHP2(2#E|p3{ZuHL?x8iZqkm}1e;*mDH3!KY=WshW56a@0}`7+ z3Qsv!t`)hh-*cUNj`A_dBWXl>ALsM$d+q$Qvy0i?KfgTx?dIm@?cKl6p3T=67nh6W z>gCn-tJkiqf&UN8LT(S{o6Ad5k&0BL$}Lq>YMZz|i;w3|2E!KZtFCB9Gn(brY%uF3 zsYpdCQstJaDYea8pKm|T2g9z~S6$JJW;DyK*${04^EbP%Ui&@MnV^-v?AHUq@uBU@xOS@clx$JV;<;uOw)sz~{vPUm>$z5_+ zvE233*E{=N*G)865|{)gf#ptM^Ucy8z1$^t$z8>A*U#VF<*v2uE`%WrVPyy#Vi&WR z#Vlr(F)QNMuitKC*Ko|ZT-oHZ$z_wvCRgrFuBOyrmMwa@OYV}pisi1~zq{M++ALo+ z(OgMj5|{**JAuvDo+^r6Vwc!eEO!0zqHTAr{02gXF^pkl44ZFOau>6h#jG-BMc(@B zhqm3d@*4;l#xRDJF>J_Pw&#_6fsmK0a*SgfE8|$Cv6;ebQ)_C=Ozpn(@pwO{Fxz`^bH5k&@y@2d`TpOP z5V`AIVYb{QcgbBPPxBOJ%UyDpgtI^4ZkgUrwX&_MK4Z#$caoV z6uC=bHo3@^X)gUNhbyWun_l!H#^GZ0U#rMn3bV;YuKv^LCzxWV!fblciyc$!=(TE* zyA)=7d6$=Wd3jgSmv<@5R`Vr#ik`hf)cF5y#4d%|rqhk=6lT+lUgPJ+cl7fva+ktva*>Ne{Tw=G?GX48va`zFKZvWgbDOJO#-$VI8FO1=NiD9ol8z1}|~ zzM9Ln$XyDv$we+U<+AC}`=KzKUi3P2TKu^T%0=!{m`yHn5h;U6zE1hy$>y4{@!@c<2WX zD{jTrv`>A)6R}HS_SE&G4}Iv!t8OYMjFzPCdO_-%f0+>BSFwY*d&%j(jmmOcIm&&P>EEh1q@Y0trb- z!l^T;Fnj9CafdtH=`lT#yA)>kSbOSGk9x;Xp2BRK^)~Bm))(5WkJzO!`*{3?C?QIS z>M=(OvwN&M?|8?%sgoDEOJVlZ^`j4c=+k$46lV8be+Dv;f#YT{a+kvFajQle(vT+0 z%qYxu%;=cWF=M%7Mupkn0vEUn!PTDmD9nZzyx>&`uh{I`EzDlsero>JKMJ#HMl+ff z(yT?XcBL>o%cf+zC$1b8I4pSgTt+HWnEmb*A_zeUl6gK9W@o-T{NyJ;?@wstE`{0m z*M%0ephb^~I4aDh7rms~N~tz-m%?mvk&9fF zOz#?}k%$B?4E{_2< z9|II-(~Dm8s-#!sE`{0TA{V(T$<^+b!feNkju{;@mOExtm<=v)fvXT)yQ!<>kKO(P Uu4=}8_sxBqc0?MRU9B+te_{&OZ~y=R literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Statistics.db b/test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Statistics.db new file mode 100644 index 0000000000000000000000000000000000000000..b2fd408499dc35b5f74e8baabddefc07bd3806b0 GIT binary patch literal 6859 zcmeI$dq`7J7y$5l?sk2pOQ${5w1=4~G0jINR5P8Z5onr^-Yz%NAhkKltSHKeBy34$ zfoTtr(8$utM^=Ai+S><_6&V)GqNtUWS&8e;P5QpmfBg|f_rm3#-@bFVbI(1Gk1-4* zV$8=R{zCXOi9cEX%wznsHS1)`9A$cjT9&TN%~fWpG)kE&Lo18eqE*LfRBDY{6|dB2 zGqsu7S!#{EApd#vS(mN+&8EZMXfzHxxDu|oe-F_OO#W0?#nxUK;(CXA9QknRNG0=c zT8bkVQybu6Y70C@+dKN1c(h=-a+IwoTT`~7Y)9FivV^h|Wf#g5DSJ@%qU=XGkn%jr zF_e=jucN$;atY-+%H7z6dLLvC71vU}ip@@-ybD`IeZQy-$Hk`c2@Wm@fG=9j$F`=P z*XBEp+qGfa8?eXj!ImD!9={yhtqXgKKlY3YY*{LH=rQbwX6*QJ*lDiVxl6DMmDrWk z_-#|*xWUt6^E@J+A5om7F2z2E$0sp7L~%9|&u8{FwkY*JsxKDf@h|SYi{jkPB4n!% zRme7pMr7MzHS(BYXJm;Ak4GoPYZP~B9FIKlnH#c4cLK6kJAU7OgZO<1>8_#r^Lt++ zFItG(x6DnC;_Kf@k$1+`ARqlY7rCJY_fJm)>Q7?l_!-tG^634@JEomRzH>bQn)Rti z>nnR$@&Lv~Zh2^Yh#FVf!niokb^$cEvKu|GRd!|`j9WM82cT^gQJLs5ctV6C_`cz_@$$!8g!TgJWu;eIBLEgZA&pI13$?w!Iu$@gyJxI-z1i z2z0vlrEus?-yHg&i*8g!Lsusrod$icwBP{rz{Rd8U^3HTZ6kDgWF(ybq$<9CbpD&F z5#u2Vod2v^|LiijpY1)fARkzyCHi7u@$`0SEcD>uHu!$HFS-)Ae^~oE_bmkVZA#DQ zUjVj?JJG5EwqH~99zMV1vC|v){7#)Qby84&oU$+n?gy@?09ZcrU~G)}LFQ z5*OIe?|9?ZS<6hW*C^P+^p@MC+l!^F!K)~$4px}@>p>xB8lF$djI1uK--@P92 XOBcUv35%7mU<;d;uyOx0$qVxXO8Y}T literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Summary.db b/test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_compact/la-1-big-Summary.db new file mode 100644 index 0000000000000000000000000000000000000000..6cd998f94feacf73cb26ee147340e8b72b015dfa GIT binary patch literal 75 zcmZQzU}#`qU|nki`n+K`G|x5C*$7gywn!q4^d70I)0x A0{{R3 literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_counter_compact/la-1-big-Data.db b/test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_counter_compact/la-1-big-Data.db new file mode 100644 index 0000000000000000000000000000000000000000..63ee721aad79e8d8df0e4591829592d0308aa3c1 GIT binary patch literal 4527 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 literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_counter_compact/la-1-big-Statistics.db b/test/data/legacy-sstables/la/legacy_tables/legacy_la_clust_counter_compact/la-1-big-Statistics.db new file mode 100644 index 0000000000000000000000000000000000000000..2bfc59d7226b4789683b61e367d881bdecd44c2a GIT binary patch literal 6859 zcmeI$dq`7J7y$5l?lvDwm(KN2%Sy9{#9W%0P_A?~jX={L_V(sRDx@_>nH5DTk(8Na zCiD&@OtiG}(d&;&?Wsv*MV7&`7qyBqD{Q6Fp2=?!{a9A_}5 z8dEdU^#*lL_A_mTVgrA(_3*Y>EWNItL{j)MmlSl3_*7lSR$c6obo8{l@!{gWO19s$ z7yB;OHo(K$7I^fxxBoM7f5Cp0PBy<*AgT zDbJ_8lJZ8%MU<;4w_y|NeUQmi+(`KnHamp!R%{XV{h|XnF1C(Oa7cmy_@cu!Y)9&O zoxbC^v=Q6Ij6EXV)o#cs~IR`tB!!D)9 zZ=(js%|3S9<`MDvfZ`-^F7`n@K8g80in9rLKC?HlMTvJ%eX$sifAQU0C@yKrM|OB$ zhU}DJL3ZxdBM<2HK$hw7cy!miL~%vkVC11sypV^t#UuMQ>^z$hB8-|FqYl{v=Yj&#*pGYj+}V_C0}o^NI?Z9b1Fe zS9YK59*m2;ve5Vt)h%^~adDP&IJ9I*8+u-cjMOX`cdRvaK|5=rK0y!gsYmn4HBsII z<8Gpu2565^e>9$l$iD7}aqp9RUPF(X6kP>9_Q8Uw(19%}70_Wxn+`#19;p^U#~)r5 z0-fxCZaVbZZ?2ut`Pa&{&?gg0e4%d_=j?{=I@=lrOvbscsDn<9jD+)_l*QHb&wpz* zV%aN$^Pkn5o}35wvmNE(*}x(rF%<%fM>or3pu4*_!uKQjQcwi<56AHyoijjvr{dGu zXMm-#M;i>lF3a=Z!RMDfbbk$>-~DcMwH(wR#O1Aq`+?^Pb-fbAeXe)P;rkl>Q5%y7 z;uGeX{b4>368xq?2IA_r7xn9aXCJ66hwWKx4hwxP!jq;7ze^!_`BBw Ye(BfzhD;|Ns9D42%r_g_z3{a~K#{HMehwGm!wwa;N3zDMZ@U{dJF+zU5h)V6af&J8;Ae^ literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Digest.adler32 b/test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Digest.adler32 new file mode 100644 index 0000000000..c07a57f0e5 --- /dev/null +++ b/test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Digest.adler32 @@ -0,0 +1 @@ +278403976 \ No newline at end of file diff --git a/test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Filter.db b/test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Filter.db new file mode 100644 index 0000000000000000000000000000000000000000..c3cb27ca204cbc779b7b25014f9909eaa3edf034 GIT binary patch literal 24 fcmZQzU|?lnU|?$GU^Eg*bYe_ka#Uwva9{uc8Bzj< literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Index.db b/test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Index.db new file mode 100644 index 0000000000000000000000000000000000000000..d2ec21831e198cf32d6b0b426affb63e09a64a43 GIT binary patch literal 75 kcmZQzG+;mmjD}F29++k{f^uUZTw^G=3&J&la(94e08W1b%m4rY literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Statistics.db b/test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Statistics.db new file mode 100644 index 0000000000000000000000000000000000000000..a81e03ee6515ca054cbe171b1288c49a4fa3884c GIT binary patch literal 4453 zcmeI$`%6<%902fp?{HJ|ML@%B)Dt2qbJp zWrErh2@9>Pd}Q{6rIq%Q$O;XEWl_{h)GW<)r@Q$5p8p`)fy+6c`#syv^WMWKiV{(i zX%?T+{I!w482-wm0<*PgaxRBUP1nd%x!hbXOReSP>U5nva<5Jkqg89P8g(qE)n({1 zva>W=MN$5HRgLRD{=??vWipw@ojhpv#K2)%KRjo!u9~@VcZ}^D>viVCr4yAVf74Q& z$johk$=nv0g!T&e#6rQ6vxIF3+Y+`T>_FI&u!OLbuq$DA!m|l4ARJ(^(2pP@zJhQR z;RM2Ig!dCZMYxV|H#SYo2fdVt>j<}CGcySnVvC6H7nS3<*t|YLVuJzrqD?rqEzw`Q zQ5<(@$96PgPd|(;JBK}EGqz_J_S``1g=ewlN!Vc(*pbcHv2NHqJg{@uV;6JSRmA#j zSK_$Q8=3b0ft|Dgy8^FI+V~2^nRvXPna9|oq^GF9SS+mn$=l)=ohZ&eEJ3#UUX5%Q zZ$h>o*C0?zyW@}-Jj3%HFoNehSbq=I5AXYcyfy;2 zZ~F?neE!$tN?+$AL;{<=Z8R&~ayXhC-+M z-d+X0`?pg+bjgEi74(((viZ+L*aVPic?nULH(kXhW0+-%AVflD&Uq27i(dA z4XpuPVN-EhcBpeK5;!_@XtZ$3RIa5gJcC)nLRCg6Sn~hn%q4U?NGMoxw8!~-)-x9x zAnTb64F_dCbD{CDp1G`NF0df}tuq%Lm+ZPLf%1BDgkt^cuWbu)pU4Y3^auI>HxxbG Qz@?@?<};-lbP*T-0={-v9{>OV literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Summary.db b/test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_compact/la-1-big-Summary.db new file mode 100644 index 0000000000000000000000000000000000000000..6cd998f94feacf73cb26ee147340e8b72b015dfa GIT binary patch literal 75 zcmZQzU}#`qU|bY;V@(*u895mA84djzcuwxD)P0^>@rDgICAaEY^A7tcei~V5|gy` z#h0yFObC7P?FW=E`4$r<%Q`W}VI;K9r`%^=&-Y*8hkI|Iz2A>}y|3P1Uhlj2j^j85 z_qPm}DqeaPOOGHuxmu$cNd*rv;YT?|KUa_OM-CGKm40QVY zKON11s(%c$^pAxWdA#y#O1a^vMaC|ST^YME_F(MESjE_fu^;1Mj7KmY%Q%ej6vi_d z$2u&}JDG{EWxSPfG2>dsZD^j^4}KaGw=lkn7W^6SL@SuTuPDQ~vOhmb5hDnsrpqj} zD>GlW-x&93Mtj=OgLk9VN6WI;tEUeHooF1id-{owE>KU_e(f z`P;0+xGfmW2Y*4QE<%@Me)6`b5Eqj0JPUWwiq!kiU#Z0WS3YWixOl4&?DDx9?3QE) zyZ4#EgZg~IDkJ8jkM14B{ThaXhrJ2}k7!E-k9~mq9oB>U9Z_@*`p@ck1D-z@$G0TV z3h~U3YVeNu8gS{)>EQYsxIXRmu%5h!_jlT#*Xs9zw~sjizI%N#wJ^R8K3|1HswXtA z2+W22P&BM?r*UPj`)q1)c^k~vB|9UR#$D^J-PG>7m~YgBf*avHd8Mi!(zv%Gu8G<= zDg^S`U-k1ajR&3F|DJmE)Yx;>qz-?Wewup5>TMO&x)+mEs1qyKMN+4QT%1F_ z@t0Q@b>YowJ@v_?(lONcO7izncVB3YA?7D|t!bc6n>UZ1f4(}Qj-G$seo#fvzhJVy zxHdg6ii+v?hwDV&uDPVYTglnH^TZzUN1M#V zo~sH!(fO;M`@E;~_jwdst0w)27z)~C&Uxp8^>E&~oOdpg5dYVmi%(qcw;`DedcKDfC)S-=sXsDM@95;VOTTYuA8*LC OwS;y`!#9#CVDk^GYgS|c literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_counter_compact/la-1-big-Summary.db b/test/data/legacy-sstables/la/legacy_tables/legacy_la_simple_counter_compact/la-1-big-Summary.db new file mode 100644 index 0000000000000000000000000000000000000000..6cd998f94feacf73cb26ee147340e8b72b015dfa GIT binary patch literal 75 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 literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_compact/ma-1-big-Statistics.db b/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_compact/ma-1-big-Statistics.db new file mode 100644 index 0000000000000000000000000000000000000000..70a08edd4810cc362b951604ec6b1a8aa9de7592 GIT binary patch literal 7046 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 ODce@LyUObQhF<{bAc(90 literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_counter_compact/ma-1-big-Summary.db b/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_clust_counter_compact/ma-1-big-Summary.db new file mode 100644 index 0000000000000000000000000000000000000000..9b24e0450c732103bdd22afb63db34808745ed6f GIT binary patch literal 47 jcmZQzU}#`qU|xS|Eg literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-Data.db b/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-Data.db new file mode 100644 index 0000000000000000000000000000000000000000..69aec908f205d58ee87d2c8ce351977b4e2e888e GIT binary patch literal 91 zcmdnQz`!txfzhD;|Ns9D42%rF*cUMJ1I4)0^79pv5{rPiijjfQP>CU1kb&WNk%J0@ mtdRhYCXgSjSJB6~O?1FBw+= literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-Digest.crc32 b/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-Digest.crc32 new file mode 100644 index 0000000000..da73bd883e --- /dev/null +++ b/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-Digest.crc32 @@ -0,0 +1 @@ +3668325305 \ No newline at end of file diff --git a/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-Filter.db b/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-Filter.db new file mode 100644 index 0000000000000000000000000000000000000000..2e1d5d29ca0683d58365c1bda385a89ced35f1f9 GIT binary patch literal 24 fcmZQzU|?lnU|?ckVPs%abZX%^z`&xww2T1&5k3Nr literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-Index.db b/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_compact/ma-1-big-Index.db new file mode 100644 index 0000000000000000000000000000000000000000..56f29df1cb9be118b9993063de9405194522e236 GIT binary patch literal 26 dcmZQzG+?rp&-{H)_J{v&=}AuR z`Sg3*-gD2ny(bj}K_}cV$=X5G>PD?fTHT>lSrAMuLRyV`vsJBC%PU;ga@FHetDSDu z>a6fubGCb3`EIAn?Q#~VZf~WxvZmVQwl&m$@92zwRr`Q>fk0p;CQ(%O+}>(KexCDY&cV5*rG-LkcXJ*=i`;yOPjR`I^Ley1hx0D9 z%zeJxhPkc;t)!zPR-q%g@#^nk9yN%L_M;!!jW)lJp8X;^X&C)z8v5~rXlp4tb3Z!g zEV>{8y(tmxc@EvEqT9LkJ7~w;Zvl&zTj$%r6RV@@4qa4hL%geg#J1m zu7BN?OOPv{G=U?2>j3ME0${_83p{Hk4s3MddNkQ@Kpx*W8$9<~5_tYdA$ZXc&Ufk* z&UbqAhtPl3*bm@!*?4|0B>5oU@{1Y#dVUvp-`y;5??-rjMtk9Uiczr>w7+O`yb0d9 z@Cf+xi_55`#Xa!*D(y91rMa9`2kS%b+i0M%KE6w z*Q}xUzt~aGL+^hv@Q#t*|B}mh?F@OpGZz$6bbgfIn_KAf zBXVincsA*;Z#`ark~k{=g8?^j^vg}Z((xO=G2Nu&H(kl?Hk1AdYGW;Z9wZ*I^;=19 z`E=Y&=PUWPBd?LY+KhcdOjQcD>CSMt}e8*jl~^Nm z{J-qE*s$21i#e4wLdWHt;U3qr@SY1UPLErb2}&=Vl0F_3v(@d1cw0%YDlvBQ>uF92vJ KBcntJ=Uo7nsvL0u literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-Digest.crc32 b/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-Digest.crc32 new file mode 100644 index 0000000000..18ba1ffd04 --- /dev/null +++ b/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-Digest.crc32 @@ -0,0 +1 @@ +3769133549 \ No newline at end of file diff --git a/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-Filter.db b/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-Filter.db new file mode 100644 index 0000000000000000000000000000000000000000..2e1d5d29ca0683d58365c1bda385a89ced35f1f9 GIT binary patch literal 24 fcmZQzU|?lnU|?ckVPs%abZX%^z`&xww2T1&5k3Nr literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-Index.db b/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-Index.db new file mode 100644 index 0000000000000000000000000000000000000000..d094f73e2135ffcf478c5bda9adef5a7c030292b GIT binary patch literal 27 ecmZQzG+pErBInI=X60NXXO3aCO-#H++Nu{Sg_2THUm{qog4rYqdQ+)Q zpSsf~W=kef5=}XRWGl0kS_mYN*H=lHOu&2Lr z@uRMh5INi|XHW8cFHE#O?SV;d7fMPWl$*R#@Lv5W`%?~}97s8cvWBvjav0?Z%5x~s zqZ~*1U9XjKS>d(P?@X%xddgcVd*&9VCJ4FQP1%l3sQDmEskn{uMQnB!NUTocA?3o{8M-5}Y6^}jt5VpP$JLw>H>ILka zaO|Q;Z0kDgIsv<#TEBxv9Ct<|ljuj-h56VAmGwD&n>cTwIGd-e+v(fv6>P5XM^s;> z!s}mk<0^{t-_;}g{n>#Wkmp8LPl?Dgrb3Z5CcGZC#$Qo9tZycA#JwowIrd!Sc|&-< z<0kQZCp3JG>aQIA8F@_#Zr=w{4iw+^yAJu2>@MV%r^(2@-{SEZ=|$s70z<}OePYP? z40-q5 zeb6OoX>k9Oj+`F2|A~8_2JU}Wblf`+KF^MxTvZLs*@&YNSQRs*%YvSqtby~x|JBe0 z-yi;qLdQ}-{eb3E)n|YMvyTi&z(HH;|A771+}1vX{ny^e?AC$$;X+*{d>=#}H}va4 zJo@`F9h|S2#~E35ApTB)GZvl)5)*zK(15tX{!9Nyz-wE(PQvzVbS_JT>)D)ZY;OSd zYm0jaM}gb!j$CL5zIgOl7i_QNQrvLT%Q(?}dexN*oV9KI`JR_%tlqNn8_ZKys zo30{;S@`NdUW)Ya literal 0 HcmV?d00001 diff --git a/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-Summary.db b/test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple_counter_compact/ma-1-big-Summary.db new file mode 100644 index 0000000000000000000000000000000000000000..9b24e0450c732103bdd22afb63db34808745ed6f GIT binary patch literal 47 jcmZQzU}#`qU| listed; - - // List all but no snapshot, backup - lister = directories.sstableLister(Directories.OnTxnErr.THROW); - listed = new HashSet<>(lister.listFiles()); - for (File f : files.get(cfm.cfName)) - { - if (f.getPath().contains(Directories.SNAPSHOT_SUBDIR) || f.getPath().contains(Directories.BACKUPS_SUBDIR)) - assert !listed.contains(f) : f + " should not be listed"; - else - assert listed.contains(f) : f + " is missing"; - } - - // List all but including backup (but no snapshot) - lister = directories.sstableLister(Directories.OnTxnErr.THROW).includeBackups(true); - listed = new HashSet<>(lister.listFiles()); - for (File f : files.get(cfm.cfName)) - { - if (f.getPath().contains(Directories.SNAPSHOT_SUBDIR)) - assert !listed.contains(f) : f + " should not be listed"; - else - assert listed.contains(f) : f + " is missing"; - } - - // Skip temporary and compacted - lister = directories.sstableLister(Directories.OnTxnErr.THROW).skipTemporary(true); - listed = new HashSet<>(lister.listFiles()); - for (File f : files.get(cfm.cfName)) - { - if (f.getPath().contains(Directories.SNAPSHOT_SUBDIR) || f.getPath().contains(Directories.BACKUPS_SUBDIR)) - assert !listed.contains(f) : f + " should not be listed"; - else if (f.getName().contains("tmp-")) - assert !listed.contains(f) : f + " should not be listed"; - else - assert listed.contains(f) : f + " is missing"; - } + checkFiles(cfm, directories); } } + private void checkFiles(CFMetaData cfm, Directories directories) + { + Directories.SSTableLister lister; + Set listed;// List all but no snapshot, backup + lister = directories.sstableLister(Directories.OnTxnErr.THROW); + listed = new HashSet<>(lister.listFiles()); + for (File f : files.get(cfm.cfName)) + { + if (f.getPath().contains(Directories.SNAPSHOT_SUBDIR) || f.getPath().contains(Directories.BACKUPS_SUBDIR)) + assertFalse(f + " should not be listed", listed.contains(f)); + else + assertTrue(f + " is missing", listed.contains(f)); + } + + // List all but including backup (but no snapshot) + lister = directories.sstableLister(Directories.OnTxnErr.THROW).includeBackups(true); + listed = new HashSet<>(lister.listFiles()); + for (File f : files.get(cfm.cfName)) + { + if (f.getPath().contains(Directories.SNAPSHOT_SUBDIR)) + assertFalse(f + " should not be listed", listed.contains(f)); + else + assertTrue(f + " is missing", listed.contains(f)); + } + + // Skip temporary and compacted + lister = directories.sstableLister(Directories.OnTxnErr.THROW).skipTemporary(true); + listed = new HashSet<>(lister.listFiles()); + for (File f : files.get(cfm.cfName)) + { + if (f.getPath().contains(Directories.SNAPSHOT_SUBDIR) || f.getPath().contains(Directories.BACKUPS_SUBDIR)) + assertFalse(f + " should not be listed", listed.contains(f)); + else if (f.getName().contains("tmp-")) + assertFalse(f + " should not be listed", listed.contains(f)); + else + assertTrue(f + " is missing", listed.contains(f)); + } + } + + @Test + public void testTemporaryFile() throws IOException + { + for (CFMetaData cfm : CFM) + { + Directories directories = new Directories(cfm); + + File tempDir = directories.getTemporaryWriteableDirectoryAsFile(10); + tempDir.mkdir(); + File tempFile = new File(tempDir, "tempFile"); + tempFile.createNewFile(); + + assertTrue(tempDir.exists()); + assertTrue(tempFile.exists()); + + //make sure temp dir/file will not affect existing sstable listing + checkFiles(cfm, directories); + + directories.removeTemporaryDirectories(); + + //make sure temp dir/file deletion will not affect existing sstable listing + checkFiles(cfm, directories); + + assertFalse(tempDir.exists()); + assertFalse(tempFile.exists()); + } + } @Test public void testDiskFailurePolicy_best_effort() diff --git a/test/unit/org/apache/cassandra/gms/SerializationsTest.java b/test/unit/org/apache/cassandra/gms/SerializationsTest.java index 8b7ad1faeb..e50b4616f0 100644 --- a/test/unit/org/apache/cassandra/gms/SerializationsTest.java +++ b/test/unit/org/apache/cassandra/gms/SerializationsTest.java @@ -19,7 +19,6 @@ package org.apache.cassandra.gms; import org.apache.cassandra.AbstractSerializationsTester; -import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.util.DataInputPlus.DataInputStreamPlus; diff --git a/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java b/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java index 9154d79cc4..74b5c7474b 100644 --- a/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java +++ b/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java @@ -30,7 +30,7 @@ import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.sstable.CorruptSSTableException; import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.io.util.ChannelProxy; -import org.apache.cassandra.io.util.FileMark; +import org.apache.cassandra.io.util.DataPosition; import org.apache.cassandra.io.util.MmappedRegions; import org.apache.cassandra.io.util.RandomAccessReader; import org.apache.cassandra.io.util.SequentialWriter; @@ -84,7 +84,7 @@ public class CompressedRandomAccessReaderTest for (int i = 0; i < 20; i++) writer.write("x".getBytes()); - FileMark mark = writer.mark(); + DataPosition mark = writer.mark(); // write enough garbage to create new chunks: for (int i = 0; i < 40; ++i) writer.write("y".getBytes()); @@ -126,7 +126,7 @@ public class CompressedRandomAccessReaderTest : SequentialWriter.open(f)) { writer.write("The quick ".getBytes()); - FileMark mark = writer.mark(); + DataPosition mark = writer.mark(); writer.write("blue fox jumps over the lazy dog".getBytes()); // write enough to be sure to change chunk diff --git a/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterTest.java b/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterTest.java index 56c83dae82..9b09f0b488 100644 --- a/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterTest.java +++ b/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterTest.java @@ -38,7 +38,7 @@ import org.apache.cassandra.db.marshal.BytesType; import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.io.sstable.metadata.MetadataCollector; import org.apache.cassandra.io.util.ChannelProxy; -import org.apache.cassandra.io.util.FileMark; +import org.apache.cassandra.io.util.DataPosition; import org.apache.cassandra.io.util.RandomAccessReader; import org.apache.cassandra.io.util.SequentialWriterTest; import org.apache.cassandra.schema.CompressionParams; @@ -104,7 +104,7 @@ public class CompressedSequentialWriterTest extends SequentialWriterTest dataPost.flip(); writer.write(dataPre); - FileMark mark = writer.mark(); + DataPosition mark = writer.mark(); // Write enough garbage to transition chunk for (int i = 0; i < CompressionParams.DEFAULT_CHUNK_LENGTH; i++) diff --git a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java index 00727b892a..4b9a7692f6 100644 --- a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java @@ -21,14 +21,13 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; -import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Random; -import java.util.Set; +import org.junit.After; import org.junit.Assert; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; @@ -37,16 +36,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.SchemaLoader; -import org.apache.cassandra.Util; -import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.db.ColumnFamilyStore; -import org.apache.cassandra.db.DeletionTime; import org.apache.cassandra.db.Keyspace; -import org.apache.cassandra.db.rows.SliceableUnfilteredRowIterator; -import org.apache.cassandra.db.filter.ColumnFilter; -import org.apache.cassandra.db.marshal.BytesType; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; @@ -55,7 +48,6 @@ import org.apache.cassandra.io.sstable.format.SSTableFormat; import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.io.sstable.format.Version; import org.apache.cassandra.io.sstable.format.big.BigFormat; -import org.apache.cassandra.schema.KeyspaceParams; import org.apache.cassandra.service.CacheService; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.streaming.StreamPlan; @@ -63,8 +55,6 @@ import org.apache.cassandra.streaming.StreamSession; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; -import static org.apache.cassandra.utils.ByteBufferUtil.bytes; - /** * Tests backwards compatibility for SSTables */ @@ -73,10 +63,7 @@ public class LegacySSTableTest private static final Logger logger = LoggerFactory.getLogger(LegacySSTableTest.class); public static final String LEGACY_SSTABLE_PROP = "legacy-sstable-root"; - public static final String KSNAME = "Keyspace1"; - public static final String CFNAME = "Standard1"; - public static Set TEST_DATA; public static File LEGACY_SSTABLE_ROOT; /** @@ -104,58 +91,78 @@ public class LegacySSTableTest public static void defineSchema() throws ConfigurationException { SchemaLoader.prepareServer(); - - CFMetaData metadata = CFMetaData.Builder.createDense(KSNAME, CFNAME, false, false) - .addPartitionKey("key", BytesType.instance) - .addClusteringColumn("column", BytesType.instance) - .addRegularColumn("value", BytesType.instance) - .build(); - - SchemaLoader.createKeyspace(KSNAME, - KeyspaceParams.simple(1), - metadata); - beforeClass(); - } - - public static void beforeClass() - { + StorageService.instance.initServer(); Keyspace.setInitialized(); + createKeyspace(); + for (String legacyVersion : legacyVersions) + { + createTables(legacyVersion); + } String scp = System.getProperty(LEGACY_SSTABLE_PROP); assert scp != null; LEGACY_SSTABLE_ROOT = new File(scp).getAbsoluteFile(); assert LEGACY_SSTABLE_ROOT.isDirectory(); + } - TEST_DATA = new HashSet(); - for (int i = 100; i < 1000; ++i) - TEST_DATA.add(Integer.toString(i)); + @After + public void tearDown() + { + for (String legacyVersion : legacyVersions) + { + truncateTables(legacyVersion); + } } /** * Get a descriptor for the legacy sstable at the given version. */ - protected Descriptor getDescriptor(String ver) + protected Descriptor getDescriptor(String legacyVersion, String table) { - File directory = new File(LEGACY_SSTABLE_ROOT + File.separator + ver + File.separator + KSNAME); - return new Descriptor(ver, directory, KSNAME, CFNAME, 0, SSTableFormat.Type.LEGACY); + return new Descriptor(legacyVersion, getTableDir(legacyVersion, table), "legacy_tables", table, 1, + BigFormat.instance.getVersion(legacyVersion).hasNewFileName()? + SSTableFormat.Type.BIG :SSTableFormat.Type.LEGACY); } @Test - public void testStreaming() throws Throwable + public void testLoadLegacyCqlTables() throws Exception { - StorageService.instance.initServer(); - - for (File version : LEGACY_SSTABLE_ROOT.listFiles()) + for (String legacyVersion : legacyVersions) { - if (!new File(LEGACY_SSTABLE_ROOT + File.separator + version.getName() + File.separator + KSNAME).isDirectory()) - continue; - if (Version.validate(version.getName()) && SSTableFormat.Type.LEGACY.info.getVersion(version.getName()).isCompatibleForStreaming()) - testStreaming(version.getName()); + logger.info("Loading legacy version: {}", legacyVersion); + loadLegacyTables(legacyVersion); + CacheService.instance.invalidateKeyCache(); + long startCount = CacheService.instance.keyCache.size(); + verifyReads(legacyVersion); + verifyCache(legacyVersion, startCount); } } - private void testStreaming(String version) throws Exception + @Test + public void testStreamLegacyCqlTables() throws Exception { - SSTableReader sstable = SSTableReader.open(getDescriptor(version)); + for (String legacyVersion : legacyVersions) + { + streamLegacyTables(legacyVersion); + verifyReads(legacyVersion); + } + } + + private void streamLegacyTables(String legacyVersion) throws Exception + { + for (int compact = 0; compact <= 1; compact++) + { + logger.info("Streaming legacy version {}{}", legacyVersion, getCompactNameSuffix(compact)); + streamLegacyTable("legacy_%s_simple%s", legacyVersion, getCompactNameSuffix(compact)); + streamLegacyTable("legacy_%s_simple_counter%s", legacyVersion, getCompactNameSuffix(compact)); + streamLegacyTable("legacy_%s_clust%s", legacyVersion, getCompactNameSuffix(compact)); + streamLegacyTable("legacy_%s_clust_counter%s", legacyVersion, getCompactNameSuffix(compact)); + } + } + + private void streamLegacyTable(String tablePattern, String legacyVersion, String compactNameSuffix) throws Exception + { + String table = String.format(tablePattern, legacyVersion, compactNameSuffix); + SSTableReader sstable = SSTableReader.open(getDescriptor(legacyVersion, table)); IPartitioner p = sstable.getPartitioner(); List> ranges = new ArrayList<>(); ranges.add(new Range<>(p.getMinimumToken(), p.getToken(ByteBufferUtil.bytes("100")))); @@ -166,94 +173,41 @@ public class LegacySSTableTest sstable.estimatedKeysForRanges(ranges), sstable.getSSTableMetadata().repairedAt)); new StreamPlan("LegacyStreamingTest").transferFiles(FBUtilities.getBroadcastAddress(), details) .execute().get(); - - ColumnFamilyStore cfs = Keyspace.open(KSNAME).getColumnFamilyStore(CFNAME); - assert cfs.getLiveSSTables().size() == 1; - sstable = cfs.getLiveSSTables().iterator().next(); - for (String keystring : TEST_DATA) - { - ByteBuffer key = bytes(keystring); - - SliceableUnfilteredRowIterator iter = sstable.iterator(Util.dk(key), ColumnFilter.selectionBuilder().add(cfs.metadata.getColumnDefinition(bytes("name"))).build(), false, false); - - // check not deleted (CASSANDRA-6527) - assert iter.partitionLevelDeletion().equals(DeletionTime.LIVE); - assert iter.next().clustering().get(0).equals(key); - } - sstable.selfRef().release(); } - @Test - public void testVersions() throws Throwable + private static void loadLegacyTables(String legacyVersion) throws Exception { - boolean notSkipped = false; - - for (File version : LEGACY_SSTABLE_ROOT.listFiles()) + for (int compact = 0; compact <= 1; compact++) { - if (!new File(LEGACY_SSTABLE_ROOT + File.separator + version.getName() + File.separator + KSNAME).isDirectory()) - continue; - if (Version.validate(version.getName()) && SSTableFormat.Type.LEGACY.info.getVersion(version.getName()).isCompatible()) - { - notSkipped = true; - testVersion(version.getName()); - } - } - - assert notSkipped; - } - - public void testVersion(String version) throws Throwable - { - try - { - ColumnFamilyStore cfs = Keyspace.open(KSNAME).getColumnFamilyStore(CFNAME); - - - SSTableReader reader = SSTableReader.open(getDescriptor(version)); - for (String keystring : TEST_DATA) - { - - ByteBuffer key = bytes(keystring); - - SliceableUnfilteredRowIterator iter = reader.iterator(Util.dk(key), ColumnFilter.selection(cfs.metadata.partitionColumns()), false, false); - - // check not deleted (CASSANDRA-6527) - assert iter.partitionLevelDeletion().equals(DeletionTime.LIVE); - assert iter.next().clustering().get(0).equals(key); - } - - // TODO actually test some reads - } - catch (Throwable e) - { - System.err.println("Failed to read " + version); - throw e; + logger.info("Preparing legacy version {}{}", legacyVersion, getCompactNameSuffix(compact)); + loadLegacyTable("legacy_%s_simple%s", legacyVersion, getCompactNameSuffix(compact)); + loadLegacyTable("legacy_%s_simple_counter%s", legacyVersion, getCompactNameSuffix(compact)); + loadLegacyTable("legacy_%s_clust%s", legacyVersion, getCompactNameSuffix(compact)); + loadLegacyTable("legacy_%s_clust_counter%s", legacyVersion, getCompactNameSuffix(compact)); } } - @Test - public void testLegacyCqlTables() throws Exception + private static void verifyCache(String legacyVersion, long startCount) throws InterruptedException, java.util.concurrent.ExecutionException { - createKeyspace(); - - loadLegacyTables(); + //For https://issues.apache.org/jira/browse/CASSANDRA-10778 + //Validate whether the key cache successfully saves in the presence of old keys as + //well as loads the correct number of keys + long endCount = CacheService.instance.keyCache.size(); + Assert.assertTrue(endCount > startCount); + CacheService.instance.keyCache.submitWrite(Integer.MAX_VALUE).get(); + CacheService.instance.invalidateKeyCache(); + Assert.assertEquals(startCount, CacheService.instance.keyCache.size()); + CacheService.instance.keyCache.loadSaved(); + if (BigFormat.instance.getVersion(legacyVersion).storeRows()) + Assert.assertEquals(endCount, CacheService.instance.keyCache.size()); + else + Assert.assertEquals(startCount, CacheService.instance.keyCache.size()); } - private static void loadLegacyTables() throws Exception + private static void verifyReads(String legacyVersion) { - for (String legacyVersion : legacyVersions) + for (int compact = 0; compact <= 1; compact++) { - logger.info("Preparing legacy version {}", legacyVersion); - - createTables(legacyVersion); - - loadLegacyTable("legacy_%s_simple", legacyVersion); - loadLegacyTable("legacy_%s_simple_counter", legacyVersion); - loadLegacyTable("legacy_%s_clust", legacyVersion); - loadLegacyTable("legacy_%s_clust_counter", legacyVersion); - - CacheService.instance.invalidateKeyCache(); - long startCount = CacheService.instance.keyCache.size(); for (int ck = 0; ck < 50; ck++) { String ckValue = Integer.toString(ck) + longString; @@ -265,58 +219,94 @@ public class LegacySSTableTest UntypedResultSet rs; if (ck == 0) { - rs = QueryProcessor.executeInternal(String.format("SELECT val FROM legacy_tables.legacy_%s_simple WHERE pk=?", legacyVersion), pkValue); - Assert.assertNotNull(rs); - Assert.assertEquals(1, rs.size()); - Assert.assertEquals("foo bar baz", rs.one().getString("val")); - rs = QueryProcessor.executeInternal(String.format("SELECT val FROM legacy_tables.legacy_%s_simple_counter WHERE pk=?", legacyVersion), pkValue); - Assert.assertNotNull(rs); - Assert.assertEquals(1, rs.size()); - Assert.assertEquals(1L, rs.one().getLong("val")); + readSimpleTable(legacyVersion, getCompactNameSuffix(compact), pkValue); + readSimpleCounterTable(legacyVersion, getCompactNameSuffix(compact), pkValue); } - rs = QueryProcessor.executeInternal(String.format("SELECT val FROM legacy_tables.legacy_%s_clust WHERE pk=? AND ck=?", legacyVersion), pkValue, ckValue); - assertLegacyClustRows(1, rs); - - String ckValue2 = Integer.toString(ck < 10 ? 40 : ck - 1) + longString; - String ckValue3 = Integer.toString(ck > 39 ? 10 : ck + 1) + longString; - rs = QueryProcessor.executeInternal(String.format("SELECT val FROM legacy_tables.legacy_%s_clust WHERE pk=? AND ck IN (?, ?, ?)", legacyVersion), pkValue, ckValue, ckValue2, ckValue3); - assertLegacyClustRows(3, rs); - - rs = QueryProcessor.executeInternal(String.format("SELECT val FROM legacy_tables.legacy_%s_clust_counter WHERE pk=? AND ck=?", legacyVersion), pkValue, ckValue); - Assert.assertNotNull(rs); - Assert.assertEquals(1, rs.size()); - Assert.assertEquals(1L, rs.one().getLong("val")); + readClusteringTable(legacyVersion, getCompactNameSuffix(compact), ck, ckValue, pkValue); + readClusteringCounterTable(legacyVersion, getCompactNameSuffix(compact), ckValue, pkValue); } } - - //For https://issues.apache.org/jira/browse/CASSANDRA-10778 - //Validate whether the key cache successfully saves in the presence of old keys as - //well as loads the correct number of keys - long endCount = CacheService.instance.keyCache.size(); - Assert.assertTrue(endCount > startCount); - CacheService.instance.keyCache.submitWrite(Integer.MAX_VALUE).get(); - CacheService.instance.invalidateKeyCache(); - Assert.assertEquals(startCount, CacheService.instance.keyCache.size()); - CacheService.instance.keyCache.loadSaved(); - if (BigFormat.instance.getVersion(legacyVersion).storeRows()) - Assert.assertEquals(endCount, CacheService.instance.keyCache.size()); - else - Assert.assertEquals(startCount, CacheService.instance.keyCache.size()); } } - private void createKeyspace() + private static void readClusteringCounterTable(String legacyVersion, String compactSuffix, String ckValue, String pkValue) + { + logger.debug("Read legacy_{}_clust_counter{}", legacyVersion, compactSuffix); + UntypedResultSet rs; + rs = QueryProcessor.executeInternal(String.format("SELECT val FROM legacy_tables.legacy_%s_clust_counter%s WHERE pk=? AND ck=?", legacyVersion, compactSuffix), pkValue, ckValue); + Assert.assertNotNull(rs); + Assert.assertEquals(1, rs.size()); + Assert.assertEquals(1L, rs.one().getLong("val")); + } + + private static void readClusteringTable(String legacyVersion, String compactSuffix, int ck, String ckValue, String pkValue) + { + logger.debug("Read legacy_{}_clust{}", legacyVersion, compactSuffix); + UntypedResultSet rs; + rs = QueryProcessor.executeInternal(String.format("SELECT val FROM legacy_tables.legacy_%s_clust%s WHERE pk=? AND ck=?", legacyVersion, compactSuffix), pkValue, ckValue); + assertLegacyClustRows(1, rs); + + String ckValue2 = Integer.toString(ck < 10 ? 40 : ck - 1) + longString; + String ckValue3 = Integer.toString(ck > 39 ? 10 : ck + 1) + longString; + rs = QueryProcessor.executeInternal(String.format("SELECT val FROM legacy_tables.legacy_%s_clust%s WHERE pk=? AND ck IN (?, ?, ?)", legacyVersion, compactSuffix), pkValue, ckValue, ckValue2, ckValue3); + assertLegacyClustRows(3, rs); + } + + private static void readSimpleCounterTable(String legacyVersion, String compactSuffix, String pkValue) + { + logger.debug("Read legacy_{}_simple_counter{}", legacyVersion, compactSuffix); + UntypedResultSet rs; + rs = QueryProcessor.executeInternal(String.format("SELECT val FROM legacy_tables.legacy_%s_simple_counter%s WHERE pk=?", legacyVersion, compactSuffix), pkValue); + Assert.assertNotNull(rs); + Assert.assertEquals(1, rs.size()); + Assert.assertEquals(1L, rs.one().getLong("val")); + } + + private static void readSimpleTable(String legacyVersion, String compactSuffix, String pkValue) + { + logger.debug("Read simple: legacy_{}_simple{}", legacyVersion, compactSuffix); + UntypedResultSet rs; + rs = QueryProcessor.executeInternal(String.format("SELECT val FROM legacy_tables.legacy_%s_simple%s WHERE pk=?", legacyVersion, compactSuffix), pkValue); + Assert.assertNotNull(rs); + Assert.assertEquals(1, rs.size()); + Assert.assertEquals("foo bar baz", rs.one().getString("val")); + } + + private static void createKeyspace() { QueryProcessor.executeInternal("CREATE KEYSPACE legacy_tables WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}"); } private static void createTables(String legacyVersion) { - QueryProcessor.executeInternal(String.format("CREATE TABLE legacy_tables.legacy_%s_simple (pk text PRIMARY KEY, val text)", legacyVersion)); - QueryProcessor.executeInternal(String.format("CREATE TABLE legacy_tables.legacy_%s_simple_counter (pk text PRIMARY KEY, val counter)", legacyVersion)); - QueryProcessor.executeInternal(String.format("CREATE TABLE legacy_tables.legacy_%s_clust (pk text, ck text, val text, PRIMARY KEY (pk, ck))", legacyVersion)); - QueryProcessor.executeInternal(String.format("CREATE TABLE legacy_tables.legacy_%s_clust_counter (pk text, ck text, val counter, PRIMARY KEY (pk, ck))", legacyVersion)); + for (int i=0; i<=1; i++) + { + String compactSuffix = getCompactNameSuffix(i); + String tableSuffix = i == 0? "" : " WITH COMPACT STORAGE"; + QueryProcessor.executeInternal(String.format("CREATE TABLE legacy_tables.legacy_%s_simple%s (pk text PRIMARY KEY, val text)%s", legacyVersion, compactSuffix, tableSuffix)); + QueryProcessor.executeInternal(String.format("CREATE TABLE legacy_tables.legacy_%s_simple_counter%s (pk text PRIMARY KEY, val counter)%s", legacyVersion, compactSuffix, tableSuffix)); + QueryProcessor.executeInternal(String.format("CREATE TABLE legacy_tables.legacy_%s_clust%s (pk text, ck text, val text, PRIMARY KEY (pk, ck))%s", legacyVersion, compactSuffix, tableSuffix)); + QueryProcessor.executeInternal(String.format("CREATE TABLE legacy_tables.legacy_%s_clust_counter%s (pk text, ck text, val counter, PRIMARY KEY (pk, ck))%s", legacyVersion, compactSuffix, tableSuffix)); + } + } + + private static String getCompactNameSuffix(int i) + { + return i == 0? "" : "_compact"; + } + + private static void truncateTables(String legacyVersion) + { + for (int compact = 0; compact <= 1; compact++) + { + QueryProcessor.executeInternal(String.format("TRUNCATE legacy_tables.legacy_%s_simple%s", legacyVersion, getCompactNameSuffix(compact))); + QueryProcessor.executeInternal(String.format("TRUNCATE legacy_tables.legacy_%s_simple_counter%s", legacyVersion, getCompactNameSuffix(compact))); + QueryProcessor.executeInternal(String.format("TRUNCATE legacy_tables.legacy_%s_clust%s", legacyVersion, getCompactNameSuffix(compact))); + QueryProcessor.executeInternal(String.format("TRUNCATE legacy_tables.legacy_%s_clust_counter%s", legacyVersion, getCompactNameSuffix(compact))); + } + CacheService.instance.invalidateCounterCache(); + CacheService.instance.invalidateKeyCache(); } private static void assertLegacyClustRows(int count, UntypedResultSet rs) @@ -332,9 +322,9 @@ public class LegacySSTableTest } } - private static void loadLegacyTable(String tablePattern, String legacyVersion) throws IOException + private static void loadLegacyTable(String tablePattern, String legacyVersion, String compactSuffix) throws IOException { - String table = String.format(tablePattern, legacyVersion); + String table = String.format(tablePattern, legacyVersion, compactSuffix); logger.info("Loading legacy table {}", table); @@ -349,7 +339,7 @@ public class LegacySSTableTest } /** - * Generates sstables for 4 CQL tables (see {@link #createTables(String)}) in current + * Generates sstables for 8 CQL tables (see {@link #createTables(String)}) in current * sstable format (version) into {@code test/data/legacy-sstables/VERSION}, where * {@code VERSION} matches {@link Version#getVersion() BigFormat.latestVersion.getVersion()}. *

@@ -357,13 +347,10 @@ public class LegacySSTableTest * during development. I.e. remove the {@code @Ignore} annotation temporarily. *

*/ - @Test @Ignore + @Test public void testGenerateSstables() throws Throwable { - createKeyspace(); - createTables(BigFormat.latestVersion.getVersion()); - Random rand = new Random(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 128; i++) @@ -372,25 +359,28 @@ public class LegacySSTableTest } String randomString = sb.toString(); - for (int pk = 0; pk < 5; pk++) + for (int compact = 0; compact <= 1; compact++) { - String valPk = Integer.toString(pk); - QueryProcessor.executeInternal(String.format("INSERT INTO legacy_tables.legacy_%s_simple (pk, val) VALUES ('%s', '%s')", - BigFormat.latestVersion, valPk, "foo bar baz")); - - QueryProcessor.executeInternal(String.format("UPDATE legacy_tables.legacy_%s_simple_counter SET val = val + 1 WHERE pk = '%s'", - BigFormat.latestVersion, valPk)); - - for (int ck = 0; ck < 50; ck++) + for (int pk = 0; pk < 5; pk++) { - String valCk = Integer.toString(ck); + String valPk = Integer.toString(pk); + QueryProcessor.executeInternal(String.format("INSERT INTO legacy_tables.legacy_%s_simple%s (pk, val) VALUES ('%s', '%s')", + BigFormat.latestVersion, getCompactNameSuffix(compact), valPk, "foo bar baz")); - QueryProcessor.executeInternal(String.format("INSERT INTO legacy_tables.legacy_%s_clust (pk, ck, val) VALUES ('%s', '%s', '%s')", - BigFormat.latestVersion, valPk, valCk + longString, randomString)); + QueryProcessor.executeInternal(String.format("UPDATE legacy_tables.legacy_%s_simple_counter%s SET val = val + 1 WHERE pk = '%s'", + BigFormat.latestVersion, getCompactNameSuffix(compact), valPk)); - QueryProcessor.executeInternal(String.format("UPDATE legacy_tables.legacy_%s_clust_counter SET val = val + 1 WHERE pk = '%s' AND ck='%s'", - BigFormat.latestVersion, valPk, valCk + longString)); + for (int ck = 0; ck < 50; ck++) + { + String valCk = Integer.toString(ck); + QueryProcessor.executeInternal(String.format("INSERT INTO legacy_tables.legacy_%s_clust%s (pk, ck, val) VALUES ('%s', '%s', '%s')", + BigFormat.latestVersion, getCompactNameSuffix(compact), valPk, valCk + longString, randomString)); + + QueryProcessor.executeInternal(String.format("UPDATE legacy_tables.legacy_%s_clust_counter%s SET val = val + 1 WHERE pk = '%s' AND ck='%s'", + BigFormat.latestVersion, getCompactNameSuffix(compact), valPk, valCk + longString)); + + } } } @@ -398,10 +388,13 @@ public class LegacySSTableTest File ksDir = new File(LEGACY_SSTABLE_ROOT, String.format("%s/legacy_tables", BigFormat.latestVersion)); ksDir.mkdirs(); - copySstablesFromTestData(String.format("legacy_%s_simple", BigFormat.latestVersion), ksDir); - copySstablesFromTestData(String.format("legacy_%s_simple_counter", BigFormat.latestVersion), ksDir); - copySstablesFromTestData(String.format("legacy_%s_clust", BigFormat.latestVersion), ksDir); - copySstablesFromTestData(String.format("legacy_%s_clust_counter", BigFormat.latestVersion), ksDir); + for (int compact = 0; compact <= 1; compact++) + { + copySstablesFromTestData(String.format("legacy_%s_simple%s", BigFormat.latestVersion, getCompactNameSuffix(compact)), ksDir); + copySstablesFromTestData(String.format("legacy_%s_simple_counter%s", BigFormat.latestVersion, getCompactNameSuffix(compact)), ksDir); + copySstablesFromTestData(String.format("legacy_%s_clust%s", BigFormat.latestVersion, getCompactNameSuffix(compact)), ksDir); + copySstablesFromTestData(String.format("legacy_%s_clust_counter%s", BigFormat.latestVersion, getCompactNameSuffix(compact)), ksDir); + } } private void copySstablesFromTestData(String table, File ksDir) throws IOException @@ -420,12 +413,17 @@ public class LegacySSTableTest private static void copySstablesToTestData(String legacyVersion, String table, File cfDir) throws IOException { - for (File file : new File(LEGACY_SSTABLE_ROOT, String.format("%s/legacy_tables/%s", legacyVersion, table)).listFiles()) + for (File file : getTableDir(legacyVersion, table).listFiles()) { copyFile(cfDir, file); } } + private static File getTableDir(String legacyVersion, String table) + { + return new File(LEGACY_SSTABLE_ROOT, String.format("%s/legacy_tables/%s", legacyVersion, table)); + } + private static void copyFile(File cfDir, File file) throws IOException { byte[] buf = new byte[65536]; diff --git a/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java b/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java index c3a4539c1c..360d262ce6 100644 --- a/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java +++ b/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java @@ -406,7 +406,7 @@ public class BufferedRandomAccessFileTest assert tmpFile.getPath().equals(r.getPath()); // Create a mark and move the rw there. - final FileMark mark = r.mark(); + final DataPosition mark = r.mark(); r.reset(mark); // Expect this call to succeed. @@ -457,7 +457,7 @@ public class BufferedRandomAccessFileTest RandomAccessReader file = RandomAccessReader.open(channel); file.seek(10); - FileMark mark = file.mark(); + DataPosition mark = file.mark(); file.seek(file.length()); assertTrue(file.isEOF()); diff --git a/test/unit/org/apache/cassandra/io/util/RandomAccessReaderTest.java b/test/unit/org/apache/cassandra/io/util/RandomAccessReaderTest.java index f0d4383c20..e83c0151a9 100644 --- a/test/unit/org/apache/cassandra/io/util/RandomAccessReaderTest.java +++ b/test/unit/org/apache/cassandra/io/util/RandomAccessReaderTest.java @@ -356,7 +356,7 @@ public class RandomAccessReaderTest assertFalse(reader.isEOF()); assertEquals((numIterations - 1) * expected.length(), reader.bytesRemaining()); - FileMark mark = reader.mark(); + DataPosition mark = reader.mark(); assertEquals(0, reader.bytesPastMark()); assertEquals(0, reader.bytesPastMark(mark)); diff --git a/test/unit/org/apache/cassandra/io/util/RewindableDataInputStreamPlusTest.java b/test/unit/org/apache/cassandra/io/util/RewindableDataInputStreamPlusTest.java new file mode 100644 index 0000000000..175ab53ec1 --- /dev/null +++ b/test/unit/org/apache/cassandra/io/util/RewindableDataInputStreamPlusTest.java @@ -0,0 +1,539 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cassandra.io.util; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.IOException; + +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +public class RewindableDataInputStreamPlusTest +{ + + private final int INITIAL_BUFFER_SIZE = 1; + + private File file; + + @Before + public void setup() throws Exception + { + this.file = new File(System.getProperty("java.io.tmpdir"), "subdir/test.buffer"); + } + + @Test + public void testMarkAndResetSimple() throws Exception + { + byte[] testData; + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (DataOutputStream out = new DataOutputStream(baos)) + { + // boolean + out.writeBoolean(true); + // byte + out.writeByte(0x1); + // char + out.writeChar('a'); + // short + out.writeShort(1); + // int + out.writeInt(1); + // long + out.writeLong(1L); + // float + out.writeFloat(1.0f); + // double + out.writeDouble(1.0d); + + // String + out.writeUTF("abc"); + testData = baos.toByteArray(); + } + + for (int memCapacity = 0; memCapacity <= 16; memCapacity++) + { + int diskCapacity = 16 - memCapacity; + try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData), + INITIAL_BUFFER_SIZE, memCapacity, file, + diskCapacity)) + { + try { + //should mark before resetting + reader.reset(null); + fail("Should have thrown IOException"); + } catch (IOException e) {} + + assertTrue(reader.readBoolean()); + + reader.mark(); + + try { + //cannot mark already marked stream + reader.mark(); + fail("Should have thrown IllegalStateException"); + } catch (IllegalStateException e) {} + + assertEquals(0x1, reader.readByte()); + assertEquals('a', reader.readChar()); + assertEquals(3, reader.bytesPastMark(null)); + reader.reset(null); + + try { + //cannot mark when reading from cache + reader.mark(); + fail("Should have thrown IllegalStateException"); + } catch (IllegalStateException e) {} + + //read again previous sequence + assertEquals(0x1, reader.readByte()); + assertEquals('a', reader.readChar()); + //finish reading again previous sequence + assertEquals(1, reader.readShort()); + + reader.mark(); + assertEquals(1, reader.readInt()); + assertEquals(1L, reader.readLong()); + assertEquals(1.0f, reader.readFloat(), 0); + assertEquals(16, reader.bytesPastMark(null)); + reader.reset(null); + + //read again previous sequence + assertEquals(1, reader.readInt()); + assertEquals(1L, reader.readLong()); + assertEquals(1.0f, reader.readFloat(), 0); + //finish reading again previous sequence + + //mark again + reader.mark(); + assertEquals(1.0d, reader.readDouble(), 0); + assertEquals(8, reader.bytesPastMark(null)); + reader.reset(null); + + //read again previous sequence + assertEquals(1.0d, reader.readDouble(), 0); + //finish reading again previous sequence + + //mark and reset + reader.mark(); + reader.reset(null); + + assertEquals("abc", reader.readUTF()); + + //check max file size + assertEquals(diskCapacity, file.length()); + } + assertFalse(file.exists()); + } + } + + @Test + public void testVeryLargeCapacity() throws Exception + { + byte[] testData; + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (DataOutputStream out = new DataOutputStream(baos)) + { + out.writeUTF("abc"); + testData = baos.toByteArray(); + } + + try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData), + INITIAL_BUFFER_SIZE, Integer.MAX_VALUE, file, + Integer.MAX_VALUE)) + { + reader.mark(); + assertEquals("abc", reader.readUTF()); + reader.reset(); + assertEquals("abc", reader.readUTF()); + } + assertFalse(file.exists()); + + + baos = new ByteArrayOutputStream(); + try (DataOutputStream out = new DataOutputStream(baos)) + { + out.writeBoolean(true); + out.writeBoolean(true); + testData = baos.toByteArray(); + } + } + + @Test + public void testMarkAndResetBigBuffer() throws Exception + { + byte[] testData; + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (DataOutputStream out = new DataOutputStream(baos)) + { + // boolean + out.writeBoolean(true); + // byte + out.writeByte(0x1); + // char + out.writeChar('a'); + // short + out.writeShort(1); + // int + out.writeInt(1); + // long + out.writeLong(1L); + // float + out.writeFloat(1.0f); + // double + out.writeDouble(1.0d); + + // String + out.writeUTF("abc"); + testData = baos.toByteArray(); + + // 1 (boolean) + 1 (byte) + 2 (char) + 2 (short) + 4 (int) + 8 (long) + // + 4 (float) + 8 (double) + 5 bytes (utf string) + } + + for (int memCapacity = 0; memCapacity <= 18; memCapacity++) + { + int diskCapacity = 18 - memCapacity; + try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData), + INITIAL_BUFFER_SIZE, memCapacity, file, + diskCapacity)) + { + //read a big amount before resetting + reader.mark(); + assertTrue(reader.readBoolean()); + assertEquals(0x1, reader.readByte()); + assertEquals('a', reader.readChar()); + assertEquals(1, reader.readShort()); + assertEquals(1, reader.readInt()); + assertEquals(1L, reader.readLong()); + reader.reset(); + + //read from buffer + assertTrue(reader.readBoolean()); + assertEquals(0x1, reader.readByte()); + assertEquals('a', reader.readChar()); + assertEquals(1, reader.readShort()); + assertEquals(1, reader.readInt()); + assertEquals(1L, reader.readLong()); + + assertEquals(17, reader.available()); + + //mark again + reader.mark(); + assertEquals(1.0f, reader.readFloat(), 0); + assertEquals(1.0d, reader.readDouble(), 0); + assertEquals("abc", reader.readUTF()); + reader.reset(); + + assertEquals(17, reader.available()); + + assertEquals(1.0f, reader.readFloat(), 0); + assertEquals(1.0d, reader.readDouble(), 0); + assertEquals("abc", reader.readUTF()); + } + assertFalse(file.exists()); + } + } + + + @Test + public void testCircularSpillFile() throws Exception + { + byte[] testData; + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (DataOutputStream out = new DataOutputStream(baos)) + { + // boolean + out.writeBoolean(true); + // byte + out.writeByte(0x1); + // char + out.writeChar('a'); + // short + out.writeShort(1); + // int + out.writeInt(1); + + // String + out.writeUTF("ab"); + testData = baos.toByteArray(); + + // 1 (boolean) + 1 (byte) + 2 (char) + 2 (short) + 4 (int) + 4 bytes (utf string) + } + + //read at most 4 bytes multiple times (and then check file size) + int MEM_SIZE = 0; + int DISK_SIZE = 4; + try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData), + INITIAL_BUFFER_SIZE, MEM_SIZE, file, + DISK_SIZE)) + { + //read 2 bytes and reset + reader.mark(); + assertTrue(reader.readBoolean()); + assertEquals(0x1, reader.readByte()); + assertEquals(2, reader.bytesPastMark(null)); + reader.reset(); + + //read again previous sequence + assertTrue(reader.readBoolean()); + assertEquals(0x1, reader.readByte()); + //finish reading again previous sequence + + //read 4 bytes and reset + reader.mark(); + assertEquals('a', reader.readChar()); + assertEquals(1, reader.readShort()); + assertEquals(4, reader.bytesPastMark(null)); + reader.reset(); + + //read again previous sequence + assertEquals('a', reader.readChar()); + assertEquals(1, reader.readShort()); + //finish reading again previous sequence + + //read 4 bytes and reset + reader.mark(); + assertEquals(1, reader.readInt()); + assertEquals(4, reader.bytesPastMark(null)); + reader.reset(); + + //read again previous sequence + assertEquals(1, reader.readInt()); + + //check max file size + assertEquals(DISK_SIZE, file.length()); + } + assertFalse(file.exists()); + } + + @Test + public void testExhaustCapacity() throws Exception + { + byte[] testData; + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (DataOutputStream out = new DataOutputStream(baos)) + { + // boolean + out.writeBoolean(true); + // byte + out.writeByte(0x1); + // char + out.writeChar('a'); + // short + out.writeShort(1); + testData = baos.toByteArray(); + } + + //test capacity exhausted when reading more than 4 bytes + testCapacityExhausted(testData, 0, 2); + testCapacityExhausted(testData, 2, 0); + testCapacityExhausted(testData, 1, 1); + } + + private void testCapacityExhausted(byte[] testData, int memSize, int diskSize) throws IOException + { + try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData), + INITIAL_BUFFER_SIZE, memSize, file, + diskSize)) + { + //read 2 bytes and reset + reader.mark(); + assertTrue(reader.readBoolean()); + assertEquals(0x1, reader.readByte()); + assertEquals(2, reader.bytesPastMark(null)); + reader.reset(); + + //read again previous sequence + assertTrue(reader.readBoolean()); + assertEquals(0x1, reader.readByte()); + //finish reading again previous sequence + + reader.mark(); + //read 3 bytes - OK + assertEquals('a', reader.readChar()); + //read 1 more bytes - CAPACITY will exhaust when trying to reset :( + assertEquals(1, reader.readShort()); + + try + { + reader.reset(); + fail("Should have thrown IOException"); + } + catch (IOException e) {} + + //check max file size + assertEquals(diskSize, file.length()); + } + assertFalse(file.exists()); + } + + @Test + public void testMarkAndResetUnsignedRead() throws Exception + { + byte[] testData; + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (DataOutputStream out = new DataOutputStream(baos)) + { + // byte + out.writeByte(0x1); + // short + out.writeShort(2); + testData = baos.toByteArray(); + } + + for (int memCapacity = 0; memCapacity <= 1; memCapacity++) + { + int diskCapacity = 1 - memCapacity; + try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData), + INITIAL_BUFFER_SIZE, memCapacity, file, + diskCapacity)) + { + reader.mark(); + assertEquals(1, reader.readUnsignedByte()); + reader.reset(); + assertEquals(1, reader.readUnsignedByte()); + + //will read first byte of short 2 + reader.mark(); + assertEquals(0, reader.readUnsignedByte()); + reader.reset(); + + assertEquals(2, reader.readUnsignedShort()); + + reader.mark(); + reader.reset(); + assertEquals(0, reader.available()); + } + } + assertFalse(file.exists()); + } + + @Test + public void testMarkAndResetSkipBytes() throws Exception + { + String testStr = "1234567890"; + byte[] testData = testStr.getBytes(); + + for (int memCapacity = 0; memCapacity <= 7; memCapacity++) + { + int diskCapacity = 7 - memCapacity; + try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData), + INITIAL_BUFFER_SIZE, memCapacity, file, + diskCapacity)) + { + reader.mark(); + // read first 5 bytes and rewind + byte[] out = new byte[5]; + reader.readFully(out, 0, 5); + assertEquals("12345", new String(out)); + + // then skip 2 bytes (67) + reader.skipBytes(2); + + assertEquals(7, reader.bytesPastMark(null)); + reader.reset(); + + //now read part of the previously skipped bytes + out = new byte[5]; + reader.readFully(out); + assertEquals("12345", new String(out)); + + //skip 3 bytes (2 from cache, 1 from stream) + reader.skip(3); + + // mark and read 2 more bytes + reader.mark(); + out = new byte[2]; + reader.readFully(out); + assertEquals("90", new String(out)); + assertEquals(0, reader.available()); + reader.reset(); + + //reset and read only the next byte "9" in the third position + reader.readFully(out, 1, 1); + assertEquals("99", new String(out)); + + //now we read the remainder via readline + assertEquals(1, reader.available()); + assertEquals("0", reader.readLine()); + + } + assertFalse(file.exists()); + } + } + + @Test + public void testMarkAndResetReadFully() throws Exception + { + String testStr = "1234567890"; + byte[] testData = testStr.getBytes(); + + for (int memCapacity = 0; memCapacity <= 5; memCapacity++) + { + int diskCapacity = 5 - memCapacity; + try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData), + INITIAL_BUFFER_SIZE, memCapacity, file, + diskCapacity)) + { + reader.mark(); + // read first 5 bytes and rewind + byte[] out = new byte[5]; + reader.readFully(out, 0, 5); + assertEquals("12345", new String(out)); + reader.reset(); + + // read half from cache, half from parent stream + out = new byte[7]; + reader.readFully(out); + assertEquals("1234567", new String(out)); + + // mark and read 3 more bytes + reader.mark(); + out = new byte[3]; + reader.readFully(out); + assertEquals("890", new String(out)); + assertEquals(0, reader.available()); + reader.reset(); + + //reset and read only the next byte "8" in the third position + reader.readFully(out, 2, 1); + assertEquals("898", new String(out)); + + //now we read the remainder via readline + assertEquals(2, reader.available()); + assertEquals("90", reader.readLine()); + } + assertFalse(file.exists()); + } + } +} diff --git a/test/unit/org/apache/cassandra/utils/BytesReadTrackerTest.java b/test/unit/org/apache/cassandra/utils/BytesReadTrackerTest.java index 221e55c0fc..7693b45a02 100644 --- a/test/unit/org/apache/cassandra/utils/BytesReadTrackerTest.java +++ b/test/unit/org/apache/cassandra/utils/BytesReadTrackerTest.java @@ -18,6 +18,10 @@ */ package org.apache.cassandra.utils; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; @@ -25,14 +29,43 @@ import java.io.DataOutputStream; import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import org.apache.cassandra.io.util.BytesReadTracker; +import org.apache.cassandra.io.util.DataInputPlus; +import org.apache.cassandra.io.util.TrackedDataInputPlus; +import org.apache.cassandra.io.util.TrackedInputStream; public class BytesReadTrackerTest { @Test public void testBytesRead() throws Exception + { + internalTestBytesRead(true); + internalTestBytesRead(false); + } + + @Test + public void testUnsignedRead() throws Exception + { + internalTestUnsignedRead(true); + internalTestUnsignedRead(false); + } + + @Test + public void testSkipBytesAndReadFully() throws Exception + { + internalTestSkipBytesAndReadFully(true); + internalTestSkipBytesAndReadFully(false); + } + + @Test + public void testReadLine() throws Exception + { + internalTestReadLine(true); + internalTestReadLine(false); + } + + public void internalTestBytesRead(boolean inputStream) throws Exception { byte[] testData; @@ -66,45 +99,46 @@ public class BytesReadTrackerTest out.close(); } - DataInputStream in = new DataInputStream(new ByteArrayInputStream(testData)); - BytesReadTracker tracker = new BytesReadTracker(in); + DataInputPlus.DataInputStreamPlus in = new DataInputPlus.DataInputStreamPlus(new ByteArrayInputStream(testData)); + BytesReadTracker tracker = inputStream? new TrackedInputStream(in) : new TrackedDataInputPlus(in); + DataInputPlus reader = inputStream? new DataInputPlus.DataInputStreamPlus((TrackedInputStream)tracker) : (DataInputPlus) tracker; try { // boolean = 1byte - boolean bool = tracker.readBoolean(); + boolean bool = reader.readBoolean(); assertTrue(bool); assertEquals(1, tracker.getBytesRead()); // byte = 1byte - byte b = tracker.readByte(); + byte b = reader.readByte(); assertEquals(b, 0x1); assertEquals(2, tracker.getBytesRead()); // char = 2byte - char c = tracker.readChar(); + char c = reader.readChar(); assertEquals('a', c); assertEquals(4, tracker.getBytesRead()); // short = 2bytes - short s = tracker.readShort(); + short s = reader.readShort(); assertEquals(1, s); assertEquals((short) 6, tracker.getBytesRead()); // int = 4bytes - int i = tracker.readInt(); + int i = reader.readInt(); assertEquals(1, i); assertEquals(10, tracker.getBytesRead()); // long = 8bytes - long l = tracker.readLong(); + long l = reader.readLong(); assertEquals(1L, l); assertEquals(18, tracker.getBytesRead()); // float = 4bytes - float f = tracker.readFloat(); + float f = reader.readFloat(); assertEquals(1.0f, f, 0); assertEquals(22, tracker.getBytesRead()); // double = 8bytes - double d = tracker.readDouble(); + double d = reader.readDouble(); assertEquals(1.0d, d, 0); assertEquals(30, tracker.getBytesRead()); // String("abc") = 2(string size) + 3 = 5 bytes - String str = tracker.readUTF(); + String str = reader.readUTF(); assertEquals("abc", str); assertEquals(35, tracker.getBytesRead()); @@ -119,8 +153,7 @@ public class BytesReadTrackerTest assertEquals(0, tracker.getBytesRead()); } - @Test - public void testUnsignedRead() throws Exception + public void internalTestUnsignedRead(boolean inputStream) throws Exception { byte[] testData; @@ -139,17 +172,18 @@ public class BytesReadTrackerTest out.close(); } - DataInputStream in = new DataInputStream(new ByteArrayInputStream(testData)); - BytesReadTracker tracker = new BytesReadTracker(in); + DataInputPlus.DataInputStreamPlus in = new DataInputPlus.DataInputStreamPlus(new ByteArrayInputStream(testData)); + BytesReadTracker tracker = inputStream? new TrackedInputStream(in) : new TrackedDataInputPlus(in); + DataInputPlus reader = inputStream? new DataInputPlus.DataInputStreamPlus((TrackedInputStream)tracker) : (DataInputPlus) tracker; try { // byte = 1byte - int b = tracker.readUnsignedByte(); + int b = reader.readUnsignedByte(); assertEquals(b, 1); assertEquals(1, tracker.getBytesRead()); // short = 2bytes - int s = tracker.readUnsignedShort(); + int s = reader.readUnsignedShort(); assertEquals(1, s); assertEquals(3, tracker.getBytesRead()); @@ -161,30 +195,30 @@ public class BytesReadTrackerTest } } - @Test - public void testSkipBytesAndReadFully() throws Exception + public void internalTestSkipBytesAndReadFully(boolean inputStream) throws Exception { String testStr = "1234567890"; byte[] testData = testStr.getBytes(); - DataInputStream in = new DataInputStream(new ByteArrayInputStream(testData)); - BytesReadTracker tracker = new BytesReadTracker(in); + DataInputPlus.DataInputStreamPlus in = new DataInputPlus.DataInputStreamPlus(new ByteArrayInputStream(testData)); + BytesReadTracker tracker = inputStream? new TrackedInputStream(in) : new TrackedDataInputPlus(in); + DataInputPlus reader = inputStream? new DataInputPlus.DataInputStreamPlus((TrackedInputStream)tracker) : (DataInputPlus) tracker; try { // read first 5 bytes byte[] out = new byte[5]; - tracker.readFully(out, 0, 5); + reader.readFully(out, 0, 5); assertEquals("12345", new String(out)); assertEquals(5, tracker.getBytesRead()); // then skip 2 bytes - tracker.skipBytes(2); + reader.skipBytes(2); assertEquals(7, tracker.getBytesRead()); // and read the rest out = new byte[3]; - tracker.readFully(out); + reader.readFully(out); assertEquals("890", new String(out)); assertEquals(10, tracker.getBytesRead()); @@ -196,16 +230,24 @@ public class BytesReadTrackerTest } } - @Test(expected = UnsupportedOperationException.class) - public void testReadLine() throws Exception + public void internalTestReadLine(boolean inputStream) throws Exception { DataInputStream in = new DataInputStream(new ByteArrayInputStream("1".getBytes())); - BytesReadTracker tracker = new BytesReadTracker(in); + BytesReadTracker tracker = inputStream? new TrackedInputStream(in) : new TrackedDataInputPlus(in); + DataInputPlus reader = inputStream? new DataInputPlus.DataInputStreamPlus((TrackedInputStream)tracker) : (DataInputPlus) tracker; try { - // throws UnsupportedOperationException - tracker.readLine(); + String line = reader.readLine(); + if (inputStream) + assertEquals(line, "1"); + else + fail("Should have thrown UnsupportedOperationException"); + } + catch (UnsupportedOperationException e) + { + if (inputStream) + fail("Should have not thrown UnsupportedOperationException"); } finally {