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 <ekaterina.dimitr...@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-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org