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]

Reply via email to