Summary: Add automatic per-block interpolation search selection (`kAuto` mode) for index blocks. During SST construction, each index block's key distribution is analyzed using the coefficient of variation (CV) of gaps between restart-point keys. Blocks with uniformly distributed keys are flagged via a new bit in the data block footer, and at read time, `kAuto` resolves to interpolation search for uniform blocks and binary search otherwise. ## Key changes - **New `BlockSearchType::kAuto` enum value**: Resolves per-block at read time to either `kInterpolation` or `kBinary` based on the block's uniformity flag. Falls back to `kBinary` on older versions that don't recognize it. - **Write-path uniformity analysis**: `BlockBuilder::ScanForUniformity()` uses Welford's online algorithm to incrementally compute the CV of key gaps at restart points. The result is stored in a new bit (bit 30) of the data block footer's packed restart count. - **New table option `uniform_cv_threshold`** (default: -1 `disabled`): Controls how strict the uniformity check is. Set to negative to disable. Exposed in C++, Java (JNI), and `db_bench`. - **Code reorganization**: Block entry decode helpers (`DecodeEntry`, `DecodeKey`, `DecodeKeyV4`, `ReadBe64FromKey`) moved from `block.cc` to a new shared header `block_util.h` so they can be reused by `BlockBuilder` on the write path. - **New histogram `BLOCK_KEY_DISTRIBUTION_CV`**: Records the CV (scaled by 10000) of each index block's key distribution for observability. - **Java bindings**: `IndexSearchType.kAuto`, `uniformCvThreshold` getter/setter, JNI portal constructor signature updated, and `HistogramType.BLOCK_KEY_DISTRIBUTION_CV` added. Pull Request resolved: https://github.com/facebook/rocksdb/pull/14383 Test Plan: - `IndexBlockTest.IndexValueEncodingTest` parameterized to include `kAuto` search type alongside `kBinary` and `kInterpolation`, verifying correct seek/iteration behavior across all combinations of key distributions, restart intervals, and key lengths. - Uniformity detection validated: blocks with uniform key distribution correctly set `is_uniform = true`, blocks with clustered/non-uniform keys set `is_uniform = false`. - Stress test coverage - Updated check_format_compatible to also include a "uniform" dataset. By default using uniform_cv_threshold=-1 does not result in an incompatibility issues. When manually changing the threshold (e.g. `uniform_cv_threshold=1000`), I see `bad block contents`, which is expected ## Benchmark readrandom with `fillrandom,compact -seed=1 --statistics`: | Benchmark | Branch | Params | avg ops/s | % change vs main | CV P50 | |-----------|--------|--------|-----------|------------------|--------| | readrandom | main | `binary_search, shortening=1` | 335,791 | baseline | N/A | | readrandom | feature | `binary_search, shortening=1` (default) | 335,749 | -0.0% | 1,500 | | readrandom | feature | `auto_search, shortening=1` (kAuto) | 366,832 | **+9.2%** | 1,500 | | readrandom | feature | `interpolation_search, shortening=1` | 366,598 | **+9.2%** | 1,500 | | readrandom | feature | `auto_search, shortening=2` (kAuto) | 344,631 | **+2.6%** | 1,030,000 | | readrandom | feature | `interpolation_search, shortening=2` | 201,178 | **-40.1%** | 1,030,000 | As seen with shortening=2, a non-uniform distribution produces a high CV, which does not use interpolation search. ## Write benchmark There is a write overhead which scans each restart entry for a block upon Finish. In practice this is very low because currently it is only applied to index blocks. See cpu profile (https://fburl.com/strobelight/io5hwj9h) here of `-benchmarks=fillseq,compact -compression_type=none -disable_wal=1`. Only 0.08% attributed to `ScanForUniformity`. Reviewed By: pdillinger Differential Revision: D94738890 Pulled By: joshkang97 fbshipit-source-id: 9661ac593c5fef89d49f3a8a027f1338a0c96766
453 lines
17 KiB
Bash
Executable file
453 lines
17 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
#
|
|
# A shell script to build and run different versions of ldb to check for
|
|
# expected forward and backward compatibility with "current" version. The
|
|
# working copy must have no uncommitted changes.
|
|
#
|
|
# Usage: <SCRIPT> [ref_for_current]
|
|
# `ref_for_current` can be a revision, tag, commit or branch name. Default is HEAD.
|
|
#
|
|
# Return value 0 means all regression tests pass. 1 if not pass.
|
|
#
|
|
# Environment options:
|
|
# SANITY_CHECK=1 - Do a syntax check and git checkout test as a sanity check
|
|
# that the script hasn't been broken by e.g. adding a new release wrongly.
|
|
# SHORT_TEST=1 - Test only the oldest branch for each kind of test. This is
|
|
# a good choice for PR validation as it is relatively fast and will find
|
|
# most issues.
|
|
# LONG_TEST=1 - Test all branches known to build for this test, rather than
|
|
# the default of randomly sampling the branches that aren't the oldest in
|
|
# each set.
|
|
# USE_SSH=1 - Connect to GitHub with ssh instead of https
|
|
|
|
if ! git diff-index --quiet HEAD; then
|
|
echo "You have uncommitted changes. Aborting."
|
|
exit 1
|
|
fi
|
|
|
|
current_checkout_name=${1:-HEAD}
|
|
# This allows the script to work even if with transient refs like "HEAD"
|
|
current_checkout_hash="$(git rev-parse --quiet --verify $current_checkout_name)"
|
|
|
|
if [ "$current_checkout_hash" == "" ]; then
|
|
echo "Not a recognized ref: $current_checkout_name"
|
|
exit 1
|
|
fi
|
|
|
|
# To restore to prior branch at the end
|
|
orig_branch="$(git rev-parse --abbrev-ref HEAD)"
|
|
tmp_branch=_tmp_format_compatible
|
|
tmp_origin=_tmp_origin
|
|
|
|
# Don't depend on what current "origin" might be
|
|
set -e
|
|
git remote remove $tmp_origin 2>/dev/null || true
|
|
if [ "$USE_SSH" ]; then
|
|
git remote add $tmp_origin "git@github.com:facebook/rocksdb.git"
|
|
else
|
|
git remote add $tmp_origin "https://github.com/facebook/rocksdb.git"
|
|
fi
|
|
git fetch $tmp_origin
|
|
|
|
# Used in building some ancient RocksDB versions where by default it tries to
|
|
# use a precompiled libsnappy.a checked in to the repo.
|
|
export SNAPPY_LDFLAGS=-lsnappy
|
|
|
|
cleanup() {
|
|
echo "== Cleaning up"
|
|
git reset --hard || true
|
|
git checkout "$orig_branch" || true
|
|
git branch -D $tmp_branch || true
|
|
git remote remove $tmp_origin || true
|
|
}
|
|
trap cleanup EXIT # Always clean up, even on failure or Ctrl+C
|
|
|
|
scriptpath=`dirname ${BASH_SOURCE[0]}`
|
|
|
|
test_dir=${TEST_TMPDIR:-"/tmp"}"/rocksdb_format_compatible_$USER"
|
|
rm -rf ${test_dir:?}
|
|
|
|
# Prevent 'make clean' etc. from wiping out test_dir
|
|
export TEST_TMPDIR=$test_dir"/misc"
|
|
|
|
# For saving current version of scripts as we checkout different versions to test
|
|
script_copy_dir=$test_dir"/script_copy"
|
|
mkdir -p $script_copy_dir
|
|
cp -f $scriptpath/*.sh $script_copy_dir
|
|
|
|
# For shared raw input data
|
|
input_data_path=$test_dir"/test_data_input"
|
|
mkdir -p $input_data_path
|
|
# For external sst ingestion test
|
|
ext_test_dir=$test_dir"/ext"
|
|
mkdir -p $ext_test_dir
|
|
# For DB dump test
|
|
db_test_dir=$test_dir"/db"
|
|
mkdir -p $db_test_dir
|
|
# For backup/restore test (uses DB test)
|
|
bak_test_dir=$test_dir"/bak"
|
|
mkdir -p $bak_test_dir
|
|
|
|
python_bin=$(which python3 || which python || echo python3)
|
|
|
|
if [ "$J" == "" ]; then
|
|
# make parallelism
|
|
J=32
|
|
fi
|
|
|
|
# Generate random files. We want enough files to cover a variety of compression
|
|
# settings and low enough entropy in the files to make compression highly
|
|
# likely, including for index blocks.
|
|
for i in {1..8}
|
|
do
|
|
input_data[$i]=$input_data_path/data$i
|
|
echo == Generating random input file ${input_data[$i]}
|
|
$python_bin - <<EOF
|
|
import random
|
|
random.seed($i)
|
|
symbols=['a', 'b', 'c', 'd', 'e', 'f', 'g']
|
|
with open('${input_data[$i]}', 'w') as f:
|
|
for i in range(1,1024):
|
|
k = ""
|
|
for j in range(1, random.randint(1,80)):
|
|
k=k + symbols[random.randint(0, len(symbols) - 1)]
|
|
vb = ""
|
|
for j in range(1, random.randint(0,128)):
|
|
vb = vb + symbols[random.randint(0, len(symbols) - 1)]
|
|
v = ""
|
|
for j in range(1, random.randint(1, 5)):
|
|
v = v + vb
|
|
print(k + " ==> " + v, file=f)
|
|
EOF
|
|
done
|
|
|
|
# Generate file(s) with sorted keys.
|
|
sorted_input_data=$input_data_path/sorted_data
|
|
echo == Generating file with sorted keys ${sorted_input_data}
|
|
$python_bin - <<EOF
|
|
with open('${sorted_input_data}', 'w') as f:
|
|
for i in range(0,10):
|
|
k = str(i)
|
|
v = "value" + k
|
|
print(k + " ==> " + v, file=f)
|
|
EOF
|
|
|
|
# Generate a file with uniformly distributed keys
|
|
uniform_input_data=$input_data_path/uniform_data
|
|
echo == Generating file with uniform keys ${uniform_input_data}
|
|
$python_bin - <<EOF
|
|
with open('${uniform_input_data}', 'w') as f:
|
|
for i in range(0, 2000):
|
|
k = f"{i:012d}"
|
|
v = f"value{i:012d}"
|
|
print(k + " ==> " + v, file=f)
|
|
EOF
|
|
|
|
# db_backward_only_refs defined below the rest
|
|
|
|
# To check for DB forward compatibility with loading options (old version
|
|
# reading data from new), as well as backward compatibility
|
|
declare -a db_forward_with_options_refs=("10.4.fb" "10.5.fb" "10.6.fb" "10.7.fb" "10.8.fb" "10.9.fb" "10.10.fb" "10.11.fb" "11.0.fb")
|
|
# To check for DB forward compatibility without loading options (in addition
|
|
# to the "with loading options" set), as well as backward compatibility
|
|
declare -a db_forward_no_options_refs=() # N/A at the moment
|
|
|
|
# To check for SST ingestion backward compatibility (new version reading
|
|
# data from old) (ldb ingest_extern_sst added in 5.16.x, back-ported to
|
|
# 5.14.x, 5.15.x)
|
|
declare -a ext_backward_only_refs=("5.14.fb" "5.15.fb" "5.16.fb" "5.17.fb" "5.18.fb" "6.0.fb" "6.1.fb" "6.2.fb" "6.3.fb" "6.4.fb" "6.5.fb" "6.6.fb" "6.7.fb" "6.8.fb" "6.9.fb" "6.10.fb" "6.11.fb" "6.12.fb" "6.13.fb" "6.14.fb" "6.15.fb" "6.16.fb" "6.17.fb" "6.18.fb" "6.19.fb" "6.20.fb" "6.21.fb" "6.22.fb" "6.23.fb" "6.24.fb" "6.25.fb" "6.26.fb" "6.27.fb" "6.28.fb" "6.29.fb" "7.0.fb" "7.1.fb" "7.2.fb" "7.3.fb" "7.4.fb" "7.5.fb" "7.6.fb" "7.7.fb" "7.8.fb" "7.9.fb" "7.10.fb" "8.0.fb" "8.1.fb" "8.2.fb" "8.3.fb" "8.4.fb" "8.5.fb" "8.6.fb" "8.7.fb" "8.8.fb" "8.9.fb" "8.10.fb" "8.11.fb" "9.0.fb" "9.1.fb" "9.2.fb" "9.3.fb" "9.4.fb" "9.5.fb" "9.6.fb" "9.7.fb" "9.8.fb" "9.9.fb" "9.10.fb" "9.11.fb" "10.0.fb" "10.1.fb" "10.2.fb" "10.3.fb")
|
|
# To check for SST ingestion forward compatibility (old version reading
|
|
# data from new) as well as backward compatibility
|
|
declare -a ext_forward_refs=("${db_forward_no_options_refs[@]}" "${db_forward_with_options_refs[@]}")
|
|
|
|
# To check for backup backward compatibility (new version reading data
|
|
# from old) (ldb backup/restore added in 4.11.x)
|
|
declare -a bak_backward_only_refs=("4.11.fb" "4.12.fb" "4.13.fb" "5.0.fb" "5.1.fb" "5.2.fb" "5.3.fb" "5.4.fb" "5.5.fb" "5.6.fb" "5.7.fb" "5.8.fb" "5.9.fb" "5.10.fb" "5.11.fb" "5.12.fb" "5.13.fb" "${ext_backward_only_refs[@]}")
|
|
# To check for backup forward compatibility (old version reading data
|
|
# from new) as well as backward compatibility
|
|
declare -a bak_forward_refs=("${db_forward_no_options_refs[@]}" "${db_forward_with_options_refs[@]}")
|
|
|
|
# Branches (git refs) to check for DB backward compatibility (new version
|
|
# reading data from old) (in addition to the "forward compatible" list)
|
|
# NOTE: format_version < 2 support was removed, so we only test back to 4.6.fb
|
|
# (when format_version=2 became the default)
|
|
declare -a db_backward_only_refs=("4.6.fb" "4.7.fb" "4.8.fb" "4.9.fb" "4.10.fb" "${bak_backward_only_refs[@]}")
|
|
|
|
if [ "$SHORT_TEST" ]; then
|
|
# Use only the first (if exists) of each list
|
|
db_backward_only_refs=(${db_backward_only_refs[0]})
|
|
db_forward_no_options_refs=(${db_forward_no_options_refs[0]})
|
|
db_forward_with_options_refs=(${db_forward_with_options_refs[0]})
|
|
ext_backward_only_refs=(${ext_backward_only_refs[0]})
|
|
ext_forward_refs=(${ext_forward_refs[0]})
|
|
bak_backward_only_refs=(${bak_backward_only_refs[0]})
|
|
bak_forward_refs=(${bak_forward_refs[0]})
|
|
fi
|
|
|
|
# De-duplicate & accumulate
|
|
declare -a checkout_refs=()
|
|
# Always include first release on each list
|
|
for checkout_ref in "${db_backward_only_refs[0]}" "${db_forward_no_options_refs[0]}" "${db_forward_with_options_refs[0]}" "${ext_backward_only_refs[0]}" "${ext_forward_refs[0]}" "${bak_backward_only_refs[0]}" "${bak_forward_refs[0]}"
|
|
do
|
|
if [ ! -e $db_test_dir/$checkout_ref ]; then
|
|
mkdir -p $db_test_dir/$checkout_ref
|
|
checkout_refs+=($checkout_ref)
|
|
fi
|
|
done
|
|
# Maybe include rest if not short test
|
|
if [ "$SHORT_TEST" == "" ]; then
|
|
for checkout_ref in "${db_backward_only_refs[@]}" "${db_forward_no_options_refs[@]}" "${db_forward_with_options_refs[@]}" "${ext_backward_only_refs[@]}" "${ext_forward_refs[@]}" "${bak_backward_only_refs[@]}" "${bak_forward_refs[@]}"
|
|
do
|
|
if [ ! -e $db_test_dir/$checkout_ref ]; then
|
|
mkdir -p $db_test_dir/$checkout_ref
|
|
# Randomly sample remaining releases, unless long test
|
|
if [ "$LONG_TEST" ] || [ "$(($RANDOM % 3))" == "0" ]; then
|
|
checkout_refs+=($checkout_ref)
|
|
fi
|
|
fi
|
|
done
|
|
fi
|
|
|
|
invoke_make()
|
|
{
|
|
[ "$SANITY_CHECK" ] || make "$@"
|
|
}
|
|
generate_db()
|
|
{
|
|
set +e
|
|
[ "$SANITY_CHECK" ] || bash "$script_copy_dir"/generate_random_db.sh "$1" "$2"
|
|
if [ $? -ne 0 ]; then
|
|
echo ==== Error loading data from $2 to $1 ====
|
|
exit 1
|
|
fi
|
|
set -e
|
|
}
|
|
|
|
compare_db()
|
|
{
|
|
set +e
|
|
[ "$SANITY_CHECK" ] || bash "$script_copy_dir"/verify_random_db.sh "$1" "$2" "$3" "$4" "$5"
|
|
if [ $? -ne 0 ]; then
|
|
echo ==== Read different content from $1 and $2 or error happened. ====
|
|
exit 1
|
|
fi
|
|
set -e
|
|
}
|
|
|
|
compact_db()
|
|
{
|
|
set +e
|
|
[ "$SANITY_CHECK" ] || bash "$script_copy_dir"/compact_db.sh "$1" "$2" "$3"
|
|
if [ $? -ne 0 ]; then
|
|
echo ==== Error compacting DB at $1 ====
|
|
exit 1
|
|
fi
|
|
set -e
|
|
}
|
|
|
|
write_external_sst()
|
|
{
|
|
set +e
|
|
[ "$SANITY_CHECK" ] || bash "$script_copy_dir"/write_external_sst.sh "$1" "$2" "$3"
|
|
if [ $? -ne 0 ]; then
|
|
echo ==== Error writing external SST file using data from $1 to $3 ====
|
|
exit 1
|
|
fi
|
|
set -e
|
|
}
|
|
|
|
ingest_external_sst()
|
|
{
|
|
set +e
|
|
[ "$SANITY_CHECK" ] || bash "$script_copy_dir"/ingest_external_sst.sh "$1" "$2"
|
|
if [ $? -ne 0 ]; then
|
|
echo ==== Error ingesting external SST in $2 to DB at $1 ====
|
|
exit 1
|
|
fi
|
|
set -e
|
|
}
|
|
|
|
backup_db()
|
|
{
|
|
set +e
|
|
[ "$SANITY_CHECK" ] || bash "$script_copy_dir"/backup_db.sh "$1" "$2"
|
|
if [ $? -ne 0 ]; then
|
|
echo ==== Error backing up DB $1 to $2 ====
|
|
exit 1
|
|
fi
|
|
set -e
|
|
}
|
|
|
|
restore_db()
|
|
{
|
|
set +e
|
|
[ "$SANITY_CHECK" ] || bash "$script_copy_dir"/restore_db.sh "$1" "$2"
|
|
if [ $? -ne 0 ]; then
|
|
echo ==== Error restoring from $1 to $2 ====
|
|
exit 1
|
|
fi
|
|
set -e
|
|
}
|
|
|
|
member_of_array()
|
|
{
|
|
local e match="$1"
|
|
shift
|
|
for e; do [[ "$e" == "$match" ]] && return 0; done
|
|
return 1
|
|
}
|
|
|
|
force_no_fbcode()
|
|
{
|
|
# Not all branches recognize ROCKSDB_NO_FBCODE and we should not need
|
|
# to patch old branches for changes to available FB compilers.
|
|
sed -i -e 's|-d /mnt/gvfs/third-party|"$ROCKSDB_FORCE_FBCODE"|' build_tools/build_detect_platform
|
|
# Fix a build issue affecting at least 4.2.fb
|
|
if [ -e include/rocksdb/delete_scheduler.h ]; then
|
|
sed -i -e 's|pragma once|pragma once\n#include <memory>|' include/rocksdb/delete_scheduler.h
|
|
fi
|
|
}
|
|
|
|
# General structure from here:
|
|
# * Check out, build, and do stuff with the "current" branch.
|
|
# * For each older branch under consideration,
|
|
# * Check out, build, and do stuff with it, potentially using data
|
|
# generated from "current" branch.
|
|
# * (Again) check out, build, and do (other) stuff with the "current"
|
|
# branch, potentially using data from older branches.
|
|
#
|
|
# This way, we only do at most n+1 checkout+build steps, without the
|
|
# need to stash away executables.
|
|
|
|
# Decorate name
|
|
current_checkout_name="$current_checkout_name ($current_checkout_hash)"
|
|
|
|
echo "== Building $current_checkout_name debug"
|
|
git checkout -B $tmp_branch $current_checkout_hash
|
|
force_no_fbcode
|
|
invoke_make clean
|
|
DISABLE_WARNING_AS_ERROR=1 invoke_make ldb -j$J
|
|
|
|
echo "== Using $current_checkout_name, generate DB with extern SST and ingest"
|
|
current_ext_test_dir=$ext_test_dir"/current"
|
|
write_external_sst $input_data_path ${current_ext_test_dir}_pointless $current_ext_test_dir
|
|
ingest_external_sst ${current_ext_test_dir}_ingest $current_ext_test_dir
|
|
|
|
echo "== Generating DB from $current_checkout_name ..."
|
|
current_db_test_dir=$db_test_dir"/current"
|
|
generate_db $input_data_path $current_db_test_dir
|
|
|
|
echo "== Creating backup of DB from $current_checkout_name ..."
|
|
current_bak_test_dir=$bak_test_dir"/current"
|
|
backup_db $current_db_test_dir $current_bak_test_dir
|
|
|
|
for checkout_ref in "${checkout_refs[@]}"
|
|
do
|
|
echo "== Building $checkout_ref debug"
|
|
git reset --hard $tmp_origin/$checkout_ref
|
|
force_no_fbcode
|
|
invoke_make clean
|
|
DISABLE_WARNING_AS_ERROR=1 invoke_make ldb -j$J
|
|
|
|
# We currently assume DB backward compatibility for every branch listed
|
|
echo "== Use $checkout_ref to generate a DB ..."
|
|
generate_db $input_data_path $db_test_dir/$checkout_ref
|
|
|
|
if member_of_array "$checkout_ref" "${ext_backward_only_refs[@]}" ||
|
|
member_of_array "$checkout_ref" "${ext_forward_refs[@]}"
|
|
then
|
|
echo "== Use $checkout_ref to generate DB with extern SST file"
|
|
write_external_sst $input_data_path $ext_test_dir/${checkout_ref}_pointless $ext_test_dir/$checkout_ref
|
|
fi
|
|
|
|
if member_of_array "$checkout_ref" "${ext_forward_refs[@]}"
|
|
then
|
|
echo "== Use $checkout_ref to ingest extern SST file and compare vs. $current_checkout_name"
|
|
ingest_external_sst $ext_test_dir/${checkout_ref}_ingest $ext_test_dir/$checkout_ref
|
|
compare_db $ext_test_dir/${checkout_ref}_ingest ${current_ext_test_dir}_ingest db_dump.txt 1 1
|
|
|
|
rm -rf ${ext_test_dir:?}/${checkout_ref}_ingest
|
|
echo "== Use $checkout_ref to ingest extern SST file from $current_checkout_name"
|
|
ingest_external_sst $ext_test_dir/${checkout_ref}_ingest $current_ext_test_dir
|
|
compare_db $ext_test_dir/${checkout_ref}_ingest ${current_ext_test_dir}_ingest db_dump.txt 1 1
|
|
fi
|
|
|
|
if member_of_array "$checkout_ref" "${db_forward_no_options_refs[@]}" ||
|
|
member_of_array "$checkout_ref" "${db_forward_with_options_refs[@]}"
|
|
then
|
|
echo "== Use $checkout_ref to open DB generated using $current_checkout_name..."
|
|
compare_db $db_test_dir/$checkout_ref $current_db_test_dir forward_${checkout_ref}_dump.txt 0
|
|
|
|
echo "== Use $checkout_ref to compact a copy of DB generated using $current_checkout_name..."
|
|
[ "$SANITY_CHECK" ] || cp -a $current_db_test_dir ${current_db_test_dir}_copy_for_${checkout_ref}
|
|
compact_db ${current_db_test_dir}_copy_for_${checkout_ref} 0
|
|
|
|
echo "== After compaction, re-verify DB copy originally from $current_checkout_name..."
|
|
compare_db ${current_db_test_dir}_copy_for_${checkout_ref} $current_db_test_dir forward_${checkout_ref}_dump_after_compact.txt 0
|
|
fi
|
|
|
|
if member_of_array "$checkout_ref" "${db_forward_with_options_refs[@]}"
|
|
then
|
|
echo "== Use $checkout_ref to open DB generated using $current_checkout_name with its options..."
|
|
compare_db $db_test_dir/$checkout_ref $current_db_test_dir forward_${checkout_ref}_dump.txt 1 1
|
|
fi
|
|
|
|
if member_of_array "$checkout_ref" "${bak_backward_only_refs[@]}" ||
|
|
member_of_array "$checkout_ref" "${bak_forward_refs[@]}"
|
|
then
|
|
echo "== Use $checkout_ref to backup DB"
|
|
backup_db $db_test_dir/$checkout_ref $bak_test_dir/$checkout_ref
|
|
fi
|
|
|
|
if member_of_array "$checkout_ref" "${bak_forward_refs[@]}"
|
|
then
|
|
echo "== Use $checkout_ref to restore DB from $current_checkout_name"
|
|
rm -rf ${db_test_dir:?}/$checkout_ref
|
|
restore_db $current_bak_test_dir $db_test_dir/$checkout_ref
|
|
compare_db $db_test_dir/$checkout_ref $current_db_test_dir forward_${checkout_ref}_dump.txt 0
|
|
fi
|
|
done
|
|
|
|
echo "== Building $current_checkout_name debug (again, final)"
|
|
git reset --hard $current_checkout_hash
|
|
force_no_fbcode
|
|
invoke_make clean
|
|
DISABLE_WARNING_AS_ERROR=1 invoke_make ldb -j$J
|
|
|
|
for checkout_ref in "${checkout_refs[@]}"
|
|
do
|
|
# We assume DB backward compatibility for every branch listed
|
|
echo "== Use $current_checkout_name to open DB generated using $checkout_ref..."
|
|
compare_db $db_test_dir/$checkout_ref $current_db_test_dir db_dump.txt 1 0
|
|
|
|
echo "== Use $current_checkout_name to compact DB generated using $checkout_ref..."
|
|
compact_db $db_test_dir/$checkout_ref 1 0
|
|
|
|
echo "== After compaction, re-verify DB originally from $checkout_ref..."
|
|
compare_db $db_test_dir/$checkout_ref $current_db_test_dir db_dump_after_compact.txt 1 0
|
|
|
|
if member_of_array "$checkout_ref" "${ext_backward_only_refs[@]}" ||
|
|
member_of_array "$checkout_ref" "${ext_forward_refs[@]}"
|
|
then
|
|
rm -rf ${ext_test_dir:?}/${checkout_ref}_ingest
|
|
echo "== Use $current_checkout_name to ingest extern SST file from $checkout_ref"
|
|
ingest_external_sst $ext_test_dir/${checkout_ref}_ingest $current_ext_test_dir
|
|
compare_db $ext_test_dir/${checkout_ref}_ingest ${current_ext_test_dir}_ingest db_dump.txt 1 1
|
|
fi
|
|
|
|
if member_of_array "$checkout_ref" "${bak_backward_only_refs[@]}" ||
|
|
member_of_array "$checkout_ref" "${bak_forward_refs[@]}"
|
|
then
|
|
echo "== Use $current_checkout_name to restore DB from $checkout_ref"
|
|
rm -rf ${db_test_dir:?}/$checkout_ref
|
|
restore_db $bak_test_dir/$checkout_ref $db_test_dir/$checkout_ref
|
|
compare_db $db_test_dir/$checkout_ref $current_db_test_dir db_dump.txt 1 0
|
|
fi
|
|
done
|
|
|
|
if [ "$SANITY_CHECK" ]; then
|
|
echo "==== check_format_compatible.sh sanity check PASSED ===="
|
|
else
|
|
echo ==== Compatibility Test PASSED ====
|
|
fi
|