From b09e60f72bb2f37235d9e9190c25db36371b3c18 Mon Sep 17 00:00:00 2001 From: Stefania Alborghetti Date: Mon, 27 Apr 2015 14:38:53 +0800 Subject: [PATCH] Introduce safer durable sstable membership management (and simplify cleanup of compaction leftovers) Instead of using temporary files and system tables, this patch introduces a simple transaction log for sstable membership edits that can be committed/aborted atomically and simply replayed on startup. patch by stefania; reviewed by benedict for CASSANDRA-7066 --- CHANGES.txt | 4 + bin/sstablelister | 55 ++ bin/sstablelister.bat | 41 + build.xml | 4 +- .../org/apache/cassandra/config/Config.java | 2 +- .../cassandra/config/DatabaseDescriptor.java | 2 +- .../cassandra/db/ColumnFamilyStore.java | 149 +--- .../org/apache/cassandra/db/Directories.java | 57 +- .../org/apache/cassandra/db/Memtable.java | 31 +- .../apache/cassandra/db/SystemKeyspace.java | 126 +-- .../db/compaction/CompactionController.java | 2 +- .../db/compaction/CompactionManager.java | 22 +- .../db/compaction/CompactionTask.java | 24 +- .../db/compaction/LeveledCompactionTask.java | 8 +- .../db/compaction/OperationType.java | 18 +- .../db/compaction/SSTableSplitter.java | 6 +- .../cassandra/db/compaction/Scrubber.java | 18 +- .../SizeTieredCompactionStrategy.java | 6 +- .../cassandra/db/compaction/Upgrader.java | 13 +- .../writers/CompactionAwareWriter.java | 10 +- .../writers/DefaultCompactionWriter.java | 11 +- .../writers/MajorLeveledCompactionWriter.java | 15 +- .../writers/MaxSSTableSizeWriter.java | 25 +- .../SplittingSizeTieredCompactionWriter.java | 39 +- .../cassandra/db/lifecycle/Helpers.java | 58 +- .../db/lifecycle/LifecycleTransaction.java | 150 +++- .../cassandra/db/lifecycle/Tracker.java | 54 +- .../db/lifecycle/TransactionLogs.java | 786 ++++++++++++++++++ .../sstable/AbstractSSTableSimpleWriter.java | 8 +- .../cassandra/io/sstable/Descriptor.java | 107 ++- .../io/sstable/IndexSummaryManager.java | 7 +- .../apache/cassandra/io/sstable/SSTable.java | 17 +- .../io/sstable/SSTableDeletingTask.java | 130 --- .../cassandra/io/sstable/SSTableLoader.java | 22 +- .../cassandra/io/sstable/SSTableRewriter.java | 20 +- .../sstable/SSTableSimpleUnsortedWriter.java | 7 +- .../io/sstable/SSTableSimpleWriter.java | 5 +- .../io/sstable/SSTableTxnWriter.java | 101 +++ .../io/sstable/format/SSTableReader.java | 171 +--- .../io/sstable/format/SSTableWriter.java | 50 +- .../io/sstable/format/big/BigFormat.java | 12 +- .../io/sstable/format/big/BigTableWriter.java | 69 +- .../sstable/metadata/MetadataSerializer.java | 7 +- .../apache/cassandra/io/util/FileUtils.java | 65 ++ .../cassandra/io/util/SequentialWriter.java | 12 +- .../cassandra/service/CassandraDaemon.java | 16 +- .../apache/cassandra/service/GCInspector.java | 10 +- .../cassandra/service/StartupChecks.java | 6 +- .../cassandra/service/StorageService.java | 4 +- .../cassandra/streaming/StreamLockfile.java | 128 --- .../cassandra/streaming/StreamReader.java | 4 +- .../streaming/StreamReceiveTask.java | 20 +- .../cassandra/streaming/StreamSession.java | 7 + .../cassandra/tools/StandaloneLister.java | 214 +++++ .../cassandra/tools/StandaloneScrubber.java | 5 +- .../cassandra/tools/StandaloneSplitter.java | 10 +- .../cassandra/tools/StandaloneUpgrader.java | 19 +- .../utils/concurrent/Transactional.java | 25 +- .../la-1-big-CompressionInfo.db | Bin 0 -> 43 bytes .../la-1-big-Data.db | Bin 0 -> 93 bytes .../la-1-big-Digest.adler32 | 1 + .../la-1-big-Filter.db | Bin 0 -> 16 bytes .../la-1-big-Index.db | Bin 0 -> 54 bytes .../la-1-big-Statistics.db | Bin 0 -> 4442 bytes .../la-1-big-Summary.db | Bin 0 -> 80 bytes .../la-1-big-TOC.txt | 8 + .../tmp-la-2-big-Data.db | Bin 0 -> 93 bytes .../tmp-la-2-big-Index.db | Bin 0 -> 54 bytes .../tmplink-la-2-big-Data.db | Bin 0 -> 93 bytes .../tmplink-la-2-big-Index.db | Bin 0 -> 54 bytes .../manifest.json | 1 + .../manifest.json | 1 + .../manifest.json | 1 + .../io/sstable/CQLSSTableWriterLongTest.java | 5 +- .../unit/org/apache/cassandra/MockSchema.java | 12 +- test/unit/org/apache/cassandra/Util.java | 3 - .../org/apache/cassandra/cql3/CQLTester.java | 2 +- .../cassandra/db/ColumnFamilyStoreTest.java | 150 +--- .../apache/cassandra/db/DirectoriesTest.java | 24 +- .../org/apache/cassandra/db/ScrubTest.java | 7 +- .../cassandra/db/SystemKeyspaceTest.java | 48 ++ .../db/compaction/AntiCompactionTest.java | 4 +- .../compaction/CompactionAwareWriterTest.java | 8 +- .../db/compaction/CompactionsTest.java | 69 +- .../LeveledCompactionStrategyTest.java | 5 +- .../cassandra/db/lifecycle/HelpersTest.java | 25 +- .../lifecycle/LifecycleTransactionTest.java | 9 +- .../db/lifecycle/RealTransactionsTest.java | 228 +++++ .../cassandra/db/lifecycle/TrackerTest.java | 40 +- .../db/lifecycle/TransactionLogsTest.java | 558 +++++++++++++ .../io/sstable/BigTableWriterTest.java | 27 +- .../sstable/CQLSSTableWriterClientTest.java | 9 + .../cassandra/io/sstable/DescriptorTest.java | 18 +- .../io/sstable/LegacySSTableTest.java | 2 +- .../io/sstable/SSTableLoaderTest.java | 123 ++- .../io/sstable/SSTableRewriterTest.java | 173 ++-- .../cassandra/io/sstable/SSTableUtils.java | 11 +- .../metadata/MetadataSerializerTest.java | 2 +- .../org/apache/cassandra/schema/DefsTest.java | 4 +- .../streaming/StreamTransferTaskTest.java | 3 +- .../concurrent/AbstractTransactionalTest.java | 31 +- 101 files changed, 3267 insertions(+), 1359 deletions(-) create mode 100755 bin/sstablelister create mode 100644 bin/sstablelister.bat create mode 100644 src/java/org/apache/cassandra/db/lifecycle/TransactionLogs.java delete mode 100644 src/java/org/apache/cassandra/io/sstable/SSTableDeletingTask.java create mode 100644 src/java/org/apache/cassandra/io/sstable/SSTableTxnWriter.java delete mode 100644 src/java/org/apache/cassandra/streaming/StreamLockfile.java create mode 100644 src/java/org/apache/cassandra/tools/StandaloneLister.java create mode 100644 test/data/migration-sstables/2.2/keyspace1/test-dfcc85801bc811e5aa694b06169f4ffa/la-1-big-CompressionInfo.db create mode 100644 test/data/migration-sstables/2.2/keyspace1/test-dfcc85801bc811e5aa694b06169f4ffa/la-1-big-Data.db create mode 100644 test/data/migration-sstables/2.2/keyspace1/test-dfcc85801bc811e5aa694b06169f4ffa/la-1-big-Digest.adler32 create mode 100644 test/data/migration-sstables/2.2/keyspace1/test-dfcc85801bc811e5aa694b06169f4ffa/la-1-big-Filter.db create mode 100644 test/data/migration-sstables/2.2/keyspace1/test-dfcc85801bc811e5aa694b06169f4ffa/la-1-big-Index.db create mode 100644 test/data/migration-sstables/2.2/keyspace1/test-dfcc85801bc811e5aa694b06169f4ffa/la-1-big-Statistics.db create mode 100644 test/data/migration-sstables/2.2/keyspace1/test-dfcc85801bc811e5aa694b06169f4ffa/la-1-big-Summary.db create mode 100644 test/data/migration-sstables/2.2/keyspace1/test-dfcc85801bc811e5aa694b06169f4ffa/la-1-big-TOC.txt create mode 100644 test/data/migration-sstables/2.2/keyspace1/test-dfcc85801bc811e5aa694b06169f4ffa/tmp-la-2-big-Data.db create mode 100644 test/data/migration-sstables/2.2/keyspace1/test-dfcc85801bc811e5aa694b06169f4ffa/tmp-la-2-big-Index.db create mode 100644 test/data/migration-sstables/2.2/keyspace1/test-dfcc85801bc811e5aa694b06169f4ffa/tmplink-la-2-big-Data.db create mode 100644 test/data/migration-sstables/2.2/keyspace1/test-dfcc85801bc811e5aa694b06169f4ffa/tmplink-la-2-big-Index.db create mode 100644 test/data/migration-sstables/2.2/system/compactions_in_progress-55080ab05d9c388690a4acb25fe1f77b/snapshots/1435108403246-compactions_in_progress/manifest.json create mode 100644 test/data/migration-sstables/2.2/system/compactions_in_progress-55080ab05d9c388690a4acb25fe1f77b/snapshots/1435298241281-upgrade-3.0.0-SNAPSHOT-2.2.0-rc1-SNAPSHOT/manifest.json create mode 100644 test/data/migration-sstables/2.2/system/compactions_in_progress-55080ab05d9c388690a4acb25fe1f77b/snapshots/1435298241532-compactions_in_progress/manifest.json create mode 100644 test/unit/org/apache/cassandra/db/lifecycle/RealTransactionsTest.java create mode 100644 test/unit/org/apache/cassandra/db/lifecycle/TransactionLogsTest.java diff --git a/CHANGES.txt b/CHANGES.txt index 70b26f537a..a0dadc33a0 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,5 +1,9 @@ 3.0 +<<<<<<< HEAD * Implement proper sandboxing for UDFs (CASSANDRA-9402) +======= + * Simplify (and unify) cleanup of compaction leftovers (CASSANDRA-7066) +>>>>>>> Introduce safer durable sstable membership management * Allow extra schema definitions in cassandra-stress yaml (CASSANDRA-9850) * Metrics should use up to date nomenclature (CASSANDRA-9448) * Change CREATE/ALTER TABLE syntax for compression (CASSANDRA-8384) diff --git a/bin/sstablelister b/bin/sstablelister new file mode 100755 index 0000000000..a79409d3b9 --- /dev/null +++ b/bin/sstablelister @@ -0,0 +1,55 @@ +#!/bin/sh + +# 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. + +if [ "x$CASSANDRA_INCLUDE" = "x" ]; then + for include in /usr/share/cassandra/cassandra.in.sh \ + /usr/local/share/cassandra/cassandra.in.sh \ + /opt/cassandra/cassandra.in.sh \ + ~/.cassandra.in.sh \ + "`dirname "$0"`/cassandra.in.sh"; do + if [ -r "$include" ]; then + . "$include" + break + fi + done +elif [ -r "$CASSANDRA_INCLUDE" ]; then + . "$CASSANDRA_INCLUDE" +fi + +# Use JAVA_HOME if set, otherwise look for java in PATH +if [ -x "$JAVA_HOME/bin/java" ]; then + JAVA="$JAVA_HOME/bin/java" +else + JAVA="`which java`" +fi + +if [ -z "$CLASSPATH" ]; then + echo "You must set the CLASSPATH var" >&2 + exit 1 +fi + +if [ "x$MAX_HEAP_SIZE" = "x" ]; then + MAX_HEAP_SIZE="256M" +fi + +"$JAVA" $JAVA_AGENT -ea -cp "$CLASSPATH" $JVM_OPTS -Xmx$MAX_HEAP_SIZE \ + -Dcassandra.storagedir="$cassandra_storagedir" \ + -Dlogback.configurationFile=logback-tools.xml \ + org.apache.cassandra.tools.StandaloneLister "$@" + +# vi:ai sw=4 ts=4 tw=0 et diff --git a/bin/sstablelister.bat b/bin/sstablelister.bat new file mode 100644 index 0000000000..cb50a0862a --- /dev/null +++ b/bin/sstablelister.bat @@ -0,0 +1,41 @@ +@REM +@REM Licensed to the Apache Software Foundation (ASF) under one or more +@REM contributor license agreements. See the NOTICE file distributed with +@REM this work for additional information regarding copyright ownership. +@REM The ASF licenses this file to You under the Apache License, Version 2.0 +@REM (the "License"); you may not use this file except in compliance with +@REM the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, software +@REM distributed under the License is distributed on an "AS IS" BASIS, +@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@REM See the License for the specific language governing permissions and +@REM limitations under the License. + +@echo off +if "%OS%" == "Windows_NT" setlocal + +pushd "%~dp0" +call cassandra.in.bat + +if NOT DEFINED CASSANDRA_MAIN set CASSANDRA_MAIN=org.apache.cassandra.tools.StandaloneLister +if NOT DEFINED JAVA_HOME goto :err + +REM ***** JAVA options ***** +set JAVA_OPTS=^ + -Dlogback.configurationFile=logback-tools.xml + +set TOOLS_PARAMS= + +"%JAVA_HOME%\bin\java" %JAVA_OPTS% %CASSANDRA_PARAMS% -cp %CASSANDRA_CLASSPATH% "%CASSANDRA_MAIN%" %* +goto finally + +:err +echo JAVA_HOME environment variable must be set! +pause + +:finally + +ENDLOCAL diff --git a/build.xml b/build.xml index 5a82d64a85..e6581ea89f 100644 --- a/build.xml +++ b/build.xml @@ -1214,7 +1214,7 @@ - + @@ -1882,7 +1882,7 @@