From 9b32b8a4369049aec6e0848d21f524a40d2c93f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20de=20la=20Pe=C3=B1a?= Date: Fri, 26 Mar 2021 15:13:22 +0000 Subject: [PATCH] Fix flaky SSTableMetadataTest and SSTableMetadataTrackingTest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit patch by Andrés de la Peña; reviewed by Brandon Williams and Ekaterina Dimitrova for CASSANDRA-16236 --- .../SSTableMetadataTrackingTest.java | 26 +++++-- .../io/sstable/SSTableMetadataTest.java | 68 +++++++++---------- 2 files changed, 52 insertions(+), 42 deletions(-) diff --git a/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/SSTableMetadataTrackingTest.java b/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/SSTableMetadataTrackingTest.java index 288cbe1a04..5d367de49c 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/SSTableMetadataTrackingTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/SSTableMetadataTrackingTest.java @@ -27,6 +27,13 @@ import static org.junit.Assert.assertEquals; public class SSTableMetadataTrackingTest extends CQLTester { + /** + * Max allowed difference between compared SSTable metadata timestamps, in seconds. + * We use a {@code double} to force the usage of {@link org.junit.Assert#assertEquals(double, double, double)} when + * comparing integer timestamps, otherwise {@link org.junit.Assert#assertEquals(float, float, float)} would be used. + */ + public static final double DELTA = 5; + @Test public void baseCheck() throws Throwable { @@ -54,12 +61,12 @@ public class SSTableMetadataTrackingTest extends CQLTester StatsMetadata metadata = cfs.getLiveSSTables().iterator().next().getSSTableMetadata(); assertEquals(9999, metadata.minTimestamp); assertEquals(10000, metadata.maxTimestamp); - assertEquals(Integer.MAX_VALUE, metadata.maxLocalDeletionTime, 5); + assertEquals(Integer.MAX_VALUE, metadata.maxLocalDeletionTime, DELTA); cfs.forceMajorCompaction(); metadata = cfs.getLiveSSTables().iterator().next().getSSTableMetadata(); assertEquals(9999, metadata.minTimestamp); assertEquals(10000, metadata.maxTimestamp); - assertEquals(Integer.MAX_VALUE, metadata.maxLocalDeletionTime, 5); + assertEquals(Integer.MAX_VALUE, metadata.maxLocalDeletionTime, DELTA); } @Test @@ -73,12 +80,12 @@ public class SSTableMetadataTrackingTest extends CQLTester StatsMetadata metadata = cfs.getLiveSSTables().iterator().next().getSSTableMetadata(); assertEquals(9999, metadata.minTimestamp); assertEquals(10000, metadata.maxTimestamp); - assertEquals(Integer.MAX_VALUE, metadata.maxLocalDeletionTime, 5); + assertEquals(Integer.MAX_VALUE, metadata.maxLocalDeletionTime, DELTA); cfs.forceMajorCompaction(); metadata = cfs.getLiveSSTables().iterator().next().getSSTableMetadata(); assertEquals(9999, metadata.minTimestamp); assertEquals(10000, metadata.maxTimestamp); - assertEquals(Integer.MAX_VALUE, metadata.maxLocalDeletionTime, 5); + assertEquals(Integer.MAX_VALUE, metadata.maxLocalDeletionTime, DELTA); } @@ -93,7 +100,7 @@ public class SSTableMetadataTrackingTest extends CQLTester StatsMetadata metadata = cfs.getLiveSSTables().iterator().next().getSSTableMetadata(); assertEquals(9999, metadata.minTimestamp); assertEquals(9999, metadata.maxTimestamp); - assertEquals(System.currentTimeMillis()/1000, metadata.maxLocalDeletionTime, 5); + assertEquals(nowInSec(), metadata.maxLocalDeletionTime, DELTA); cfs.forceMajorCompaction(); StatsMetadata metadata2 = cfs.getLiveSSTables().iterator().next().getSSTableMetadata(); assertEquals(metadata.maxLocalDeletionTime, metadata2.maxLocalDeletionTime); @@ -113,7 +120,7 @@ public class SSTableMetadataTrackingTest extends CQLTester StatsMetadata metadata = cfs.getLiveSSTables().iterator().next().getSSTableMetadata(); assertEquals(9999, metadata.minTimestamp); assertEquals(9999, metadata.maxTimestamp); - assertEquals(System.currentTimeMillis()/1000, metadata.maxLocalDeletionTime, 5); + assertEquals(nowInSec(), metadata.maxLocalDeletionTime, DELTA); cfs.forceMajorCompaction(); StatsMetadata metadata2 = cfs.getLiveSSTables().iterator().next().getSSTableMetadata(); assertEquals(metadata.maxLocalDeletionTime, metadata2.maxLocalDeletionTime); @@ -152,11 +159,16 @@ public class SSTableMetadataTrackingTest extends CQLTester StatsMetadata metadata = cfs.getLiveSSTables().iterator().next().getSSTableMetadata(); assertEquals(9999, metadata.minTimestamp); assertEquals(9999, metadata.maxTimestamp); - assertEquals(System.currentTimeMillis()/1000, metadata.maxLocalDeletionTime, 5); + assertEquals(nowInSec(), metadata.maxLocalDeletionTime, DELTA); cfs.forceMajorCompaction(); StatsMetadata metadata2 = cfs.getLiveSSTables().iterator().next().getSSTableMetadata(); assertEquals(metadata.maxLocalDeletionTime, metadata2.maxLocalDeletionTime); assertEquals(metadata.minTimestamp, metadata2.minTimestamp); assertEquals(metadata.maxTimestamp, metadata2.maxTimestamp); } + + private static int nowInSec() + { + return (int) (System.currentTimeMillis() / 1000); + } } diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java index e70f72f7eb..aecddf9ca3 100644 --- a/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java @@ -20,7 +20,6 @@ package org.apache.cassandra.io.sstable; import java.nio.charset.CharacterCodingException; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.ExecutionException; import org.junit.BeforeClass; import org.junit.Test; @@ -29,7 +28,6 @@ import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.db.ColumnFamilyStore; -import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.RowUpdateBuilder; import org.apache.cassandra.db.marshal.AsciiType; @@ -50,6 +48,13 @@ public class SSTableMetadataTest public static final String CF_STANDARDCOMPOSITE2 = "StandardComposite2"; public static final String CF_COUNTER1 = "Counter1"; + /** + * Max allowed difference between compared SSTable metadata timestamps, in seconds. + * We use a {@code double} to force the usage of {@link org.junit.Assert#assertEquals(double, double, double)} when + * comparing integer timestamps, otherwise {@link org.junit.Assert#assertEquals(float, float, float)} would be used. + */ + public static final double DELTA = 10; + @BeforeClass public static void defineSchema() { @@ -73,9 +78,8 @@ public class SSTableMetadataTest Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard1"); long timestamp = System.currentTimeMillis(); - for(int i = 0; i < 10; i++) + for (int i = 0; i < 10; i++) { - DecoratedKey key = Util.dk(Integer.toString(i)); for (int j = 0; j < 10; j++) new RowUpdateBuilder(store.metadata(), timestamp, 10 + j, Integer.toString(i)) .clustering(Integer.toString(j)) @@ -91,15 +95,14 @@ public class SSTableMetadataTest .build() .applyUnsafe(); - store.forceBlockingFlush(); assertEquals(1, store.getLiveSSTables().size()); - int ttltimestamp = (int)(System.currentTimeMillis()/1000); + int ttltimestamp = (int) (System.currentTimeMillis() / 1000); int firstDelTime = 0; - for(SSTableReader sstable : store.getLiveSSTables()) + for (SSTableReader sstable : store.getLiveSSTables()) { firstDelTime = sstable.getSSTableMetadata().maxLocalDeletionTime; - assertEquals(ttltimestamp + 10000, firstDelTime, 10); + assertEquals(ttltimestamp + 10000, firstDelTime, DELTA); } @@ -109,27 +112,26 @@ public class SSTableMetadataTest .build() .applyUnsafe(); - - ttltimestamp = (int) (System.currentTimeMillis()/1000); + ttltimestamp = (int) (System.currentTimeMillis() / 1000); store.forceBlockingFlush(); assertEquals(2, store.getLiveSSTables().size()); List sstables = new ArrayList<>(store.getLiveSSTables()); - if(sstables.get(0).getSSTableMetadata().maxLocalDeletionTime < sstables.get(1).getSSTableMetadata().maxLocalDeletionTime) + if (sstables.get(0).getSSTableMetadata().maxLocalDeletionTime < sstables.get(1).getSSTableMetadata().maxLocalDeletionTime) { assertEquals(sstables.get(0).getSSTableMetadata().maxLocalDeletionTime, firstDelTime); - assertEquals(sstables.get(1).getSSTableMetadata().maxLocalDeletionTime, ttltimestamp + 20000, 10); + assertEquals(sstables.get(1).getSSTableMetadata().maxLocalDeletionTime, ttltimestamp + 20000, DELTA); } else { assertEquals(sstables.get(1).getSSTableMetadata().maxLocalDeletionTime, firstDelTime); - assertEquals(sstables.get(0).getSSTableMetadata().maxLocalDeletionTime, ttltimestamp + 20000, 10); + assertEquals(sstables.get(0).getSSTableMetadata().maxLocalDeletionTime, ttltimestamp + 20000, DELTA); } Util.compact(store, store.getLiveSSTables()); assertEquals(1, store.getLiveSSTables().size()); - for(SSTableReader sstable : store.getLiveSSTables()) + for (SSTableReader sstable : store.getLiveSSTables()) { - assertEquals(sstable.getSSTableMetadata().maxLocalDeletionTime, ttltimestamp + 20000, 10); + assertEquals(sstable.getSSTableMetadata().maxLocalDeletionTime, ttltimestamp + 20000, DELTA); } } @@ -140,18 +142,14 @@ public class SSTableMetadataTest * 4. flush, verify the new sstable (maxLocalDeletionTime = ~now) * 5. compact * 6. verify resulting sstable has maxLocalDeletionTime = time + 100. - * - * @throws ExecutionException - * @throws InterruptedException */ @Test - public void testWithDeletes() throws ExecutionException, InterruptedException + public void testWithDeletes() { Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard2"); long timestamp = System.currentTimeMillis(); - DecoratedKey key = Util.dk("deletetest"); - for (int i = 0; i<5; i++) + for (int i = 0; i < 5; i++) new RowUpdateBuilder(store.metadata(), timestamp, 100, "deletetest") .clustering("deletecolumn" + i) .add("val", ByteBufferUtil.EMPTY_BYTE_BUFFER) @@ -166,46 +164,46 @@ public class SSTableMetadataTest .applyUnsafe(); store.forceBlockingFlush(); - assertEquals(1,store.getLiveSSTables().size()); - int ttltimestamp = (int) (System.currentTimeMillis()/1000); + assertEquals(1, store.getLiveSSTables().size()); + int ttltimestamp = (int) (System.currentTimeMillis() / 1000); int firstMaxDelTime = 0; - for(SSTableReader sstable : store.getLiveSSTables()) + for (SSTableReader sstable : store.getLiveSSTables()) { firstMaxDelTime = sstable.getSSTableMetadata().maxLocalDeletionTime; - assertEquals(ttltimestamp + 1000, firstMaxDelTime, 10); + assertEquals(ttltimestamp + 1000, firstMaxDelTime, DELTA); } RowUpdateBuilder.deleteRow(store.metadata(), timestamp + 1, "deletetest", "todelete").applyUnsafe(); store.forceBlockingFlush(); - assertEquals(2,store.getLiveSSTables().size()); + assertEquals(2, store.getLiveSSTables().size()); boolean foundDelete = false; - for(SSTableReader sstable : store.getLiveSSTables()) + for (SSTableReader sstable : store.getLiveSSTables()) { - if(sstable.getSSTableMetadata().maxLocalDeletionTime != firstMaxDelTime) + if (sstable.getSSTableMetadata().maxLocalDeletionTime != firstMaxDelTime) { - assertEquals(sstable.getSSTableMetadata().maxLocalDeletionTime, ttltimestamp, 10); + assertEquals(sstable.getSSTableMetadata().maxLocalDeletionTime, ttltimestamp, DELTA); foundDelete = true; } } assertTrue(foundDelete); Util.compact(store, store.getLiveSSTables()); - assertEquals(1,store.getLiveSSTables().size()); - for(SSTableReader sstable : store.getLiveSSTables()) + assertEquals(1, store.getLiveSSTables().size()); + for (SSTableReader sstable : store.getLiveSSTables()) { - assertEquals(ttltimestamp + 100, sstable.getSSTableMetadata().maxLocalDeletionTime, 10); + assertEquals(ttltimestamp + 100, sstable.getSSTableMetadata().maxLocalDeletionTime, DELTA); } } @Test - public void trackMaxMinColNames() throws CharacterCodingException, ExecutionException, InterruptedException + public void trackMaxMinColNames() throws CharacterCodingException { Keyspace keyspace = Keyspace.open(KEYSPACE1); ColumnFamilyStore store = keyspace.getColumnFamilyStore("Standard3"); for (int j = 0; j < 8; j++) { String key = "row" + j; - for (int i = 100; i<150; i++) + for (int i = 100; i < 150; i++) { new RowUpdateBuilder(store.metadata(), System.currentTimeMillis(), key) .clustering(j + "col" + i) @@ -226,7 +224,7 @@ public class SSTableMetadataTest } String key = "row2"; - for (int i = 101; i<299; i++) + for (int i = 101; i < 299; i++) { new RowUpdateBuilder(store.metadata(), System.currentTimeMillis(), key) .clustering(9 + "col" + i)