Skip to content

Commit

Permalink
Fix flaky SSTableMetadataTest and SSTableMetadataTrackingTest
Browse files Browse the repository at this point in the history
patch by Andrés de la Peña; reviewed by Brandon Williams and Ekaterina Dimitrova for CASSANDRA-16236
  • Loading branch information
adelapena committed Mar 26, 2021
1 parent 2facbc9 commit 9b32b8a
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 42 deletions.
Expand Up @@ -27,6 +27,13 @@

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
{
Expand Down Expand Up @@ -54,12 +61,12 @@ public void testMinMaxtimestampRange() throws Throwable
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
Expand All @@ -73,12 +80,12 @@ public void testMinMaxtimestampRow() throws Throwable
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);
}


Expand All @@ -93,7 +100,7 @@ public void testTrackMetadata_rangeTombstone() throws Throwable
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);
Expand All @@ -113,7 +120,7 @@ public void testTrackMetadata_rowTombstone() throws Throwable
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);
Expand Down Expand Up @@ -152,11 +159,16 @@ public void testTrackMetadata_rowMarkerDelete() throws Throwable
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);
}
}
68 changes: 33 additions & 35 deletions test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java
Expand Up @@ -20,7 +20,6 @@
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;
Expand All @@ -29,7 +28,6 @@
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;
Expand All @@ -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()
{
Expand All @@ -73,9 +78,8 @@ public void testTrackMaxDeletionTime()
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))
Expand All @@ -91,15 +95,14 @@ public void testTrackMaxDeletionTime()
.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);

}

Expand All @@ -109,27 +112,26 @@ public void testTrackMaxDeletionTime()
.build()
.applyUnsafe();


ttltimestamp = (int) (System.currentTimeMillis()/1000);
ttltimestamp = (int) (System.currentTimeMillis() / 1000);
store.forceBlockingFlush();
assertEquals(2, store.getLiveSSTables().size());
List<SSTableReader> 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);
}
}

Expand All @@ -140,18 +142,14 @@ public void testTrackMaxDeletionTime()
* 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)
Expand All @@ -166,46 +164,46 @@ public void testWithDeletes() throws ExecutionException, InterruptedException
.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)
Expand All @@ -226,7 +224,7 @@ public void trackMaxMinColNames() throws CharacterCodingException, ExecutionExce
}
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)
Expand Down

0 comments on commit 9b32b8a

Please sign in to comment.