use of org.apache.cassandra.simulator.RandomSource in project cassandra by apache.
the class SimulationTestBase method simulate.
public static void simulate(IIsolatedExecutor.SerializableRunnable[] runnables, IIsolatedExecutor.SerializableRunnable check) {
RandomSource random = new RandomSource.Default();
SimulatedWaits waits = new SimulatedWaits(random);
SimulatedTime time = new SimulatedTime(random, 1577836800000L, /*Jan 1st UTC*/
new LongRange(1, 100, MILLISECONDS, NANOSECONDS), UNIFORM, UNIFORM.period(new LongRange(10L, 60L, SECONDS, NANOSECONDS), random));
SimulatedExecution execution = new SimulatedExecution();
InstanceClassLoader classLoader = new InstanceClassLoader(1, 1, AbstractCluster.CURRENT_VERSION.classpath, Thread.currentThread().getContextClassLoader(), AbstractCluster.getSharedClassPredicate(ISOLATE, SHARE, ANY, SIMULATION), new InterceptClasses(() -> 1.0f, () -> 1.0f, NemesisFieldSelectors.get())::apply);
ThreadGroup tg = new ThreadGroup("test");
InterceptorOfGlobalMethods interceptorOfGlobalMethods = waits.interceptGlobalMethods(classLoader);
InterceptingExecutorFactory factory = execution.factory(interceptorOfGlobalMethods, classLoader, tg);
IsolatedExecutor.transferAdhoc((IIsolatedExecutor.SerializableConsumer<ExecutorFactory>) ExecutorFactory.Global::unsafeSet, classLoader).accept(factory);
IsolatedExecutor.transferAdhoc((IIsolatedExecutor.SerializableBiConsumer<InterceptorOfGlobalMethods, IntSupplier>) InterceptorOfGlobalMethods.Global::unsafeSet, classLoader).accept(interceptorOfGlobalMethods, () -> {
if (InterceptibleThread.isDeterministic())
throw failWithOOM();
return random.uniform(Integer.MIN_VALUE, Integer.MAX_VALUE);
});
SimulatedSystems simulated = new SimulatedSystems(random, time, waits, null, execution, null, null, null, new FutureActionScheduler() {
@Override
public Deliver shouldDeliver(int from, int to) {
return Deliver.DELIVER;
}
@Override
public long messageDeadlineNanos(int from, int to) {
return 0;
}
@Override
public long messageTimeoutNanos(long expiresAfterNanos) {
return 0;
}
@Override
public long messageFailureNanos(int from, int to) {
return 0;
}
@Override
public long schedulerDelayNanos() {
return 0;
}
}, new Debug(), new Failures());
RunnableActionScheduler runnableScheduler = new RunnableActionScheduler.RandomUniform(random);
Action entrypoint = new Action("entrypoint", Action.Modifiers.NONE, Action.Modifiers.NONE) {
protected ActionList performSimple() {
Action[] actions = new Action[runnables.length];
for (int i = 0; i < runnables.length; i++) actions[i] = toAction(runnables[i], classLoader, factory, simulated);
return ActionList.of(actions);
}
};
ActionSchedule testSchedule = new ActionSchedule(simulated.time, simulated.futureScheduler, () -> 0, new Work(UNLIMITED, runnableScheduler, Collections.singletonList(ActionList.of(entrypoint))));
Iterators.advance(testSchedule, Integer.MAX_VALUE);
ActionSchedule checkSchedule = new ActionSchedule(simulated.time, simulated.futureScheduler, () -> 0, new Work(UNLIMITED, runnableScheduler, Collections.singletonList(ActionList.of(toAction(check, classLoader, factory, simulated)))));
Iterators.advance(checkSchedule, Integer.MAX_VALUE);
}
use of org.apache.cassandra.simulator.RandomSource in project cassandra by apache.
the class SimulationTestBase method simulate.
public static void simulate(Function<DTestClusterSimulation, ActionList> init, Function<DTestClusterSimulation, ActionList> test, Consumer<ClusterSimulation.Builder<DTestClusterSimulation>> configure) throws IOException {
SimulationRunner.beforeAll();
long seed = System.currentTimeMillis();
RandomSource random = new RandomSource.Default();
random.reset(seed);
class Factory extends ClusterSimulation.Builder<DTestClusterSimulation> {
public ClusterSimulation<DTestClusterSimulation> create(long seed) throws IOException {
return new ClusterSimulation<>(random, seed, 1, this, (c) -> {
}, (simulated, scheduler, cluster, options) -> new DTestClusterSimulation(simulated, scheduler, cluster) {
protected ActionList initialize() {
return init.apply(this);
}
protected ActionList execute() {
return test.apply(this);
}
});
}
}
Factory factory = new Factory();
configure.accept(factory);
try (ClusterSimulation<?> cluster = factory.create(seed)) {
try {
cluster.simulation.run();
} catch (Throwable t) {
throw new AssertionError(String.format("Failed on seed %s", Long.toHexString(seed)), t);
}
}
}
Aggregations