
# 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.

now0=`date +'%H%M%S'`

# JVM options.
JVM_OPTS=${JVM_OPTS}" -DIGNITE_QUIET=false"

# Uncomment to enable concurrent garbage collection (GC) if you encounter long GC pauses.
JVM_OPTS=${JVM_OPTS}" \
-Xms6g \
-Xmx6g \
-Xloggc:./gc${now0}.log \
-XX:+PrintGCDetails \
-verbose:gc \
-XX:+UseParNewGC \
-XX:+UseConcMarkSweepGC \
-XX:+PrintGCDateStamps \
"

#Ignite version
ver="RELEASE-"

# List of default probes.
# Add DStatProbe or VmStatProbe if your OS supports it (e.g. if running on Linux).
BENCHMARK_DEFAULT_PROBES=ThroughputLatencyProbe,PercentileProbe

# Packages where the specified benchmark is searched by reflection mechanism.
BENCHMARK_PACKAGES=org.yardstickframework,org.apache.ignite.yardstick

# Flag which indicates to restart the servers before every benchmark execution.
RESTART_SERVERS=true

# Probe point writer class name.
# BENCHMARK_WRITER=

# Comma-separated list of the hosts to run BenchmarkServers on. 2 nodes on local host are enabled by default.
SERVER_HOSTS=localhost,localhost,localhost

# Comma-separated list of the hosts to run BenchmarkDrivers on. 1 node on local host is enabled by default.
DRIVER_HOSTS=localhost

# Remote username.
# REMOTE_USER=

# Number of nodes, used to wait for the specified number of nodes to start.
nodesNum=$((`echo ${SERVER_HOSTS} | tr ',' '\n' | wc -l` + `echo ${DRIVER_HOSTS} | tr ',' '\n' | wc -l`))

# Warmup.
w=60

# Duration.
d=300

# Threads count.
t=64

# Batch size
bs=10000

# Backups count.
b=1

# Run configuration.
# Note that each benchmark is set to run for 300 seconds (5 min) with warm-up set to 60 seconds (1 minute).
CONFIGS="\
-cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -bs ${bs} -b ${b} -w ${w} -d ${d} -t ${t} -dn IgniteAtomicSequenceAddAndGetBenchmark -sn IgniteNode -nn ${nodesNum} -ds ${ver}atomic-sequence-addAndGet-benchmark-${bs}-${b}-backup, \
-cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -bs ${bs} -b ${b} -w ${w} -d ${d} -t ${t} -dn IgniteAtomicSequenceGetAndAddBenchmark -sn IgniteNode -nn ${nodesNum} -ds ${ver}atomic-sequence-getAndAdd-benchmark-${bs}-${b}-backup, \
-cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -bs ${bs} -b ${b} -w ${w} -d ${d} -t ${t} -dn IgniteAtomicSequenceGetAndIncrementBenchmark -sn IgniteNode -nn ${nodesNum} -ds ${ver}atomic-sequence-getAndIncrement-benchmark-${bs}-${b}-backup, \
-cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -bs ${bs} -b ${b} -w ${w} -d ${d} -t ${t} -dn IgniteAtomicSequenceIncrementAndGetBenchmark -sn IgniteNode -nn ${nodesNum} -ds ${ver}atomic-sequence-incrementAndGet-benchmark-${bs}-${b}-backup, \
"
