blob: 3a584eac3899abb95d70509f0f8464249b8f35ea [file] [log] [blame]
#!/bin/bash
# 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.
# Example bench command:
# target/release/iggy-bench --message-size 1000 --messages-per-batch 1000 --message-batches 1000 pinned-producer --streams 8 --producers 8 tcp output --remark "test"
# Function to get the current git tag containing "server" or commit SHA1
function get_git_iggy_server_tag_or_sha1() {
local dir="$1"
if [ -d "$dir" ]; then
pushd "$dir" >/dev/null || {
echo "Error: Failed to enter directory '$dir'." >&2
exit 1
}
if git rev-parse --git-dir >/dev/null 2>&1; then
# Get the short commit hash
local commit_hash
commit_hash=$(git rev-parse --short HEAD)
# Get all tags pointing to HEAD that contain "server" (case-insensitive)
local matching_tags
matching_tags=$(git tag --points-at HEAD | grep -i "server" || true)
popd >/dev/null || {
echo "Error: Failed to return from directory '$dir'." >&2
exit 1
}
if [ -n "$matching_tags" ]; then
# If multiple tags match, you can choose to return the first one
# or handle them as needed. Here, we'll return the first match.
local first_matching_tag
first_matching_tag=$(echo "$matching_tags" | head -n 1)
echo "$first_matching_tag"
else
# No matching tag found; return the commit hash
echo "$commit_hash"
fi
else
echo "Error: Directory '$dir' is not a git repository." >&2
popd >/dev/null || exit 1
return 1
fi
else
echo "Error: Directory '$dir' does not exist." >&2
return 1
fi
}
# Function to get the commit date (last modified date) for HEAD
function get_git_commit_date() {
local dir="$1"
if [ -d "$dir" ]; then
pushd "$dir" >/dev/null || {
echo "Error: Failed to enter directory '$dir'." >&2
exit 1
}
if git rev-parse --git-dir >/dev/null 2>&1; then
# Get the committer date (last modified) in ISO 8601 format
local commit_date
commit_date=$(git show -s --format=%cI HEAD 2>/dev/null || echo "")
popd >/dev/null || {
echo "Error: Failed to return from directory '$dir'." >&2
exit 1
}
if [ -n "$commit_date" ]; then
echo "$commit_date"
else
echo "Error: Could not get commit date for HEAD." >&2
return 1
fi
else
echo "Error: Directory '$dir' is not a git repository." >&2
popd >/dev/null || exit 1
return 1
fi
else
echo "Error: Directory '$dir' does not exist." >&2
return 1
fi
}
# Function to construct a bench command
function construct_bench_command() {
readonly bench_command=$1
readonly benchmark_mode=$2
readonly streams=$3
readonly actors=$4
readonly message_size=$5
readonly messages_per_batch=$6
readonly message_batches=$7
readonly protocol=$8
readonly remark=${9:-""}
readonly identifier=${10:-$(hostname)}
readonly rate_limit=${11:-""}
# Set variables based on benchmark mode
local actor_args=""
case "$benchmark_mode" in
"pinned-producer")
actor_args="--producers ${actors}"
;;
"pinned-consumer")
actor_args="--consumers ${actors}"
;;
"pinned-producer-and-consumer")
actor_args="--producers ${actors} --consumers ${actors}"
;;
"balanced-producer")
actor_args="--producers ${actors}"
;;
"balanced-consumer-group")
actor_args="--consumers ${actors}"
;;
"balanced-producer-and-consumer-group")
actor_args="--producers ${actors} --consumers ${actors}"
;;
"end-to-end-producing-consumer")
actor_args="--producing-consumers ${actors}"
;;
"end-to-end-producing-consumer-group")
actor_args="--producers ${actors} --consumers ${actors}"
;;
*)
echo "Error: Invalid benchmark mode '$benchmark_mode'." >&2
return 1
;;
esac
local commit_hash
commit_hash=$(get_git_iggy_server_tag_or_sha1 .) || {
echo "Failed to get git commit or tag."
exit 1
}
local commit_date
commit_date=$(get_git_commit_date .) || {
echo "Failed to get git commit date."
exit 1
}
echo "$bench_command ${rate_limit:+ --rate-limit ${rate_limit}} \
--message-size ${message_size} \
--messages-per-batch ${messages_per_batch} \
--message-batches ${message_batches} \
${benchmark_mode} \
--streams ${streams} \
${actor_args} \
${protocol} \
output \
--output-dir performance_results \
--identifier ${identifier} \
--remark ${remark} \
--extra-info \"\" \
--gitref \"${commit_hash}\" \
--gitref-date \"${commit_date}\""
}