You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ed...@apache.org on 2022/02/06 03:44:26 UTC

[cassandra] 13/13: Remove old Duration class in favor of DurationSpec class patch by Ekaterina Dimitrova; reviewed by Caleb Rackliffe, David Capwell, Michael Semb Wever and Benjamin Lerer for CASSANDRA-15234

This is an automated email from the ASF dual-hosted git repository.

edimitrova pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git

commit 9f56bf4ca7fdb61ad09e5f2ad09b87cd01e0716b
Author: Ekaterina Dimitrova <ek...@datastax.com>
AuthorDate: Sat Feb 5 17:51:32 2022 -0500

    Remove old Duration class in favor of DurationSpec class
    patch by Ekaterina Dimitrova; reviewed by Caleb Rackliffe, David Capwell, Michael Semb Wever and Benjamin Lerer for CASSANDRA-15234
---
 conf/cassandra.yaml                                |  20 +-
 src/java/org/apache/cassandra/config/Duration.java | 276 ---------------------
 .../org/apache/cassandra/db/ColumnFamilyStore.java |   9 +-
 src/java/org/apache/cassandra/db/Keyspace.java     |   4 +-
 .../apache/cassandra/service/StorageService.java   |   8 +-
 .../service/snapshot/SnapshotManifest.java         |   4 +-
 .../apache/cassandra/tools/nodetool/Snapshot.java  |   4 +-
 .../org/apache/cassandra/config/DurationTest.java  |  60 -----
 .../org/apache/cassandra/db/DirectoriesTest.java   |   7 +-
 .../service/snapshot/SnapshotManifestTest.java     |   4 +-
 10 files changed, 30 insertions(+), 366 deletions(-)

diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml
index 7e39097..71fb562 100644
--- a/conf/cassandra.yaml
+++ b/conf/cassandra.yaml
@@ -441,7 +441,7 @@ counter_cache_save_period: 7200s
 # saved_caches_directory: /var/lib/cassandra/saved_caches
 
 # Number of seconds the server will wait for each cache (row, key, etc ...) to load while starting
-# the Cassandra process. Setting this to a negative value is equivalent to disabling all cache loading on startup
+# the Cassandra process. Setting this to zero is equivalent to disabling all cache loading on startup
 # while still having the cache during runtime.
 # cache_load_timeout: 30s
 
@@ -1467,15 +1467,15 @@ audit_logging_options:
 
 # default options for full query logging - these can be overridden from command line when executing
 # nodetool enablefullquerylog
-#full_query_logging_options:
-    # log_dir:
-    # roll_cycle: HOURLY
-    # block: true
-    # max_queue_weight: 268435456 # 256 MiB
-    # max_log_size: 17179869184 # 16 GiB
-    ## archive command is "/path/to/script.sh %path" where %path is replaced with the file being rolled:
-    # archive_command:
-    # max_archive_retries: 10
+# full_query_logging_options:
+  # log_dir:
+  # roll_cycle: HOURLY
+  # block: true
+  # max_queue_weight: 268435456 # 256 MiB
+  # max_log_size: 17179869184 # 16 GiB
+  ## archive command is "/path/to/script.sh %path" where %path is replaced with the file being rolled:
+  # archive_command:
+  # max_archive_retries: 10
 
 # validate tombstones on reads and compaction
 # can be either "disabled", "warn" or "exception"
diff --git a/src/java/org/apache/cassandra/config/Duration.java b/src/java/org/apache/cassandra/config/Duration.java
deleted file mode 100644
index 89de354..0000000
--- a/src/java/org/apache/cassandra/config/Duration.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * 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.
- */
-package org.apache.cassandra.config;
-
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
-import com.google.common.primitives.Ints;
-
-/**
- * Represents a positive time duration.
- */
-public final class Duration
-{
-    /**
-     * The Regexp used to parse the duration provided as String.
-     */
-    private static final Pattern TIME_UNITS_PATTERN = Pattern.compile(("^(\\d+)([a-zA-Z]{1,2}|µs|µS)$"));
-    private static final Pattern DOUBLE_TIME_UNITS_PATTERN = Pattern.compile(("^(\\d+\\.\\d+)([a-zA-Z]{1,2}|µs|µS)$"));
-    
-    private final long quantity;
-
-    private final TimeUnit unit;
-
-
-    public Duration(String value)
-    {
-        if (value == null || value.equals("null"))
-        {
-            quantity = 0;
-            unit = TimeUnit.MILLISECONDS;
-            return;
-        }
-
-        //parse the string field value
-        Matcher matcher = TIME_UNITS_PATTERN.matcher(value);
-        Matcher matcherDouble = DOUBLE_TIME_UNITS_PATTERN.matcher(value);
-
-        if(matcher.find())
-        {
-            quantity = Long.parseLong(matcher.group(1));
-            unit = fromSymbol(matcher.group(2));
-        }
-        else if(matcherDouble.find())
-        {
-            quantity =(long) Double.parseDouble(matcherDouble.group(1));
-            unit = fromSymbol(matcherDouble.group(2));
-        }
-        else {
-            throw new IllegalArgumentException("Invalid duration: " + value);
-        }
-    }
-
-    private Duration(long quantity, TimeUnit unit)
-    {
-        if (quantity < 0)
-            throw new IllegalArgumentException("Duration must be positive");
-
-        this.quantity = quantity;
-        this.unit = unit;
-    }
-
-    private Duration(double quantity, TimeUnit unit)
-    {
-        if (quantity < 0)
-            throw new IllegalArgumentException("Duration must be positive");
-
-        this.quantity = (long) quantity;
-        this.unit = unit;
-    }
-
-    /**
-     * Creates a {@code Duration} of the specified amount of milliseconds.
-     *
-     * @param milliseconds the amount of milliseconds
-     * @return a duration
-     */
-    public static Duration inMilliseconds(long milliseconds)
-    {
-        return new Duration(milliseconds, TimeUnit.MILLISECONDS);
-    }
-
-    public static Duration inDoubleMilliseconds(double milliseconds)
-    {
-        return new Duration(milliseconds, TimeUnit.MILLISECONDS);
-    }
-
-    /**
-     * Creates a {@code Duration} of the specified amount of seconds.
-     *
-     * @param seconds the amount of seconds
-     * @return a duration
-     */
-    public static Duration inSeconds(long seconds)
-    {
-        return new Duration(seconds, TimeUnit.SECONDS);
-    }
-
-    /**
-     * Creates a {@code Duration} of the specified amount of minutes.
-     *
-     * @param minutes the amount of minutes
-     * @return a duration
-     */
-    public static Duration inMinutes(long minutes)
-    {
-        return new Duration(minutes, TimeUnit.MINUTES);
-    }
-
-    /**
-     * Returns the time unit associated to the specified symbol
-     *
-     * @param symbol the time unit symbol
-     * @return the time unit associated to the specified symbol
-     */
-    private TimeUnit fromSymbol(String symbol)
-    {
-        switch (symbol.toLowerCase())
-        {
-            case "d": return TimeUnit.DAYS;
-            case "h": return TimeUnit.HOURS;
-            case "m": return TimeUnit.MINUTES;
-            case "s": return TimeUnit.SECONDS;
-            case "ms": return TimeUnit.MILLISECONDS;
-            case "us":
-            case "µs": return TimeUnit.MICROSECONDS;
-            case "ns": return TimeUnit.NANOSECONDS;
-        }
-        throw new IllegalArgumentException(String.format("Unsupported time unit: %s. Supported units are: %s",
-                                                         symbol, Arrays.stream(TimeUnit.values())
-                                                                       .map(Duration::getSymbol)
-                                                                       .collect(Collectors.joining(", "))));
-    }
-
-    /**
-     * Returns this duration in the specified time unit
-     *
-     * @param targetUnit the time unit
-     * @return this duration in the specified time unit
-     */
-    public long to(TimeUnit targetUnit)
-    {
-        return targetUnit.convert(quantity, unit);
-    }
-
-    /**
-     * Returns this duration in number of minutes
-     *
-     * @return this duration in number of minutes
-     */
-    public long toMinutes()
-    {
-        return unit.toMinutes(quantity);
-    }
-
-    /**
-     * Returns this duration in number of minutes as an {@code int}
-     *
-     * @return this duration in number of minutes or {@code Integer.MAX_VALUE} if the number of minutes is too large.
-     */
-    public int toMinutesAsInt()
-    {
-        return Ints.saturatedCast(toMinutes());
-    }
-
-    /**
-     * Returns this duration in number of seconds
-     *
-     * @return this duration in number of seconds
-     */
-    public long toSeconds()
-    {
-        return unit.toSeconds(quantity);
-    }
-
-    /**
-     * Returns this duration in number of seconds as an {@code int}
-     *
-     * @return this duration in number of seconds or {@code Integer.MAX_VALUE} if the number of seconds is too large.
-     */
-    public int toSecondsAsInt()
-    {
-        return Ints.saturatedCast(toSeconds());
-    }
-
-    /**
-     * Returns this duration in number of milliseconds
-     *
-     * @return this duration in number of milliseconds
-     */
-    public long toMilliseconds()
-    {
-        return unit.toMillis(quantity);
-    }
-
-    /**
-     * Returns this duration in number of milliseconds as an {@code int}
-     *
-     * @return this duration in number of milliseconds or {@code Integer.MAX_VALUE} if the number of milliseconds is too large.
-     */
-    public int toMillisecondsAsInt()
-    {
-        return Ints.saturatedCast(toMilliseconds());
-    }
-
-    @Override
-    public int hashCode()
-    {
-        // Milliseconds seems to be a reasonable tradeoff
-        return Objects.hash(unit.toMillis(quantity));
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-        if (this == obj)
-            return true;
-
-        if (!(obj instanceof Duration))
-            return false;
-
-        Duration other = (Duration) obj;
-        if (unit == other.unit)
-            return quantity == other.quantity;
-
-        // Due to overflows we can only guarantee that the 2 durations are equal if we get the same results
-        // doing the convertion in both directions.
-        return unit.convert(other.quantity, other.unit) == quantity && other.unit.convert(quantity, unit) == other.quantity;
-    }
-
-    @Override
-    public String toString()
-    {
-        return quantity + getSymbol(unit);
-    }
-
-    /**
-     * Returns the symbol associated to the specified unit
-     *
-     * @param unit the time unit
-     * @return the time unit symbol
-     */
-    private static String getSymbol(TimeUnit unit)
-    {
-        switch (unit)
-        {
-            case DAYS: return "d";
-            case HOURS: return "h";
-            case MINUTES: return "m";
-            case SECONDS: return "s";
-            case MILLISECONDS: return "ms";
-            case MICROSECONDS: return "us";
-            case NANOSECONDS: return "ns";
-        }
-        throw new AssertionError();
-    }
-}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index ce16ab6..aa2b165 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -52,7 +52,6 @@ import org.apache.cassandra.utils.concurrent.Future;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.Duration;
 import org.apache.cassandra.cache.*;
 import org.apache.cassandra.concurrent.*;
 import org.apache.cassandra.config.*;
@@ -1870,7 +1869,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
     /**
      * @param ephemeral If this flag is set to true, the snapshot will be cleaned during next startup
      */
-    public TableSnapshot snapshotWithoutFlush(String snapshotName, Predicate<SSTableReader> predicate, boolean ephemeral, Duration ttl, RateLimiter rateLimiter, Instant creationTime)
+    public TableSnapshot snapshotWithoutFlush(String snapshotName, Predicate<SSTableReader> predicate, boolean ephemeral, DurationSpec ttl, RateLimiter rateLimiter, Instant creationTime)
     {
         if (ephemeral && ttl != null)
         {
@@ -1900,7 +1899,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         return createSnapshot(snapshotName, ephemeral, ttl, snapshottedSSTables, creationTime);
     }
 
-    protected TableSnapshot createSnapshot(String tag, boolean ephemeral, Duration ttl, Set<SSTableReader> sstables, Instant creationTime) {
+    protected TableSnapshot createSnapshot(String tag, boolean ephemeral, DurationSpec ttl, Set<SSTableReader> sstables, Instant creationTime) {
         Set<File> snapshotDirs = sstables.stream()
                                          .map(s -> Directories.getSnapshotDirectory(s.descriptor, tag).toAbsolute())
                                          .filter(dir -> !Directories.isSecondaryIndexFolder(dir)) // Remove secondary index subdirectory
@@ -2064,7 +2063,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
      * @param rateLimiter Rate limiter for hardlinks-per-second
      * @param creationTime time when this snapshot was taken
      */
-    public TableSnapshot snapshot(String snapshotName, boolean skipFlush, Duration ttl, RateLimiter rateLimiter, Instant creationTime)
+    public TableSnapshot snapshot(String snapshotName, boolean skipFlush, DurationSpec ttl, RateLimiter rateLimiter, Instant creationTime)
     {
         return snapshot(snapshotName, null, false, skipFlush, ttl, rateLimiter, creationTime);
     }
@@ -2086,7 +2085,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
      * @param rateLimiter Rate limiter for hardlinks-per-second
      * @param creationTime time when this snapshot was taken
      */
-    public TableSnapshot snapshot(String snapshotName, Predicate<SSTableReader> predicate, boolean ephemeral, boolean skipFlush, Duration ttl, RateLimiter rateLimiter, Instant creationTime)
+    public TableSnapshot snapshot(String snapshotName, Predicate<SSTableReader> predicate, boolean ephemeral, boolean skipFlush, DurationSpec ttl, RateLimiter rateLimiter, Instant creationTime)
     {
         if (!skipFlush)
         {
diff --git a/src/java/org/apache/cassandra/db/Keyspace.java b/src/java/org/apache/cassandra/db/Keyspace.java
index 459f926..606e7e8 100644
--- a/src/java/org/apache/cassandra/db/Keyspace.java
+++ b/src/java/org/apache/cassandra/db/Keyspace.java
@@ -39,9 +39,9 @@ import com.google.common.util.concurrent.RateLimiter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.Duration;
 import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.DurationSpec;
 import org.apache.cassandra.db.lifecycle.SSTableSet;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.db.repair.CassandraKeyspaceRepairManager;
@@ -214,7 +214,7 @@ public class Keyspace
      * @param rateLimiter Rate limiter for hardlinks-per-second
      * @throws IOException if the column family doesn't exist
      */
-    public void snapshot(String snapshotName, String columnFamilyName, boolean skipFlush, Duration ttl, RateLimiter rateLimiter, Instant creationTime) throws IOException
+    public void snapshot(String snapshotName, String columnFamilyName, boolean skipFlush, DurationSpec ttl, RateLimiter rateLimiter, Instant creationTime) throws IOException
     {
         assert snapshotName != null;
         boolean tookSnapShot = false;
diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java
index 3f956dd..e5ca6c8 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -72,8 +72,8 @@ import org.apache.cassandra.batchlog.BatchlogManager;
 import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.config.Duration;
 import org.apache.cassandra.concurrent.*;
+import org.apache.cassandra.config.DurationSpec;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.commitlog.CommitLog;
@@ -3847,7 +3847,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
     @Override
     public void takeSnapshot(String tag, Map<String, String> options, String... entities) throws IOException
     {
-        Duration ttl = options.containsKey("ttl") ? new Duration(options.get("ttl")) : null;
+        DurationSpec ttl = options.containsKey("ttl") ? new DurationSpec(options.get("ttl")) : null;
         if (ttl != null)
         {
             int minAllowedTtlSecs = CassandraRelevantProperties.SNAPSHOT_MIN_ALLOWED_TTL_SECONDS.getInt();
@@ -3925,7 +3925,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
      * @param skipFlush Skip blocking flush of memtable
      * @param keyspaceNames the names of the keyspaces to snapshot; empty means "all."
      */
-    private void takeSnapshot(String tag, boolean skipFlush, Duration ttl, String... keyspaceNames) throws IOException
+    private void takeSnapshot(String tag, boolean skipFlush, DurationSpec ttl, String... keyspaceNames) throws IOException
     {
         if (operationMode == Mode.JOINING)
             throw new IOException("Cannot snapshot until bootstrap completes");
@@ -3971,7 +3971,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
      * @param tableList
      *            list of tables from different keyspace in the form of ks1.cf1 ks2.cf2
      */
-    private void takeMultipleTableSnapshot(String tag, boolean skipFlush, Duration ttl, String... tableList)
+    private void takeMultipleTableSnapshot(String tag, boolean skipFlush, DurationSpec ttl, String... tableList)
             throws IOException
     {
         Map<Keyspace, List<String>> keyspaceColumnfamily = new HashMap<Keyspace, List<String>>();
diff --git a/src/java/org/apache/cassandra/service/snapshot/SnapshotManifest.java b/src/java/org/apache/cassandra/service/snapshot/SnapshotManifest.java
index e1bd4df..0a301fa 100644
--- a/src/java/org/apache/cassandra/service/snapshot/SnapshotManifest.java
+++ b/src/java/org/apache/cassandra/service/snapshot/SnapshotManifest.java
@@ -26,9 +26,9 @@ import java.util.Objects;
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.cassandra.config.Duration;
 import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import com.fasterxml.jackson.databind.DeserializationFeature;
+import org.apache.cassandra.config.DurationSpec;
 import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileInputStreamPlus;
 import org.apache.cassandra.io.util.FileOutputStreamPlus;
@@ -64,7 +64,7 @@ public class SnapshotManifest
         this.expiresAt = null;
     }
 
-    public SnapshotManifest(List<String> files, Duration ttl, Instant creationTime)
+    public SnapshotManifest(List<String> files, DurationSpec ttl, Instant creationTime)
     {
         this.files = files;
         this.createdAt = creationTime;
diff --git a/src/java/org/apache/cassandra/tools/nodetool/Snapshot.java b/src/java/org/apache/cassandra/tools/nodetool/Snapshot.java
index ef308f7..1d899d3 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/Snapshot.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/Snapshot.java
@@ -31,9 +31,9 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.cassandra.config.DurationSpec;
 import org.apache.cassandra.tools.NodeProbe;
 import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
-import org.apache.cassandra.config.Duration;
 
 @Command(name = "snapshot", description = "Take a snapshot of specified keyspaces or a snapshot of the specified table")
 public class Snapshot extends NodeToolCmd
@@ -69,7 +69,7 @@ public class Snapshot extends NodeToolCmd
             Map<String, String> options = new HashMap<String,String>();
             options.put("skipFlush", Boolean.toString(skipFlush));
             if (null != ttl) {
-                Duration d = new Duration(ttl);
+                DurationSpec d = new DurationSpec(ttl);
                 options.put("ttl", d.toString());
             }
 
diff --git a/test/unit/org/apache/cassandra/config/DurationTest.java b/test/unit/org/apache/cassandra/config/DurationTest.java
deleted file mode 100644
index c89792f..0000000
--- a/test/unit/org/apache/cassandra/config/DurationTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.
- */
-package org.apache.cassandra.config;
-
-import org.junit.Test;
-
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.junit.Assert.*;
-
-public class DurationTest
-{
-    @Test
-    public void testConversions()
-    {
-        assertEquals(10, new Duration("10s").toSeconds());
-        assertEquals(10000, new Duration("10s").toMilliseconds());
-        assertEquals(0, new Duration("10s").toMinutes());
-        assertEquals(10, new Duration("10m").toMinutes());
-        assertEquals(600000, new Duration("10m").toMilliseconds());
-        assertEquals(600, new Duration("10m").toSeconds());
-    }
-
-    @Test
-    public void testInvalidInputs()
-    {
-        assertThatThrownBy(() -> new Duration("10")).isInstanceOf(IllegalArgumentException.class)
-                                                    .hasMessageContaining("Invalid duration: 10");
-        assertThatThrownBy(() -> new Duration("-10s")).isInstanceOf(IllegalArgumentException.class)
-                                                      .hasMessageContaining("Invalid duration: -10s");
-        assertThatThrownBy(() -> new Duration("10xd")).isInstanceOf(IllegalArgumentException.class)
-                                                      .hasMessageContaining("Unsupported time unit: xd. Supported units are: ns, us, ms, s, m, h, d");
-    }
-
-    @Test
-    public void testEquals()
-    {
-        assertEquals(new Duration("10s"), new Duration("10s"));
-        assertEquals(new Duration("10s"), new Duration("10000ms"));
-        assertEquals(new Duration("10000ms"), new Duration("10s"));
-        assertEquals(Duration.inMinutes(Long.MAX_VALUE), Duration.inMinutes(Long.MAX_VALUE));
-        assertNotEquals(Duration.inMinutes(Long.MAX_VALUE), Duration.inMilliseconds(Long.MAX_VALUE));
-        assertNotEquals(new Duration("0m"), new Duration("10ms"));
-    }
-
-}
diff --git a/test/unit/org/apache/cassandra/db/DirectoriesTest.java b/test/unit/org/apache/cassandra/db/DirectoriesTest.java
index 5988c04..d21c06c 100644
--- a/test/unit/org/apache/cassandra/db/DirectoriesTest.java
+++ b/test/unit/org/apache/cassandra/db/DirectoriesTest.java
@@ -27,6 +27,8 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 
 import com.google.common.collect.Sets;
+
+import org.apache.cassandra.config.DurationSpec;
 import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileOutputStreamPlus;
 import org.apache.commons.lang3.StringUtils;
@@ -36,7 +38,6 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import org.apache.cassandra.config.Duration;
 import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.schema.Indexes;
 import org.apache.cassandra.schema.SchemaConstants;
@@ -186,7 +187,7 @@ public class DirectoriesTest
         if (createManifest)
         {
             File manifestFile = Directories.getSnapshotManifestFile(snapshotDir);
-            manifest = new SnapshotManifest(Collections.singletonList(sstableDesc.filenameFor(Component.DATA)), new Duration("1m"), Instant.now());
+            manifest = new SnapshotManifest(Collections.singletonList(sstableDesc.filenameFor(Component.DATA)), new DurationSpec("1m"), Instant.now());
             manifest.serializeToJsonFile(manifestFile);
         }
 
@@ -311,7 +312,7 @@ public class DirectoriesTest
 
             File manifestFile = directories.getSnapshotManifestFile(tag);
 
-            SnapshotManifest manifest = new SnapshotManifest(files, new Duration("1m"), Instant.now());
+            SnapshotManifest manifest = new SnapshotManifest(files, new DurationSpec("1m"), Instant.now());
             manifest.serializeToJsonFile(manifestFile);
 
             Set<File> dirs = new HashSet<>();
diff --git a/test/unit/org/apache/cassandra/service/snapshot/SnapshotManifestTest.java b/test/unit/org/apache/cassandra/service/snapshot/SnapshotManifestTest.java
index 41cb1e7..4239d50 100644
--- a/test/unit/org/apache/cassandra/service/snapshot/SnapshotManifestTest.java
+++ b/test/unit/org/apache/cassandra/service/snapshot/SnapshotManifestTest.java
@@ -33,8 +33,8 @@ import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 import static org.assertj.core.api.Assertions.assertThatIOException;
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.apache.cassandra.config.Duration;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.cassandra.config.DurationSpec;
 import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileOutputStreamPlus;
 
@@ -108,7 +108,7 @@ public class SnapshotManifestTest
 
     @Test
     public void testSerializeAndDeserialize() throws Exception {
-        SnapshotManifest manifest = new SnapshotManifest(Arrays.asList("db1", "db2", "db3"), new Duration("2m"), Instant.ofEpochMilli(currentTimeMillis()));
+        SnapshotManifest manifest = new SnapshotManifest(Arrays.asList("db1", "db2", "db3"), new DurationSpec("2m"), Instant.ofEpochMilli(currentTimeMillis()));
         File manifestFile = new File(tempFolder.newFile("manifest.json"));
 
         manifest.serializeToJsonFile(manifestFile);

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org