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

#
# Contains benchmarks for cache queries.
#

# 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 \
# "

#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

# 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

# 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`))

# Backups count.
b=1

# Warmup.
w=60

# Duration.
d=300

# Threads count.
t=64

# Sync mode.
sm=PRIMARY_SYNC

# Jobs.
j=10

# Cache query keepBinary flag.
kb=false

# Cache query pageSize.
ps=1024

# Run configuration.
CONFIGS="\
-cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -lfreq 1000 -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgniteScanQueryGetAllBenchmark -sn IgniteNode -ds ${ver}cache-query-scan -D keepBinary=${kb} -D pageSize=${ps},\
-cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -lfreq 1000 -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgniteTextQueryGetAllBenchmark -sn IgniteNode -ds ${ver}cache-query-text -D keepBinary=${kb} -D pageSize=${ps},\
-cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -lfreq 1000 -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgniteIndexQueryGetAllBenchmark -sn IgniteNode -ds ${ver}cache-query-index -D keepBinary=${kb} -D pageSize=${ps},\
"

