This is an automated email from the ASF dual-hosted git repository. jlewandowski pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit 5321f88c40cc9ad280a7fb7472194b93e93334c0 Merge: f76f328622 f0ea12c6d7 Author: Jacek Lewandowski <[email protected]> AuthorDate: Thu Dec 21 16:42:32 2023 +0100 Merge branch 'cassandra-5.0' into trunk * cassandra-5.0: Add a startup check to fail startup when using invalid configuration with certain Kernel and FS type .build/cassandra-deps-template.xml | 4 + .build/parent-pom-template.xml | 5 + CHANGES.txt | 1 + .../config/CassandraRelevantProperties.java | 4 +- src/java/org/apache/cassandra/config/Config.java | 7 +- .../apache/cassandra/io/util/DataOutputBuffer.java | 15 +++ .../apache/cassandra/service/StartupChecks.java | 64 ++++++++- .../org/apache/cassandra/utils/FBUtilities.java | 124 ++++++++++++++++- .../cassandra/service/StartupChecksTest.java | 147 ++++++++++++++++++++- .../apache/cassandra/utils/FBUtilitiesTest.java | 49 +++++-- 10 files changed, 401 insertions(+), 19 deletions(-) diff --cc CHANGES.txt index 08a630ca18,d90ee5de25..8956d8fabf --- a/CHANGES.txt +++ b/CHANGES.txt @@@ -1,11 -1,5 +1,12 @@@ -5.0-beta2 +5.1 + * Make nodetool tablestats use number of significant digits for time and average values consistently (CASSANDRA-19015) + * Upgrade jackson to 2.15.3 and snakeyaml to 2.1 (CASSANDRA-18875) + * Transactional Cluster Metadata [CEP-21] (CASSANDRA-18330) + * Add ELAPSED command to cqlsh (CASSANDRA-18861) + * Add the ability to disable bulk loading of SSTables (CASSANDRA-18781) + * Clean up obsolete functions and simplify cql_version handling in cqlsh (CASSANDRA-18787) +Merged from 5.0: + * Add a startup check to fail startup when using invalid configuration with certain Kernel and FS type (CASSANDRA-19196) * UCS min_sstable_size should not be lower than target_sstable_size lower bound (CASSANDRA-19112) * Fix the correspondingMessagingVersion of SSTable format and improve TTL overflow tests coverage (CASSANDRA-19197) * Fix resource cleanup after SAI query timeouts (CASSANDRA-19177) diff --cc src/java/org/apache/cassandra/config/CassandraRelevantProperties.java index b28bf2c4f6,16a24fd2f0..db18c45eb8 --- a/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java +++ b/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java @@@ -616,10 -592,8 +619,9 @@@ public enum CassandraRelevantPropertie USE_NIX_RECURSIVE_DELETE("cassandra.use_nix_recursive_delete"), /** Gossiper compute expiration timeout. Default value 3 days. */ VERY_LONG_TIME_MS("cassandra.very_long_time_ms", "259200000"), - WAIT_FOR_TRACING_EVENTS_TIMEOUT_SECS("cassandra.wait_for_tracing_events_timeout_secs", "0"); + WAIT_FOR_TRACING_EVENTS_TIMEOUT_SECS("cassandra.wait_for_tracing_events_timeout_secs", "0"), + ; - static { CassandraRelevantProperties[] values = CassandraRelevantProperties.values(); diff --cc test/unit/org/apache/cassandra/service/StartupChecksTest.java index 6a26899beb,6fb063987a..6916f35424 --- a/test/unit/org/apache/cassandra/service/StartupChecksTest.java +++ b/test/unit/org/apache/cassandra/service/StartupChecksTest.java @@@ -21,20 -23,39 +23,40 @@@ import java.nio.file.FileSystem import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; + import java.nio.file.spi.FileSystemProvider; import java.time.Instant; import java.util.List; - - import org.apache.cassandra.config.StartupChecksOptions; - import org.apache.cassandra.io.util.File; - import org.junit.*; - + import java.util.Map; + import java.util.Set; + import java.util.concurrent.Callable; + import java.util.stream.Collectors; + + import org.junit.After; + import org.junit.AfterClass; + import org.junit.Assert; + import org.junit.Assume; + import org.junit.Before; + import org.junit.BeforeClass; + import org.junit.Test; + + import com.vdurmont.semver4j.Semver; import org.apache.cassandra.SchemaLoader; ++import org.apache.cassandra.config.CassandraRelevantProperties; + import org.apache.cassandra.config.Config.DiskAccessMode; import org.apache.cassandra.config.DatabaseDescriptor; - import org.apache.cassandra.schema.SchemaConstants; - import org.apache.cassandra.db.*; + import org.apache.cassandra.config.StartupChecksOptions; + import org.apache.cassandra.db.ColumnFamilyStore; + import org.apache.cassandra.db.Directories; + import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.exceptions.StartupException; + import org.apache.cassandra.io.filesystem.ForwardingFileSystem; + import org.apache.cassandra.io.filesystem.ForwardingFileSystemProvider; + import org.apache.cassandra.io.filesystem.ForwardingPath; + import org.apache.cassandra.io.util.File; + import org.apache.cassandra.schema.SchemaConstants; import org.apache.cassandra.service.DataResurrectionCheck.Heartbeat; import org.apache.cassandra.utils.Clock; + import org.apache.cassandra.utils.FBUtilities; import static java.util.Collections.singletonList; import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_INVALID_LEGACY_SSTABLE_ROOT; @@@ -47,6 -72,6 +73,15 @@@ import static org.mockito.Mockito.when public class StartupChecksTest { ++ static ++ { ++ // This test was failing because in the middle of file deletions in @Before hook, it happened that some ++ // thread modified system.local table. Each change to system.local is immediately flushed to disk. Creation ++ // of those new files when the directory was being deleted caused the test to fail occasionally. ++ // The property below disables flushing system.local after each change. ++ CassandraRelevantProperties.UNSAFE_SYSTEM.setBoolean(true); ++ } ++ StartupChecks startupChecks; Path sstableDir; static File heartbeatFile; diff --cc test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java index dc89c3ed95,7b2bd88afd..28059f5784 --- a/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java +++ b/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java @@@ -364,38 -374,26 +374,61 @@@ public class FBUtilitiesTes } } + @Test + public void testPrettyPrintLatency() + { + Assert.assertEquals("5000.000 ms", FBUtilities.prettyPrintLatency(5000)); + Assert.assertEquals("100.000 ms", FBUtilities.prettyPrintLatency(100)); + Assert.assertEquals("0.050 ms", FBUtilities.prettyPrintLatency(0.05)); + Assert.assertEquals("0.001 ms", FBUtilities.prettyPrintLatency(0.0005)); + Assert.assertEquals("0.000 ms", FBUtilities.prettyPrintLatency(0.0004)); + Assert.assertEquals("NaN ms", FBUtilities.prettyPrintLatency(Double.NaN)); + Assert.assertEquals("Infinity ms", FBUtilities.prettyPrintLatency(Double.POSITIVE_INFINITY)); + } + + @Test + public void testPrettyPrintRatio() + { + Assert.assertEquals("10.000", FBUtilities.prettyPrintRatio(10)); + Assert.assertEquals("1.000", FBUtilities.prettyPrintRatio(1)); + Assert.assertEquals("0.050", FBUtilities.prettyPrintRatio(0.05)); + Assert.assertEquals("0.001", FBUtilities.prettyPrintRatio(0.0005)); + Assert.assertEquals("0.000", FBUtilities.prettyPrintRatio(0.0004)); + Assert.assertEquals("NaN", FBUtilities.prettyPrintRatio(Double.NaN)); + Assert.assertEquals("Infinity", FBUtilities.prettyPrintRatio(Double.POSITIVE_INFINITY)); + } + + @Test + public void testPrettyPrintAverage() + { + Assert.assertEquals("100500.00", FBUtilities.prettyPrintAverage(100500)); + Assert.assertEquals("1.50", FBUtilities.prettyPrintAverage(1.5)); + Assert.assertEquals("0.05", FBUtilities.prettyPrintAverage(0.05)); + Assert.assertEquals("0.00", FBUtilities.prettyPrintAverage(0.00)); + Assert.assertEquals("NaN", FBUtilities.prettyPrintAverage(Double.NaN)); + Assert.assertEquals("Infinity", FBUtilities.prettyPrintAverage(Double.POSITIVE_INFINITY)); + } ++ + @Test + public void testParseKernelVersion() + { + assertThat(parseKernelVersion("4.4.0-21-generic").toString()).isEqualTo("4.4.0-21-generic"); + assertThat(parseKernelVersion("4.4.0-pre21-generic").toString()).isEqualTo("4.4.0-pre21-generic"); + assertThat(parseKernelVersion("4.4-pre21-generic").toString()).isEqualTo("4.4-pre21-generic"); + assertThat(parseKernelVersion("4.4.0-21-generic\n").toString()).isEqualTo("4.4.0-21-generic"); + assertThat(parseKernelVersion("\n4.4.0-21-generic\n").toString()).isEqualTo("4.4.0-21-generic"); + assertThat(parseKernelVersion("\n 4.4.0-21-generic \n").toString()).isEqualTo("4.4.0-21-generic"); + + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> parseKernelVersion("\n \n")) + .withMessageContaining("no version found"); + } + + @Test + public void testGetKernelVersion() + { + Assume.assumeTrue(FBUtilities.isLinux); + Semver kernelVersion = FBUtilities.getKernelVersion(); + assertThat(kernelVersion).isGreaterThan(new Semver("0.0.0", Semver.SemverType.LOOSE)); + assertThat(kernelVersion).isLessThan(new Semver("100.0.0", Semver.SemverType.LOOSE)); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
