mirror of https://github.com/apache/cassandra
Fix flakiness of TopPartitionsTest
patch by Dmitry Konstantinov; reviewed by Stefan Miklosovic, Berenguer Blasi for CASSANDRA-19991
This commit is contained in:
parent
63cad45bfc
commit
d939e40dfb
|
|
@ -42,7 +42,7 @@ public abstract class Sampler<T>
|
||||||
MonotonicClock clock = MonotonicClock.approxTime;
|
MonotonicClock clock = MonotonicClock.approxTime;
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static final ThreadPoolExecutor samplerExecutor = new JMXEnabledThreadPoolExecutor(1, 1,
|
public static final ThreadPoolExecutor samplerExecutor = new JMXEnabledThreadPoolExecutor(1, 1,
|
||||||
TimeUnit.SECONDS,
|
TimeUnit.SECONDS,
|
||||||
new ArrayBlockingQueue<Runnable>(1000),
|
new ArrayBlockingQueue<Runnable>(1000),
|
||||||
new NamedThreadFactory("Sampler"),
|
new NamedThreadFactory("Sampler"),
|
||||||
|
|
|
||||||
|
|
@ -86,6 +86,7 @@ import org.apache.cassandra.utils.CounterId;
|
||||||
import org.apache.cassandra.utils.FBUtilities;
|
import org.apache.cassandra.utils.FBUtilities;
|
||||||
import org.apache.cassandra.utils.FilterFactory;
|
import org.apache.cassandra.utils.FilterFactory;
|
||||||
import org.awaitility.Awaitility;
|
import org.awaitility.Awaitility;
|
||||||
|
import org.hamcrest.Matcher;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
|
|
@ -626,12 +627,17 @@ public class Util
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> void spinAssertEquals(String message, T expected, Supplier<? extends T> actualSupplier, long timeout, TimeUnit timeUnit)
|
public static <T> void spinAssertEquals(String message, T expected, Supplier<? extends T> actualSupplier, long timeout, TimeUnit timeUnit)
|
||||||
|
{
|
||||||
|
spinAssert(message, equalTo(expected), actualSupplier, timeout, timeUnit);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> void spinAssert(String message, Matcher<T> matcher, Supplier<? extends T> actualSupplier, long timeout, TimeUnit timeUnit)
|
||||||
{
|
{
|
||||||
Awaitility.await()
|
Awaitility.await()
|
||||||
.pollInterval(Duration.ofMillis(100))
|
.pollInterval(Duration.ofMillis(100))
|
||||||
.pollDelay(0, TimeUnit.MILLISECONDS)
|
.pollDelay(0, TimeUnit.MILLISECONDS)
|
||||||
.atMost(timeout, timeUnit)
|
.atMost(timeout, timeUnit)
|
||||||
.untilAsserted(() -> assertThat(message, actualSupplier.get(), equalTo(expected)));
|
.untilAsserted(() -> assertThat(message, actualSupplier.get(), matcher));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void joinThread(Thread thread) throws InterruptedException
|
public static void joinThread(Thread thread) throws InterruptedException
|
||||||
|
|
|
||||||
|
|
@ -33,13 +33,16 @@ import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import org.apache.cassandra.SchemaLoader;
|
import org.apache.cassandra.SchemaLoader;
|
||||||
|
import org.apache.cassandra.Util;
|
||||||
import org.apache.cassandra.db.ColumnFamilyStore;
|
import org.apache.cassandra.db.ColumnFamilyStore;
|
||||||
import org.apache.cassandra.db.SystemKeyspace;
|
import org.apache.cassandra.db.SystemKeyspace;
|
||||||
import org.apache.cassandra.exceptions.ConfigurationException;
|
import org.apache.cassandra.exceptions.ConfigurationException;
|
||||||
|
import org.apache.cassandra.metrics.Sampler;
|
||||||
import org.apache.cassandra.service.StorageService;
|
import org.apache.cassandra.service.StorageService;
|
||||||
|
|
||||||
import static java.lang.String.format;
|
import static java.lang.String.format;
|
||||||
import static org.apache.cassandra.cql3.QueryProcessor.executeInternal;
|
import static org.apache.cassandra.cql3.QueryProcessor.executeInternal;
|
||||||
|
import static org.hamcrest.Matchers.greaterThan;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
public class TopPartitionsTest
|
public class TopPartitionsTest
|
||||||
|
|
@ -76,10 +79,35 @@ public class TopPartitionsTest
|
||||||
@Test
|
@Test
|
||||||
public void testServiceTopPartitionsSingleTable() throws Exception
|
public void testServiceTopPartitionsSingleTable() throws Exception
|
||||||
{
|
{
|
||||||
ColumnFamilyStore.getIfExists("system", "local").beginLocalSampling("READS", 5, 240000);
|
ColumnFamilyStore columnFamilyStore = ColumnFamilyStore.getIfExists("system", "local");
|
||||||
|
String samplerName = "READS";
|
||||||
|
long executedBefore = Sampler.samplerExecutor.getCompletedTaskCount();
|
||||||
|
columnFamilyStore.beginLocalSampling(samplerName, 5, 240_000);
|
||||||
|
|
||||||
String req = "SELECT * FROM system.%s WHERE key='%s'";
|
String req = "SELECT * FROM system.%s WHERE key='%s'";
|
||||||
executeInternal(format(req, SystemKeyspace.LOCAL, SystemKeyspace.LOCAL));
|
executeInternal(format(req, SystemKeyspace.LOCAL, SystemKeyspace.LOCAL));
|
||||||
List<CompositeData> result = ColumnFamilyStore.getIfExists("system", "local").finishLocalSampling("READS", 5);
|
ensureThatSamplerExecutorProcessedAllSamples(executedBefore);
|
||||||
|
|
||||||
|
List<CompositeData> result = columnFamilyStore.finishLocalSampling(samplerName, 5);
|
||||||
assertEquals("If this failed you probably have to raise the beginLocalSampling duration", 1, result.size());
|
assertEquals("If this failed you probably have to raise the beginLocalSampling duration", 1, result.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void ensureThatSamplerExecutorProcessedAllSamples(long executedBefore)
|
||||||
|
{
|
||||||
|
Util.spinAssertEquals("samplerExecutor should not have pending tasks",
|
||||||
|
0,
|
||||||
|
() -> Sampler.samplerExecutor.getQueue().size(),
|
||||||
|
60,
|
||||||
|
TimeUnit.SECONDS);
|
||||||
|
Util.spinAssertEquals("samplerExecutor should not have active tasks",
|
||||||
|
0,
|
||||||
|
Sampler.samplerExecutor::getActiveCount,
|
||||||
|
60,
|
||||||
|
TimeUnit.SECONDS);
|
||||||
|
Util.spinAssert("samplerExecutor has not completed any new tasks after beginLocalSampling",
|
||||||
|
greaterThan(executedBefore),
|
||||||
|
Sampler.samplerExecutor::getCompletedTaskCount,
|
||||||
|
60,
|
||||||
|
TimeUnit.SECONDS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue