# 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 TRANSACTIONAL 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 mins) 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 IgnitePutTxBenchmark -sn IgniteNode -ds tx-put-1-backup,^
-cfg %SCRIPT_DIR%\..\config\ignite-localhost-config.xml -b 1 -w 60 -d 300 -t 64 -sm PRIMARY_SYNC -dn IgnitePutTxOffHeapBenchmark -sn IgniteNode -ds tx-put-offheap-1-backup,^
-cfg %SCRIPT_DIR%\..\config\ignite-localhost-config.xml -b 1 -w 60 -d 300 -t 64 -sm PRIMARY_SYNC -dn IgnitePutTxOffHeapValuesBenchmark -sn IgniteNode -ds tx-put-offheap-val-1-backup,^
-cfg %SCRIPT_DIR%\..\config\ignite-localhost-config.xml -b 1 -w 60 -d 300 -t 64 -sm PRIMARY_SYNC -dn IgnitePutGetTxBenchmark -sn IgniteNode -ds tx-put-get-1-backup,^
-cfg %SCRIPT_DIR%\..\config\ignite-localhost-config.xml -b 1 -w 60 -d 300 -t 64 -sm PRIMARY_SYNC -dn IgnitePutGetTxOffHeapBenchmark -sn IgniteNode -ds tx-put-get-offheap-1-backup,^
-cfg %SCRIPT_DIR%\..\config\ignite-localhost-config.xml -b 1 -w 60 -d 300 -t 64 -sm PRIMARY_SYNC -dn IgnitePutGetTxOffHeapValuesBenchmark -sn IgniteNode -ds tx-put-get-offheap-val-1-backup
