#
# 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 and select with join queries for mysql database.
# Queries in these benchmarks have no WHERE clause.
#

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

# Since time of each query is big, lets build probe point each 10 seconds.
BENCHMARK_BUILD_PROBE_POINT_INTERVAL=10000

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

# We need no Ignite instances in this benchmark.
SERVER_HOSTS=""
DRIVER_HOSTS=localhost

# Remote username.
# REMOTE_USER=

# Warmup.
w=60

# Duration.
d=300

# Threads count.
t=1

mysqlUrl="jdbc:mysql://localhost/"

commonParams="-cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml \
  -nn 1 \
  -w ${w} -d ${d} \
  --clientNodesAfterId 0 \
  -t ${t} \
  -sn IgniteNode \
  --sqlRange 1000000 \
  --range    1000000"

# 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="\
  ${commonParams} -jdbc ${mysqlUrl} -dn ScanAllBenchmark -ds ${ver}select-all-jdbc-mysql, \
  ${commonParams} -jdbc ${mysqlUrl} -dn ScanAllWithJoinBenchmark -ds ${ver}select-all-join-jdbc-mysql \
"
