| #!/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. |
| |
| # Function to get the git branch and commit hash |
| function get_git_info() { |
| local git_info |
| git_info=$(git log -1 --pretty=format:"%h") |
| local git_branch |
| git_branch=$(git rev-parse --abbrev-ref HEAD) |
| echo "${git_branch}_${git_info}" |
| } |
| |
| # OS detection |
| OS=$(uname -s) |
| |
| # Function to check if process exists - OS specific implementations |
| function process_exists() { |
| local check_pid=$1 |
| if [ "$OS" = "Darwin" ]; then |
| ps -p "${check_pid}" >/dev/null |
| else |
| [[ -e /proc/${check_pid} ]] |
| fi |
| } |
| |
| # Function to send signal to process - OS specific implementations |
| function send_signal_to_pid() { |
| local target_pid=$1 |
| local signal=$2 |
| if [ "$OS" = "Darwin" ]; then |
| kill "-${signal}" "${target_pid}" |
| else |
| kill -s "${signal}" "${target_pid}" |
| fi |
| } |
| |
| # Function to wait for a process with specific name to exit |
| function wait_for_process() { |
| local process_name=$1 |
| local timeout=$2 |
| local start_time |
| start_time=$(date +%s) |
| local end_time=$((start_time + timeout)) |
| local continue_outer_loop=false |
| |
| while [[ $(date +%s) -lt ${end_time} ]]; do |
| continue_outer_loop=false |
| local proc_pid |
| for proc_pid in $(pgrep -x "${process_name}"); do |
| if process_exists "${proc_pid}"; then |
| sleep 0.1 |
| continue_outer_loop=true |
| break |
| fi |
| done |
| [[ $continue_outer_loop == true ]] && continue |
| return 0 |
| done |
| |
| echo "Timeout waiting for process ${process_name} to exit." |
| return 1 |
| } |
| |
| # Function to wait for a process with specific PID to exit |
| function wait_for_process_pid() { |
| local wait_pid=$1 |
| local timeout=$2 |
| local start_time |
| start_time=$(date +%s) |
| local end_time=$((start_time + timeout)) |
| |
| while [[ $(date +%s) -lt ${end_time} ]]; do |
| if ! process_exists "${wait_pid}"; then |
| return 0 |
| fi |
| sleep 0.1 |
| done |
| |
| echo "Timeout waiting for process with PID ${wait_pid} to exit." |
| return 1 |
| } |
| |
| # Function to send a signal to a process |
| function send_signal() { |
| local process_name=$1 |
| local pids |
| pids=$(pgrep -x "${process_name}") || true |
| local signal=$2 |
| |
| if [[ -n "${pids}" ]]; then |
| local proc_pid |
| for proc_pid in ${pids}; do |
| if process_exists "${proc_pid}"; then |
| send_signal_to_pid "${proc_pid}" "${signal}" |
| fi |
| done |
| fi |
| } |
| |
| # Function to exit with error if a process with the given PID is running |
| exit_if_process_is_not_running() { |
| local check_pid="$1" |
| |
| if kill -0 "$check_pid" 2>/dev/null; then |
| echo "Process with PID $check_pid is running." |
| return 0 |
| else |
| echo "Error: Process with PID $check_pid is not running." |
| exit 1 |
| fi |
| } |
| |
| # Exit hook for profile.sh |
| function on_exit_profile() { |
| # Gracefully stop the server |
| send_signal "iggy-server" "KILL" |
| send_signal "iggy-bench" "KILL" |
| send_signal "flamegraph" "KILL" |
| send_signal "perf" "KILL" |
| } |
| |
| # Exit hook for run-benches.sh |
| function on_exit_bench() { |
| send_signal "iggy-server" "KILL" |
| # Use exact match for iggy-bench to avoid killing iggy-bench-dashboard |
| pids=$(pgrep -x "iggy-bench") || true |
| if [[ -n "${pids}" ]]; then |
| local bench_pid |
| for bench_pid in ${pids}; do |
| if process_exists "${bench_pid}"; then |
| send_signal_to_pid "${bench_pid}" "KILL" |
| fi |
| done |
| fi |
| } |