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

#
# Benchmarks for SELECT operations. Operations are measured via JDBC thin, JDBC Thick and native sql.
#

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}" \
-Xms8g \
-Xmx8g \
-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,DStatProbe

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

# The benchmark is applicable only for 2 servers (the second server is started in client mode) and 1 driver.
SERVER_HOSTS=localhost,localhost
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=30

# Duration.
d=300

# Threads count.
t=4

# Sync mode.
sm=FULL_SYNC

# Jobs.
j=10


# Note: don't forget to update --clientNodesAfterId value if benchmark is run on more than 2 hosts.
commonProps="\
  -cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml \
  -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} \
  -sm ${sm} -sn IgniteNode \
  --clientNodesAfterId 0 \
  -cl \
  "

# Run configuration which contains all benchmarks.
# Note that each benchmark is set to run for 300 seconds (5 min) with warm-up set to 60 seconds (1 minute).
CONFIGS="\
${commonProps} -jdbc jdbc:ignite:thin://auto.find/ \
  -dn JdbcSqlQueryRangeBenchmark \
  --select-command BY_PRIMARY_KEY \
  --sqlRange 1 \
  -ds ${ver}sql-select-pk-jdbc-thin-r1-${b}-backup, \
${commonProps} -jdbc jdbc:ignite:cfg://cache=query@config/ignite-jdbc-config.xml \
  -dn JdbcSqlQueryRangeBenchmark \
  --select-command BY_PRIMARY_KEY \
  --sqlRange 1 \
  -ds ${ver}sql-select-pk-jdbc-thick-r1-${b}-backup, \
${commonProps} \
  -dn NativeSqlQueryRangeBenchmark \
  --select-command BY_PRIMARY_KEY \
  --sqlRange 1 \
  -ds ${ver}sql-select-pk-native-sql-r1-${b}-backup, \
  \
${commonProps} -jdbc jdbc:ignite:thin://auto.find/ \
  -dn JdbcSqlQueryRangeBenchmark \
  --select-command BY_VALUE \
  --sqlRange 1 \
  -ds ${ver}sql-select-val-jdbc-thin-r1-${b}-backup, \
${commonProps} -jdbc jdbc:ignite:cfg://cache=query@config/ignite-jdbc-config.xml \
  -dn JdbcSqlQueryRangeBenchmark \
  --select-command BY_VALUE \
  --sqlRange 1 \
  -ds ${ver}sql-select-val-jdbc-thick-r1-${b}-backup, \
${commonProps} \
  -dn NativeSqlQueryRangeBenchmark \
  --select-command BY_VALUE \
  --sqlRange 1 \
  -ds ${ver}sql-select-val-native-sql-r1-${b}-backup, \
  \
${commonProps} -jdbc jdbc:ignite:thin://auto.find/ \
  -dn JdbcSqlQueryRangeBenchmark \
  --select-command BY_PRIMARY_KEY \
  --sqlRange 1000 \
  -ds ${ver}sql-select-pk-jdbc-thin-r1000-${b}-backup, \
${commonProps} -jdbc jdbc:ignite:cfg://cache=query@config/ignite-jdbc-config.xml \
  -dn JdbcSqlQueryRangeBenchmark \
  --select-command BY_PRIMARY_KEY \
  --sqlRange 1000 \
  -ds ${ver}sql-select-pk-jdbc-thick-r1000-${b}-backup, \
${commonProps} \
  -dn NativeSqlQueryRangeBenchmark \
  --select-command BY_PRIMARY_KEY \
  --sqlRange 1000 \
  -ds ${ver}sql-select-pk-native-sql-r1000-${b}-backup, \
  \
${commonProps} -jdbc jdbc:ignite:thin://auto.find/ \
  -dn JdbcSqlQueryRangeBenchmark \
  --select-command BY_VALUE \
  --sqlRange 1000 \
  -ds ${ver}sql-select-val-jdbc-thin-r1000-${b}-backup, \
${commonProps} -jdbc jdbc:ignite:cfg://cache=query@config/ignite-jdbc-config.xml \
  -dn JdbcSqlQueryRangeBenchmark \
  --select-command BY_VALUE \
  --sqlRange 1000 \
  -ds ${ver}sql-select-val-jdbc-thick-r1000-${b}-backup, \
${commonProps} \
  -dn NativeSqlQueryRangeBenchmark \
  --select-command BY_VALUE \
  --sqlRange 1000 \
  -ds ${ver}sql-select-val-native-sql-r1000-${b}-backup \
"