This is an automated email from the ASF dual-hosted git repository.
adelapena pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/trunk by this push:
new 49cc352916 Make GuardrailDiskUsageTest deterministic
49cc352916 is described below
commit 49cc352916f8dad23533b5328638aeb05ac04ea1
Author: Andrés de la Peña <[email protected]>
AuthorDate: Sat Apr 23 13:52:06 2022 +0100
Make GuardrailDiskUsageTest deterministic
patch by Andrés de la Peña; reviewed by Ekaterina Dimitrova for
CASSANDRA-17576
---
.../org/apache/cassandra/config/GuardrailsOptions.java | 15 ++++-----------
.../cassandra/service/disk/usage/DiskUsageMonitor.java | 15 ++++++++++++++-
.../cassandra/db/guardrails/GuardrailDiskUsageTest.java | 15 ++++++++++++++-
3 files changed, 32 insertions(+), 13 deletions(-)
diff --git a/src/java/org/apache/cassandra/config/GuardrailsOptions.java
b/src/java/org/apache/cassandra/config/GuardrailsOptions.java
index b73cc195bf..160906353e 100644
--- a/src/java/org/apache/cassandra/config/GuardrailsOptions.java
+++ b/src/java/org/apache/cassandra/config/GuardrailsOptions.java
@@ -18,16 +18,13 @@
package org.apache.cassandra.config;
-import java.math.BigInteger;
import java.util.Collections;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Supplier;
-
import javax.annotation.Nullable;
import com.google.common.collect.Sets;
-import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -35,6 +32,7 @@ import
org.apache.cassandra.cql3.statements.schema.TableAttributes;
import org.apache.cassandra.db.ConsistencyLevel;
import org.apache.cassandra.db.guardrails.Guardrails;
import org.apache.cassandra.db.guardrails.GuardrailsConfig;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.service.disk.usage.DiskUsageMonitor;
import static java.lang.String.format;
@@ -700,16 +698,11 @@ public class GuardrailsOptions implements GuardrailsConfig
validateSize(maxDiskSize, false, "data_disk_usage_max_disk_size");
- BigInteger diskSize =
DiskUsageMonitor.dataDirectoriesGroupedByFileStore()
- .keys()
- .stream()
-
.map(DiskUsageMonitor::totalSpace)
- .map(BigInteger::valueOf)
- .reduce(BigInteger.ZERO,
BigInteger::add);
+ long diskSize = DiskUsageMonitor.totalDiskSpace();
- if (diskSize.compareTo(BigInteger.valueOf(maxDiskSize.toBytes())) < 0)
+ if (diskSize < maxDiskSize.toBytes())
throw new IllegalArgumentException(format("Invalid value for
data_disk_usage_max_disk_size: " +
"%s specified, but only
%s are actually available on disk",
- maxDiskSize,
DataStorageSpec.inBytes(diskSize.longValue())));
+ maxDiskSize,
FileUtils.stringifyFileSize(diskSize)));
}
}
diff --git
a/src/java/org/apache/cassandra/service/disk/usage/DiskUsageMonitor.java
b/src/java/org/apache/cassandra/service/disk/usage/DiskUsageMonitor.java
index 7395c5fb3b..d7ed650f91 100644
--- a/src/java/org/apache/cassandra/service/disk/usage/DiskUsageMonitor.java
+++ b/src/java/org/apache/cassandra/service/disk/usage/DiskUsageMonitor.java
@@ -186,7 +186,7 @@ public class DiskUsageMonitor
return DiskUsageState.SPACIOUS;
}
- public static Multimap<FileStore, Directories.DataDirectory>
dataDirectoriesGroupedByFileStore()
+ private static Multimap<FileStore, Directories.DataDirectory>
dataDirectoriesGroupedByFileStore()
{
Multimap<FileStore, Directories.DataDirectory> directories =
HashMultimap.create();
try
@@ -204,6 +204,19 @@ public class DiskUsageMonitor
return directories;
}
+ public static long totalDiskSpace()
+ {
+ BigInteger size = dataDirectoriesGroupedByFileStore().keys()
+ .stream()
+
.map(DiskUsageMonitor::totalSpace)
+
.map(BigInteger::valueOf)
+
.reduce(BigInteger.ZERO, BigInteger::add);
+
+ return size.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) >= 0
+ ? Long.MAX_VALUE
+ : size.longValue();
+ }
+
public static long totalSpace(FileStore store)
{
try
diff --git
a/test/unit/org/apache/cassandra/db/guardrails/GuardrailDiskUsageTest.java
b/test/unit/org/apache/cassandra/db/guardrails/GuardrailDiskUsageTest.java
index 14c2c3acea..10bf05bb8a 100644
--- a/test/unit/org/apache/cassandra/db/guardrails/GuardrailDiskUsageTest.java
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailDiskUsageTest.java
@@ -30,6 +30,7 @@ import com.google.common.collect.Multimap;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.apache.cassandra.config.DataStorageSpec;
import org.apache.cassandra.db.ConsistencyLevel;
@@ -37,6 +38,7 @@ import org.apache.cassandra.db.Directories;
import org.apache.cassandra.gms.ApplicationState;
import org.apache.cassandra.gms.Gossiper;
import org.apache.cassandra.gms.VersionedValue;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.locator.InetAddressAndPort;
import org.apache.cassandra.service.ClientState;
import org.apache.cassandra.service.StorageService;
@@ -44,6 +46,8 @@ import
org.apache.cassandra.service.disk.usage.DiskUsageBroadcaster;
import org.apache.cassandra.service.disk.usage.DiskUsageMonitor;
import org.apache.cassandra.service.disk.usage.DiskUsageState;
import org.apache.cassandra.utils.FBUtilities;
+import org.jboss.byteman.contrib.bmunit.BMRule;
+import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
import org.mockito.Mockito;
import static org.apache.cassandra.service.disk.usage.DiskUsageState.FULL;
@@ -65,6 +69,11 @@ import static org.mockito.Mockito.when;
/**
* Tests the guardrails for disk usage, {@link Guardrails#localDataDiskUsage}
and {@link Guardrails#replicaDiskUsage}.
*/
+@RunWith(BMUnitRunner.class)
+@BMRule(name = "Always returns a physical disk size of 1000TiB",
+targetClass = "DiskUsageMonitor",
+targetMethod = "totalDiskSpace",
+action = "return " + (1000L * 1024 * 1024 * 1024 * 1024) + "L;") // 1000TiB
public class GuardrailDiskUsageTest extends GuardrailTester
{
private static int defaultDataDiskUsagePercentageWarnThreshold;
@@ -109,7 +118,11 @@ public class GuardrailDiskUsageTest extends GuardrailTester
assertConfigValid(x -> x.setDataDiskUsageMaxDiskSize("40GiB"));
assertEquals("40GiB", guardrails().getDataDiskUsageMaxDiskSize());
- assertConfigFails(x -> x.setDataDiskUsageMaxDiskSize(Long.MAX_VALUE +
"GiB"), "are actually available on disk");
+ long diskSize = DiskUsageMonitor.totalDiskSpace();
+ String message = String.format("only %s are actually available on
disk", FileUtils.stringifyFileSize(diskSize));
+ assertConfigValid(x -> x.setDataDiskUsageMaxDiskSize(diskSize + "B"));
+ assertConfigFails(x -> x.setDataDiskUsageMaxDiskSize(diskSize + 1 +
"B"), message);
+ assertConfigFails(x -> x.setDataDiskUsageMaxDiskSize(Long.MAX_VALUE +
"GiB"), message);
// warn threshold smaller than lower bound
assertConfigFails(x -> x.setDataDiskUsagePercentageThreshold(0, 80),
"0 is not allowed");
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]