blob: 1e454e68f79f34f5f8d007e335337f4ef058f669 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.geode.perftest;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.yardstickframework.BenchmarkDriver;
import org.apache.geode.perftest.yardstick.YardstickTask;
/**
* Declarative configuration of a test. Used by
* {@link PerformanceTest} to define the test.
*
*/
public class TestConfig implements Serializable {
private final WorkloadConfig workloadConfig = new WorkloadConfig();
private Map<String, Integer> roles = new LinkedHashMap<>();
private Map<String, List<String>> jvmArgs = BenchmarkProperties.getDefaultJVMArgs();
private List<TestStep> before = new ArrayList<>();
private List<TestStep> workload = new ArrayList<>();
private List<TestStep> after = new ArrayList<>();
/**
* Define a role for the test.
*
* @param role The name of the role
* @param numberOfJVMs The number of JVMs that should be launched that have this role.
*/
public void role(String role, int numberOfJVMs) {
this.roles.put(role, numberOfJVMs);
}
/**
* Add a before task to the test. Each before task is run in parallel on
* all of the nodes that have the given role
*
* @param task The task to execute
* @param roles The roles to execute the task on
*/
public void before(Task task, String... roles) {
before.add(new TestStep(task, roles));
}
/**
* Add an after task to the test. After tasks are run in parallel on all
* nodes that have the given roles
*/
public void after(Task task, String... roles) {
after.add(new TestStep(task, roles));
}
/**
* Add a workload task to the test. Workload tasks are run repeatedly
* during the workload phase, and the time to run the workload is measured.
*
* @param benchmark The workload to run
* @param roles The roles to run the workload on
*/
public void workload(BenchmarkDriver benchmark, String... roles) {
workload.add(new TestStep(new YardstickTask(benchmark, workloadConfig), roles));
}
/**
* Set the duration of the workload phase. This is the amount of time that
* the workload tasks are actually measured. The total runtime of the test
* is the {@link #durationSeconds(long)} + {@link #warmupSeconds(long)}
*
* @param durationSeconds The time in seconds for the duration phase
*/
public void durationSeconds(long durationSeconds) {
workloadConfig.durationSeconds(durationSeconds);
}
/**
* Set the number of threads to run in each JVM for the workload test. Default
* is twice the number of available processors.
*/
public void threads(int threads) {
workloadConfig.threads(threads);
}
/**
* Set the duration of the warmup phase. Workload tasks are run for this amount
* of time as a warmup, but the measurements from the tasks are discarded.
*
* @param warmupSeconds The time in seconds for the warmup phase
*/
public void warmupSeconds(long warmupSeconds) {
workloadConfig.warmupSeconds(warmupSeconds);
}
public long getDurationSeconds() {
return workloadConfig.getDurationSeconds();
}
public long getWarmupSeconds() {
return workloadConfig.getWarmupSeconds();
}
public int getThreads() {
return workloadConfig.getThreads();
}
public Map<String, Integer> getRoles() {
return roles;
}
public List<TestStep> getBefore() {
return before;
}
public List<TestStep> getWorkload() {
return workload;
}
public List<TestStep> getAfter() {
return after;
}
/**
* Add JVM arguments used to launch JVMs for a particular role
*
* If multiple calls to this method are made for the same role, the new JVM arguments
* are appended to the existing JVM args
*/
public void jvmArgs(String role, String... jvmArgs) {
List<String> roleArgs = this.jvmArgs.computeIfAbsent(role, key -> new ArrayList<>());
roleArgs.addAll(Arrays.asList(jvmArgs));
}
public Map<String, List<String>> getJvmArgs() {
return Collections.unmodifiableMap(jvmArgs);
}
}