# 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 ATOMIC cache.
::

:: JVM options.
set JVM_OPTS=%JVM_OPTS% -DIGNITE_QUIET=false

:: Uncomment to enable concurrent garbage collection (GC) if you encounter long GC pauses.
:: set JVM_OPTS=%JVM_OPTS%^
::  -XX:+UseParNewGC^
::  -XX:+UseConcMarkSweepGC^
::  -XX:+UseTLAB^
::  -XX:NewSize=128m^
::  -XX:MaxNewSize=128m^
::  -XX:MaxTenuringThreshold=0^
::  -XX:SurvivorRatio=1024^
::  -XX:+UseCMSInitiatingOccupancyOnly^
::  -XX:CMSInitiatingOccupancyFraction=60

:: List of default probes.
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.
set SERVER_HOSTS=localhost,localhost

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

:: Remote username.
:: set REMOTE_USER=

:: 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).
set CONFIGS=^
-cfg %SCRIPT_DIR%\..\config\ignite-localhost-config.xml -b 1 -w 60 -d 300 -t 64 -sm PRIMARY_SYNC -dn IgniteGetBenchmark -sn IgniteNode -ds atomic-get-1-backup,^
-cfg %SCRIPT_DIR%\..\config\ignite-localhost-config.xml -b 1 -w 60 -d 300 -t 64 -sm PRIMARY_SYNC -dn IgnitePutGetBenchmark -sn IgniteNode -ds atomic-put-get-1-backup,^
-cfg %SCRIPT_DIR%\..\config\ignite-localhost-config.xml -b 1 -w 60 -d 300 -t 64 -sm PRIMARY_SYNC -dn IgnitePutBenchmark -sn IgniteNode -ds atomic-put-1-backup
