diff --git a/CHANGES.txt b/CHANGES.txt index ad36843a65..ed165e202d 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -20,6 +20,7 @@ * cqlsh: Fix handling of $$-escaped strings (CASSANDRA-12189) * Fix SSL JMX requiring truststore containing server cert (CASSANDRA-12109) Merged from 3.0: + * Add option to override compaction space check (CASSANDRA-12180) * Faster startup by only scanning each directory for temporary files once (CASSANDRA-12114) * Respond with v1/v2 protocol header when responding to driver that attempts to connect with too low of a protocol version (CASSANDRA-11464) @@ -31,6 +32,7 @@ Merged from 2.2: Merged from 2.1: * cannot use cql since upgrading python to 2.7.11+ (CASSANDRA-11850) + 3.8 * Fix hdr logging for single operation workloads (CASSANDRA-12145) * Fix SASI PREFIX search in CONTAINS mode with partial terms (CASSANDRA-12073) diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java index 88b5db060d..a4b42b730c 100644 --- a/src/java/org/apache/cassandra/config/Config.java +++ b/src/java/org/apache/cassandra/config/Config.java @@ -175,6 +175,7 @@ public class Config public Integer concurrent_compactors; public volatile Integer compaction_throughput_mb_per_sec = 16; public volatile Integer compaction_large_partition_warning_threshold_mb = 100; + public Integer min_free_space_per_drive_in_mb = 50; public Integer max_streaming_retries = 3; diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index 4f188bb36e..caf392522f 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -1381,6 +1381,11 @@ public class DatabaseDescriptor public static int getCompactionLargePartitionWarningThreshold() { return conf.compaction_large_partition_warning_threshold_mb * 1024 * 1024; } + public static long getMinFreeSpacePerDriveInBytes() + { + return conf.min_free_space_per_drive_in_mb * 1024L * 1024L; + } + public static boolean getDisableSTCSInL0() { return Boolean.getBoolean("cassandra.disable_stcs_in_l0"); diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index a71b7520fc..9ede0557f3 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -248,6 +248,8 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean public volatile long sampleLatencyNanos; private final ScheduledFuture latencyCalculator; + private volatile boolean compactionSpaceCheck = true; + public static void shutdownPostFlushExecutor() throws InterruptedException { postFlushExecutor.shutdown(); @@ -1727,6 +1729,16 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean samplerResults.cardinality, result}); } + public boolean isCompactionDiskSpaceCheckEnabled() + { + return compactionSpaceCheck; + } + + public void compactionDiskSpaceCheck(boolean enable) + { + compactionSpaceCheck = enable; + } + public void cleanupCache() { Collection> ranges = StorageService.instance.getLocalRanges(keyspace.getName()); diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java b/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java index 63215b43b2..4df9f8d3b7 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java @@ -169,4 +169,14 @@ public interface ColumnFamilyStoreMBean * @return top count items for the sampler since beginLocalSampling was called */ public CompositeData finishLocalSampling(String sampler, int count) throws OpenDataException; + + /* + Is Compaction space check enabled + */ + public boolean isCompactionDiskSpaceCheckEnabled(); + + /* + Enable/Disable compaction space check + */ + public void compactionDiskSpaceCheck(boolean enable); } diff --git a/src/java/org/apache/cassandra/db/Directories.java b/src/java/org/apache/cassandra/db/Directories.java index a83c8453d6..6f7eebd3a5 100644 --- a/src/java/org/apache/cassandra/db/Directories.java +++ b/src/java/org/apache/cassandra/db/Directories.java @@ -545,7 +545,8 @@ public class Directories public long getAvailableSpace() { - return location.getUsableSpace(); + long availableSpace = location.getUsableSpace() - DatabaseDescriptor.getMinFreeSpacePerDriveInBytes(); + return availableSpace > 0 ? availableSpace : 0; } @Override diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java index cb6faab8f1..86c8a8f630 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java @@ -297,6 +297,12 @@ public class CompactionTask extends AbstractCompactionTask protected void checkAvailableDiskSpace(long estimatedSSTables, long expectedWriteSize) { + if(!cfs.isCompactionDiskSpaceCheckEnabled() && compactionType == OperationType.COMPACTION) + { + logger.info("Compaction space check is disabled"); + return; + } + while (!getDirectories().hasAvailableDiskSpace(estimatedSSTables, expectedWriteSize)) { if (!reduceScopeForLimitedSpace())