From 0bb133e39d95486a897ff375f081cc814f78181b Mon Sep 17 00:00:00 2001 From: Carl Yeksigian Date: Tue, 26 Jul 2016 08:49:56 -0400 Subject: [PATCH] Add option to override compaction space check Patch by Sankalp Kohli; reviewed by Carl Yeksigian for CASSANDRA-12180 --- CHANGES.txt | 1 + src/java/org/apache/cassandra/config/Config.java | 1 + .../apache/cassandra/config/DatabaseDescriptor.java | 5 +++++ .../org/apache/cassandra/db/ColumnFamilyStore.java | 12 ++++++++++++ .../apache/cassandra/db/ColumnFamilyStoreMBean.java | 10 ++++++++++ src/java/org/apache/cassandra/db/Directories.java | 3 ++- .../cassandra/db/compaction/CompactionTask.java | 6 ++++++ 7 files changed, 37 insertions(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index e9f41fb2ba..342382e50b 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.9 + * 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) diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java index 2bd23b549e..e6c56cb515 100644 --- a/src/java/org/apache/cassandra/config/Config.java +++ b/src/java/org/apache/cassandra/config/Config.java @@ -171,6 +171,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 b71ebf6038..f0ec5d0669 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -1209,6 +1209,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 f34a2d5b27..1e52b13b22 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -222,6 +222,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(); @@ -1597,6 +1599,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 c900442a1c..a74316eff1 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java @@ -161,4 +161,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 f7bb390827..01ffd52f0d 100644 --- a/src/java/org/apache/cassandra/db/Directories.java +++ b/src/java/org/apache/cassandra/db/Directories.java @@ -516,7 +516,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 be81c807a7..9a7aa98359 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java @@ -268,6 +268,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())