#!/bin/bash
function _sanitizer_to_bazel_config() {
case "$1" in
address) echo "asan" ;;
thread) echo "tsan" ;;
undefined) echo "ubsan" ;;
*) echo "$1" ;;
esac
}
function _bazel_build_configs() {
local test_included="$1"
if [[ "${BUILD_TYPE}" = "Debug" ]]; then
echo "--config=debug"
else
echo "--config=release"
fi
local sanitizer_lower
sanitizer_lower=$(echo "${USE_SANITIZER}" | tr '[:upper:]' '[:lower:]')
if [[ "${sanitizer_lower}" != "off" ]]; then
echo "--config=$(_sanitizer_to_bazel_config "${sanitizer_lower}")"
fi
if is_on "${BUILD_COVERAGE}"; then
echo "--config=coverage"
fi
if is_on "${BUILD_HETERO}"; then
echo "--config=hetero"
fi
if is_on "${BUILD_PIPLN_H2D}"; then
echo "--config=pipeline_h2d"
fi
if is_on "${ENABLE_PERF}"; then
echo "--config=perf"
fi
if is_on "${BUILD_WITH_URMA}"; then
echo "--config=urma"
fi
if [[ "${test_included}" != "no" && "${RUN_TESTS}" != "off" ]]; then
echo "--config=test"
fi
}
function build_datasystem_bazel() {
echo -e "-- building datasystem (bazel)..."
if is_on "${BUILD_WITH_NINJA}"; then
echo -e "-- [INFO] bazel mode: ignoring -n (Ninja) option, bazel has its own build scheduler."
fi
if is_on "${BUILD_INCREMENT}"; then
echo -e "-- [INFO] bazel mode: ignoring -i (incremental) option, bazel is incremental by default."
fi
if is_on "${DOWNLOAD_UB}"; then
echo -e "-- [INFO] bazel mode: ignoring -D (download UB) option."
fi
if is_on "${SUPPORT_JEPROF}"; then
echo -e "-- [INFO] bazel mode: -x (jemalloc profiling) not yet supported."
fi
if is_on "${PACKAGE_JAVA}"; then
echo -e "-- [INFO] bazel mode: -J (Java API) not yet supported."
fi
if is_on "${PACKAGE_GO}"; then
echo -e "-- [INFO] bazel mode: -G (Go SDK) not yet supported."
fi
if is_on "${BUILD_WITH_RDMA}"; then
echo -e "-- [INFO] bazel mode: -A (RDMA) not yet supported."
fi
if ! command -v bazel &>/dev/null; then
go_die "ERROR: bazel not found in PATH. Please install bazel first."
fi
local -a configs
while IFS= read -r cfg; do
configs+=("${cfg}")
done < <(_bazel_build_configs "yes")
local -a targets=(
"//bazel:datasystem_sdk"
"//src/datasystem/worker:datasystem_worker_shared"
)
if is_on "${PACKAGE_PYTHON}"; then
targets+=("//bazel:datasystem_wheel")
fi
if [[ "${RUN_TESTS}" != "off" ]]; then
targets+=("//:hashring_parser_file" "//:curve_keygen_file")
fi
if [[ "${BUILD_TYPE}" != "Debug" ]] && is_on "${ENABLE_STRIP}"; then
targets+=("//:libdatasystem_sym" "//:datasystem_worker_stripped" "//:datasystem_worker_sym")
else
targets+=("//src/datasystem/worker:datasystem_worker")
fi
local baseTime_s
baseTime_s=$(date +%s)
echo -e "-- bazel command: bazel build ${configs[@]} --jobs=${BUILD_THREAD_NUM} ${targets[@]}"
cd "${DATASYSTEM_DIR}"
bazel build "${configs[@]}" --jobs="${BUILD_THREAD_NUM}" "${targets[@]}" || go_die "-- bazel build failed!"
echo -e "---- [TIMER] Build source: $(($(date +%s)-$baseTime_s)) seconds"
_bazel_install_outputs
}
function _bazel_install_outputs() {
echo -e "-- installing bazel outputs to ${INSTALL_DIR}..."
local bazel_bin="${DATASYSTEM_DIR}/bazel-bin"
if [[ "${BUILD_INCREMENT}" == "off" && -d "${INSTALL_DIR}" ]]; then
rm -rf "${INSTALL_DIR}"
echo -e "-- [Warning] Removed output folder ${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
local DS_DIR="${INSTALL_DIR}/datasystem"
local sdk_tar="${bazel_bin}/bazel/datasystem_sdk.tar"
if [[ -f "${sdk_tar}" ]]; then
local sdk_tmp
sdk_tmp=$(mktemp -d)
tar -xf "${sdk_tar}" -C "${sdk_tmp}" || go_die "-- failed to extract SDK tar"
if [[ ! -d "${sdk_tmp}/datasystem_sdk/cpp" ]]; then
rm -rf "${sdk_tmp}"
go_die "-- SDK tar did not contain expected datasystem_sdk/cpp directory"
fi
mkdir -p "${DS_DIR}/sdk"
cp -rL "${sdk_tmp}/datasystem_sdk/cpp" "${DS_DIR}/sdk/cpp"
cp -rL "${sdk_tmp}/datasystem_sdk/cpp" "${INSTALL_DIR}/cpp"
rm -rf "${sdk_tmp}"
else
echo -e "-- [WARN] SDK tar not found: ${sdk_tar}"
fi
if [[ -f "${bazel_bin}/libdatasystem.so.sym" ]]; then
mkdir -p "${DS_DIR}/sdk/DATASYSTEM_SYM"
cp -f "${bazel_bin}/libdatasystem.so.sym" "${DS_DIR}/sdk/DATASYSTEM_SYM/"
mkdir -p "${INSTALL_DIR}/cpp/DATASYSTEM_SYM"
cp -f "${bazel_bin}/libdatasystem.so.sym" "${INSTALL_DIR}/cpp/DATASYSTEM_SYM/"
fi
mkdir -p "${DS_DIR}/service/lib"
mkdir -p "${DS_DIR}/service/DATASYSTEM_SYM"
if [[ -f "${bazel_bin}/datasystem_worker.stripped" ]]; then
cp -f "${bazel_bin}/datasystem_worker.stripped" "${DS_DIR}/service/datasystem_worker"
elif [[ -f "${bazel_bin}/src/datasystem/worker/datasystem_worker" ]]; then
cp -f "${bazel_bin}/src/datasystem/worker/datasystem_worker" "${DS_DIR}/service/datasystem_worker"
fi
if [[ -f "${bazel_bin}/datasystem_worker.sym" ]]; then
cp -f "${bazel_bin}/datasystem_worker.sym" "${DS_DIR}/service/DATASYSTEM_SYM/"
fi
if [[ -f "${bazel_bin}/src/datasystem/worker/libdatasystem_worker_shared.so" ]]; then
cp -f "${bazel_bin}/src/datasystem/worker/libdatasystem_worker_shared.so" "${DS_DIR}/service/lib/libdatasystem_worker.so"
fi
cp -f "${DATASYSTEM_DIR}/cli/deploy/conf/worker_config.json" "${DS_DIR}/service/"
cp -f "${DATASYSTEM_DIR}/cli/deploy/conf/cluster_config.json" "${DS_DIR}/service/"
if [[ "${RUN_TESTS}" != "off" ]]; then
mkdir -p "${DS_DIR}/tools"
if [[ -f "${bazel_bin}/yr/datasystem/tools/hashring_parser" ]]; then
cp -f "${bazel_bin}/yr/datasystem/tools/hashring_parser" "${DS_DIR}/tools/"
fi
if [[ -f "${bazel_bin}/yr/datasystem/tools/curve_keygen" ]]; then
cp -f "${bazel_bin}/yr/datasystem/tools/curve_keygen" "${DS_DIR}/tools/"
fi
fi
mkdir -p "${DS_DIR}/cli"
if [[ -d "${DATASYSTEM_DIR}/cli" ]]; then
cp -rL "${DATASYSTEM_DIR}/cli/." "${DS_DIR}/cli/"
fi
cp -f "${DATASYSTEM_DIR}/VERSION" "${DS_DIR}/VERSION"
cp -f "${DATASYSTEM_DIR}/README.md" "${DS_DIR}/README.md"
local git_hash
git_hash=$(cd "${DATASYSTEM_DIR}" && git rev-parse --short HEAD 2>/dev/null || echo "unknown")
echo "${git_hash}" > "${DS_DIR}/.commit_id"
if is_on "${PACKAGE_PYTHON}"; then
local wheel_file
wheel_file=$(find -L "${bazel_bin}" -name "openyuanrong_datasystem-*.whl" -type f 2>/dev/null | head -1)
if [[ -n "${wheel_file}" ]]; then
cp -f "${wheel_file}" "${INSTALL_DIR}/"
echo -e "-- copied wheel: $(basename "${wheel_file}")"
fi
fi
local version
version=$(cat "${DATASYSTEM_DIR}/VERSION")
if [[ -d "${DS_DIR}" ]]; then
cd "${INSTALL_DIR}"
tar --remove-files -zcf "yr-datasystem-v${version}.tar.gz" datasystem || go_die "-- failed to create deployment tarball"
cd "${DATASYSTEM_DIR}"
fi
echo -e "-- bazel install done."
echo -e "-- build datasystem (bazel) success!"
}
function run_bazel_testcases() {
if [[ "${RUN_TESTS}" = "off" ]]; then
return 0
fi
if [[ "${RUN_TESTS}" = "build" ]]; then
echo -e "-- bazel mode: test build already done in build step."
return 0
fi
echo -e "-- running datasystem testcases (bazel)..."
local -a configs
while IFS= read -r cfg; do
configs+=("${cfg}")
done < <(_bazel_build_configs "no")
configs+=("--config=test")
local baseTime_s
baseTime_s=$(date +%s)
echo -e "-- bazel test command: bazel test ${configs[@]} --jobs=${TEST_PARALLEL_JOBS} //..."
cd "${DATASYSTEM_DIR}"
bazel test "${configs[@]}" --jobs="${TEST_PARALLEL_JOBS}" --test_timeout="${LLT_TIMEOUT_S}" //... \
|| go_die "-- bazel test failed!"
echo -e "---- run datasystem testcases success!"
echo -e "---- [TIMER] Run bazel test: $(($(date +%s)-$baseTime_s)) seconds"
}