#!/bin/bash

function _get_sysbench_results()
{
	local cluster="${1}"
	local filter=''
	if [ ! -z "${2+x}" ]; then
		local filter="${2}"
	fi

	local results="${cluster}.data/sysbench"

	ls "${results}" | while read dir; do
		if [ ! -d "${results}/${dir}" ]; then
			continue
		fi

		if [ "${#dir}" -lt 16 ]; then
			continue
		fi
		local name_and_ext="${dir:16}"
		local name=`echo "${name_and_ext}" | awk -F '.' '{print $1}'`
		local workload=`echo "${name_and_ext}" | awk -F '.' '{print $2}'`

		if [ ! -f "${results}/${dir}/tags" ]; then
			continue
		fi
		local tags=`cat "${results}/${dir}/tags"`

		local has_setting_tag=`echo "${tags}" | grep 'setting:'`
		if [ -z "${has_setting_tag}" ]; then
			local tags="${tags},setting:-"
		fi

		if [ ! -f "${results}/${dir}/run.log" ]; then
			continue
		fi

		if [ ! -f "${results}/${dir}/start" ]; then
			continue
		fi
		local start_ts=`cat ${results}/${dir}/start`

		local end_ts="none"
		if [ ! -f "${results}/${dir}/end" ]; then
			local name="${name}(UNFINISHED)"
			local tags="${tags},tag:${name}"
		else
			local end_ts=`cat ${results}/${dir}/end`
		fi

		local run_log="${results}/${dir}/run.log"
		local lag95=`cat "${run_log}" | grep '95th percentile:' | awk '{print $3}' | awk -F '.' '{print $1}'`
		local qps=`cat "${run_log}" | grep ' queries:' | awk '{print $3}' | awk -F '.' '{print $1}' | awk -F '(' '{print $2}'`
		if [ -z "${lag95}" ] || [ -z "${qps}" ]; then
			continue
		fi

		local qps_lines=`cat "${run_log}" | grep 'qps: ' | awk -F 'qps: ' '{print $2}' | awk '{print $1}'`
		local qps_std_ev=`echo "${qps_lines}" | std_ev | awk -F '.' '{print $1}'`
		local sd_percent=$((qps_std_ev * 100 / qps))
		if [ "${sd_percent}" -gt 15 ]; then
			local name="${name}(unstable)"
			local tags="${tags},tag:${name}"
		fi

		local is_filter=`echo "${tags}" | grep "${filter}"`
		if [ -z "${is_filter}" ]; then
			continue
		fi

		echo "${qps} start:${start_ts},end:${end_ts},${tags},data:qps"
		echo "${sd_percent} start:${start_ts},end:${end_ts},${tags},data:qps_sd%"
		echo "${lag95} start:${start_ts},end:${end_ts},${tags},data:95%latency(ms)"
	done
}
export -f _get_sysbench_results

function _gen_sysbench_report()
{
	if [ -z "${3+x}" ]; then
		echo "[func _gen_sysbench_report] usage: <func> entry_dir data_file [table_format]" >&2
		return 1
	fi

	local entry_dir="${1}"
	local data_file="${2}"
	local table_format=''
	if [ ! -z "${3+x}" ]; then
		local table_format="${3}"
	fi
	if [ -z "${table_format}" ]; then
		local table_format="thd=threads; size=table_size; cols:data|notag; rows:tables,size,txn,thd,dur,setting,tag,workload; cell:limit(20)|avg|~|cnt"
	fi

	local report="${entry_dir}/report"
	local title='<sysbench performance>'

	rm -f "${report}.tmp"

	if [ -f "${entry_dir}/${data_file}" ]; then
		to_table "${title}" "${table_format}" 99999 "${entry_dir}/${data_file}" > "${report}.tmp"
	fi

	if [ -f "${report}.tmp" ]; then
		mv -f "${report}.tmp" "${report}"
	fi

	if [ -f "${report}" ]; then
		cat "${report}"
	fi
}
export -f _gen_sysbench_report

function cmd_ti_sysbench_report()
{
	local ti_file="${1}"
	local ti_args="${2}"
	local cmd_mod_names="${3}"
	local cmd_hosts="${4}"
	local cmd_indexes="${5}"
	local mods="${6}"
	shift 6

	local table_format=''
	if [ ! -z "${1+x}" ]; then
		local table_format="${1}"
	fi

	local filter=''
	if [ ! -z "${2+x}" ]; then
		local filter="${2}"
	fi

	_get_sysbench_results "${ti_file}" "${filter}" > "${ti_file}.data/sysbench/results.data"
	_gen_sysbench_report "${ti_file}.data/sysbench" 'results.data' "${table_format}"
}

source "`cd $(dirname ${BASH_SOURCE[0]}) && pwd`/_env.sh"
auto_error_handle
cmd_ti_sysbench_report "${@}"
