Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
5b40c0c074 | ||
|
693d04be1e | ||
|
177c306b80 | ||
|
a34facd1b6 | ||
|
e17067c186 | ||
|
4530535923 | ||
|
d788d9a9eb | ||
|
8a294d6673 | ||
|
dde3cdccde | ||
|
3c3020c61b | ||
|
2d8fa53ffb | ||
|
eb965e1bc3 | ||
|
c726b0fdc1 | ||
|
e15400d1d9 | ||
|
0642d4652d |
4
Makefile
4
Makefile
@ -187,10 +187,6 @@ default: all
|
|||||||
WARNING_FLAGS = -W -Wextra -Wall -Wsign-compare -Wshadow \
|
WARNING_FLAGS = -W -Wextra -Wall -Wsign-compare -Wshadow \
|
||||||
-Wno-unused-parameter
|
-Wno-unused-parameter
|
||||||
|
|
||||||
ifndef DISABLE_WARNING_AS_ERROR
|
|
||||||
WARNING_FLAGS += -Werror
|
|
||||||
endif
|
|
||||||
|
|
||||||
CFLAGS += $(WARNING_FLAGS) -I. -I./include $(PLATFORM_CCFLAGS) $(OPT)
|
CFLAGS += $(WARNING_FLAGS) -I. -I./include $(PLATFORM_CCFLAGS) $(OPT)
|
||||||
CXXFLAGS += $(WARNING_FLAGS) -I. -I./include $(PLATFORM_CXXFLAGS) $(OPT) -Woverloaded-virtual -Wnon-virtual-dtor -Wno-missing-field-initializers
|
CXXFLAGS += $(WARNING_FLAGS) -I. -I./include $(PLATFORM_CXXFLAGS) $(OPT) -Woverloaded-virtual -Wnon-virtual-dtor -Wno-missing-field-initializers
|
||||||
|
|
||||||
|
@ -52,12 +52,7 @@ if [ -z "$ROCKSDB_NO_FBCODE" -a -d /mnt/gvfs/third-party ]; then
|
|||||||
FBCODE_BUILD="true"
|
FBCODE_BUILD="true"
|
||||||
# If we're compiling with TSAN we need pic build
|
# If we're compiling with TSAN we need pic build
|
||||||
PIC_BUILD=$COMPILE_WITH_TSAN
|
PIC_BUILD=$COMPILE_WITH_TSAN
|
||||||
if [ -z "$ROCKSDB_FBCODE_BUILD_WITH_481" ]; then
|
source "$PWD/build_tools/fbcode_config.sh"
|
||||||
source "$PWD/build_tools/fbcode_config.sh"
|
|
||||||
else
|
|
||||||
# we need this to build with MySQL. Don't use for other purposes.
|
|
||||||
source "$PWD/build_tools/fbcode_config4.8.1.sh"
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Delete existing output, if it exists
|
# Delete existing output, if it exists
|
||||||
|
19
build_tools/dependencies.sh
Normal file
19
build_tools/dependencies.sh
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
||||||
|
GCC_BASE=/mnt/gvfs/third-party2/gcc/7331085db891a2ef4a88a48a751d834e8d68f4cb/7.x/centos7-native/b2ef2b6
|
||||||
|
CLANG_BASE=/mnt/gvfs/third-party2/llvm-fb/963d9aeda70cc4779885b1277484fe7544a04e3e/9.0.0/platform007/9e92d53/
|
||||||
|
LIBGCC_BASE=/mnt/gvfs/third-party2/libgcc/6ace84e956873d53638c738b6f65f3f469cca74c/7.x/platform007/5620abc
|
||||||
|
GLIBC_BASE=/mnt/gvfs/third-party2/glibc/192b0f42d63dcf6210d6ceae387b49af049e6e0c/2.26/platform007/f259413
|
||||||
|
SNAPPY_BASE=/mnt/gvfs/third-party2/snappy/7f9bdaada18f59bc27ec2b0871eb8a6144343aef/1.1.3/platform007/ca4da3d
|
||||||
|
ZLIB_BASE=/mnt/gvfs/third-party2/zlib/2d9f0b9a4274cc21f61272a9e89bdb859bce8f1f/1.2.8/platform007/ca4da3d
|
||||||
|
BZIP2_BASE=/mnt/gvfs/third-party2/bzip2/dc49a21c5fceec6456a7a28a94dcd16690af1337/1.0.6/platform007/ca4da3d
|
||||||
|
LZ4_BASE=/mnt/gvfs/third-party2/lz4/0f607f8fc442ea7d6b876931b1898bb573d5e5da/1.9.1/platform007/ca4da3d
|
||||||
|
ZSTD_BASE=/mnt/gvfs/third-party2/zstd/ca22bc441a4eb709e9e0b1f9fec9750fed7b31c5/1.4.x/platform007/15a3614
|
||||||
|
GFLAGS_BASE=/mnt/gvfs/third-party2/gflags/0b9929d2588991c65a57168bf88aff2db87c5d48/2.2.0/platform007/ca4da3d
|
||||||
|
JEMALLOC_BASE=/mnt/gvfs/third-party2/jemalloc/c26f08f47ac35fc31da2633b7da92d6b863246eb/master/platform007/c26c002
|
||||||
|
NUMA_BASE=/mnt/gvfs/third-party2/numa/3f3fb57a5ccc5fd21c66416c0b83e0aa76a05376/2.0.11/platform007/ca4da3d
|
||||||
|
LIBUNWIND_BASE=/mnt/gvfs/third-party2/libunwind/40c73d874898b386a71847f1b99115d93822d11f/1.4/platform007/6f3e0a9
|
||||||
|
TBB_BASE=/mnt/gvfs/third-party2/tbb/4ce8e8dba77cdbd81b75d6f0c32fd7a1b76a11ec/2018_U5/platform007/ca4da3d
|
||||||
|
KERNEL_HEADERS_BASE=/mnt/gvfs/third-party2/kernel-headers/fb251ecd2f5ae16f8671f7014c246e52a748fe0b/fb/platform007/da39a3e
|
||||||
|
BINUTILS_BASE=/mnt/gvfs/third-party2/binutils/ab9f09bba370e7066cafd4eb59752db93f2e8312/2.29.1/platform007/15a3614
|
||||||
|
VALGRIND_BASE=/mnt/gvfs/third-party2/valgrind/d42d152a15636529b0861ec493927200ebebca8e/3.15.0/platform007/ca4da3d
|
||||||
|
LUA_BASE=/mnt/gvfs/third-party2/lua/f0cd714433206d5139df61659eb7b28b1dea6683/5.3.4/platform007/5007832
|
@ -6,128 +6,147 @@
|
|||||||
# Environment variables that change the behavior of this script:
|
# Environment variables that change the behavior of this script:
|
||||||
# PIC_BUILD -- if true, it will only take pic versions of libraries from fbcode. libraries that don't have pic variant will not be included
|
# PIC_BUILD -- if true, it will only take pic versions of libraries from fbcode. libraries that don't have pic variant will not be included
|
||||||
|
|
||||||
|
|
||||||
|
BASEDIR=`dirname $BASH_SOURCE`
|
||||||
|
source "$BASEDIR/dependencies.sh"
|
||||||
|
|
||||||
CFLAGS=""
|
CFLAGS=""
|
||||||
|
|
||||||
# location of libgcc
|
# libgcc
|
||||||
LIBGCC_BASE="/mnt/gvfs/third-party2/libgcc/0473c80518a10d6efcbe24c5eeca3fb4ec9b519c/4.9.x/gcc-4.9-glibc-2.20/e1a7e4e"
|
LIBGCC_INCLUDE="$LIBGCC_BASE/include/c++/7.3.0"
|
||||||
LIBGCC_INCLUDE="$LIBGCC_BASE/include"
|
LIBGCC_LIBS=" -L $LIBGCC_BASE/lib"
|
||||||
LIBGCC_LIBS=" -L $LIBGCC_BASE/libs"
|
|
||||||
|
|
||||||
# location of glibc
|
# glibc
|
||||||
GLIBC_REV=7397bed99280af5d9543439cdb7d018af7542720
|
GLIBC_INCLUDE="$GLIBC_BASE/include"
|
||||||
GLIBC_INCLUDE="/mnt/gvfs/third-party2/glibc/$GLIBC_REV/2.20/gcc-4.9-glibc-2.20/99df8fc/include"
|
GLIBC_LIBS=" -L $GLIBC_BASE/lib"
|
||||||
GLIBC_LIBS=" -L /mnt/gvfs/third-party2/glibc/$GLIBC_REV/2.20/gcc-4.9-glibc-2.20/99df8fc/lib"
|
|
||||||
|
|
||||||
SNAPPY_INCLUDE=" -I /mnt/gvfs/third-party2/snappy/b0f269b3ca47770121aa159b99e1d8d2ab260e1f/1.0.3/gcc-4.9-glibc-2.20/c32916f/include/"
|
|
||||||
|
|
||||||
|
# snappy
|
||||||
|
SNAPPY_INCLUDE=" -I $SNAPPY_BASE/include/"
|
||||||
if test -z $PIC_BUILD; then
|
if test -z $PIC_BUILD; then
|
||||||
SNAPPY_LIBS=" /mnt/gvfs/third-party2/snappy/b0f269b3ca47770121aa159b99e1d8d2ab260e1f/1.0.3/gcc-4.9-glibc-2.20/c32916f/lib/libsnappy.a"
|
SNAPPY_LIBS=" $SNAPPY_BASE/lib/libsnappy.a"
|
||||||
else
|
else
|
||||||
SNAPPY_LIBS=" /mnt/gvfs/third-party2/snappy/b0f269b3ca47770121aa159b99e1d8d2ab260e1f/1.0.3/gcc-4.9-glibc-2.20/c32916f/lib/libsnappy_pic.a"
|
SNAPPY_LIBS=" $SNAPPY_BASE/lib/libsnappy_pic.a"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
CFLAGS+=" -DSNAPPY"
|
CFLAGS+=" -DSNAPPY"
|
||||||
|
|
||||||
if test -z $PIC_BUILD; then
|
if test -z $PIC_BUILD; then
|
||||||
# location of zlib headers and libraries
|
# location of zlib headers and libraries
|
||||||
ZLIB_INCLUDE=" -I /mnt/gvfs/third-party2/zlib/feb983d9667f4cf5e9da07ce75abc824764b67a1/1.2.8/gcc-4.9-glibc-2.20/4230243/include/"
|
ZLIB_INCLUDE=" -I $ZLIB_BASE/include/"
|
||||||
ZLIB_LIBS=" /mnt/gvfs/third-party2/zlib/feb983d9667f4cf5e9da07ce75abc824764b67a1/1.2.8/gcc-4.9-glibc-2.20/4230243/lib/libz.a"
|
ZLIB_LIBS=" $ZLIB_BASE/lib/libz.a"
|
||||||
CFLAGS+=" -DZLIB"
|
CFLAGS+=" -DZLIB"
|
||||||
|
|
||||||
# location of bzip headers and libraries
|
# location of bzip headers and libraries
|
||||||
BZIP_INCLUDE=" -I /mnt/gvfs/third-party2/bzip2/af004cceebb2dfd173ca29933ea5915e727aad2f/1.0.6/gcc-4.9-glibc-2.20/4230243/include/"
|
BZIP_INCLUDE=" -I $BZIP2_BASE/include/"
|
||||||
BZIP_LIBS=" /mnt/gvfs/third-party2/bzip2/af004cceebb2dfd173ca29933ea5915e727aad2f/1.0.6/gcc-4.9-glibc-2.20/4230243/lib/libbz2.a"
|
BZIP_LIBS=" $BZIP2_BASE/lib/libbz2.a"
|
||||||
CFLAGS+=" -DBZIP2"
|
CFLAGS+=" -DBZIP2"
|
||||||
|
|
||||||
LZ4_INCLUDE=" -I /mnt/gvfs/third-party2/lz4/79d2943e2dd7208a3e0b06cf95e9f85f05fe9e1b/r124/gcc-4.9-glibc-2.20/4230243/include/"
|
LZ4_INCLUDE=" -I $LZ4_BASE/include/"
|
||||||
LZ4_LIBS=" /mnt/gvfs/third-party2/lz4/79d2943e2dd7208a3e0b06cf95e9f85f05fe9e1b/r124/gcc-4.9-glibc-2.20/4230243/lib/liblz4.a"
|
LZ4_LIBS=" $LZ4_BASE/lib/liblz4.a"
|
||||||
CFLAGS+=" -DLZ4"
|
CFLAGS+=" -DLZ4"
|
||||||
|
|
||||||
ZSTD_REV=810b81b4705def5243e998b54701f3c504e4009e
|
|
||||||
ZSTD_INCLUDE=" -I /mnt/gvfs/third-party2/zstd/$ZSTD_REV/0.4.2/gcc-4.8.1-glibc-2.17/c3f970a/include"
|
|
||||||
ZSTD_LIBS=" /mnt/gvfs/third-party2/zstd/$ZSTD_REV/0.4.2/gcc-4.8.1-glibc-2.17/c3f970a/lib/libzstd.a"
|
|
||||||
CFLAGS+=" -DZSTD"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
ZSTD_INCLUDE=" -I $ZSTD_BASE/include/"
|
||||||
|
if test -z $PIC_BUILD; then
|
||||||
|
ZSTD_LIBS=" $ZSTD_BASE/lib/libzstd.a"
|
||||||
|
else
|
||||||
|
ZSTD_LIBS=" $ZSTD_BASE/lib/libzstd_pic.a"
|
||||||
|
fi
|
||||||
|
CFLAGS+=" -DZSTD"
|
||||||
|
|
||||||
# location of gflags headers and libraries
|
# location of gflags headers and libraries
|
||||||
GFLAGS_INCLUDE=" -I /mnt/gvfs/third-party2/gflags/0fa60e2b88de3e469db6c482d6e6dac72f5d65f9/1.6/gcc-4.9-glibc-2.20/4230243/include/"
|
GFLAGS_INCLUDE=" -I $GFLAGS_BASE/include/"
|
||||||
if test -z $PIC_BUILD; then
|
if test -z $PIC_BUILD; then
|
||||||
GFLAGS_LIBS=" /mnt/gvfs/third-party2/gflags/0fa60e2b88de3e469db6c482d6e6dac72f5d65f9/1.6/gcc-4.9-glibc-2.20/4230243/lib/libgflags.a"
|
GFLAGS_LIBS=" $GFLAGS_BASE/lib/libgflags.a"
|
||||||
else
|
else
|
||||||
GFLAGS_LIBS=" /mnt/gvfs/third-party2/gflags/0fa60e2b88de3e469db6c482d6e6dac72f5d65f9/1.6/gcc-4.9-glibc-2.20/4230243/lib/libgflags_pic.a"
|
GFLAGS_LIBS=" $GFLAGS_BASE/lib/libgflags_pic.a"
|
||||||
fi
|
fi
|
||||||
CFLAGS+=" -DGFLAGS=google"
|
CFLAGS+=" -DGFLAGS=gflags"
|
||||||
|
|
||||||
# location of jemalloc
|
# location of jemalloc
|
||||||
JEMALLOC_INCLUDE=" -I /mnt/gvfs/third-party2/jemalloc/bcd68e5e419efa4e61b9486d6854564d6d75a0b5/3.6.0/gcc-4.9-glibc-2.20/2aafc78/include/"
|
JEMALLOC_INCLUDE=" -I $JEMALLOC_BASE/include/"
|
||||||
JEMALLOC_LIB=" /mnt/gvfs/third-party2/jemalloc/bcd68e5e419efa4e61b9486d6854564d6d75a0b5/3.6.0/gcc-4.9-glibc-2.20/2aafc78/lib/libjemalloc.a"
|
JEMALLOC_LIB=" $JEMALLOC_BASE/lib/libjemalloc.a"
|
||||||
|
|
||||||
if test -z $PIC_BUILD; then
|
if test -z $PIC_BUILD; then
|
||||||
# location of numa
|
# location of numa
|
||||||
NUMA_INCLUDE=" -I /mnt/gvfs/third-party2/numa/bbefc39ecbf31d0ca184168eb613ef8d397790ee/2.0.8/gcc-4.9-glibc-2.20/4230243/include/"
|
NUMA_INCLUDE=" -I $NUMA_BASE/include/"
|
||||||
NUMA_LIB=" /mnt/gvfs/third-party2/numa/bbefc39ecbf31d0ca184168eb613ef8d397790ee/2.0.8/gcc-4.9-glibc-2.20/4230243/lib/libnuma.a"
|
NUMA_LIB=" $NUMA_BASE/lib/libnuma.a"
|
||||||
CFLAGS+=" -DNUMA"
|
CFLAGS+=" -DNUMA"
|
||||||
|
|
||||||
# location of libunwind
|
# location of libunwind
|
||||||
LIBUNWIND="/mnt/gvfs/third-party2/libunwind/1de3b75e0afedfe5585b231bbb340ec7a1542335/1.1/gcc-4.9-glibc-2.20/34235e8/lib/libunwind.a"
|
LIBUNWIND="$LIBUNWIND_BASE/lib/libunwind.a"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# location of TBB
|
||||||
|
TBB_INCLUDE=" -isystem $TBB_BASE/include/"
|
||||||
|
if test -z $PIC_BUILD; then
|
||||||
|
TBB_LIBS="$TBB_BASE/lib/libtbb.a"
|
||||||
|
else
|
||||||
|
TBB_LIBS="$TBB_BASE/lib/libtbb_pic.a"
|
||||||
|
fi
|
||||||
|
CFLAGS+=" -DTBB"
|
||||||
|
|
||||||
# use Intel SSE support for checksum calculations
|
# use Intel SSE support for checksum calculations
|
||||||
export USE_SSE=1
|
export USE_SSE=1
|
||||||
|
|
||||||
BINUTILS="/mnt/gvfs/third-party2/binutils/0b6ad0c88ddd903333a48ae8bff134efac468e4a/2.25/centos6-native/da39a3e/bin"
|
BINUTILS="$BINUTILS_BASE/bin"
|
||||||
AR="$BINUTILS/ar"
|
AR="$BINUTILS/ar"
|
||||||
|
|
||||||
DEPS_INCLUDE="$SNAPPY_INCLUDE $ZLIB_INCLUDE $BZIP_INCLUDE $LZ4_INCLUDE $ZSTD_INCLUDE $GFLAGS_INCLUDE $NUMA_INCLUDE"
|
DEPS_INCLUDE="$SNAPPY_INCLUDE $ZLIB_INCLUDE $BZIP_INCLUDE $LZ4_INCLUDE $ZSTD_INCLUDE $GFLAGS_INCLUDE $NUMA_INCLUDE $TBB_INCLUDE"
|
||||||
|
|
||||||
GCC_BASE="/mnt/gvfs/third-party2/gcc/1c67a0b88f64d4d9ced0382d141c76aaa7d62fba/4.9.x/centos6-native/1317bc4"
|
|
||||||
STDLIBS="-L $GCC_BASE/lib64"
|
STDLIBS="-L $GCC_BASE/lib64"
|
||||||
|
|
||||||
CLANG_BASE="/mnt/gvfs/third-party2/clang/d81444dd214df3d2466734de45bb264a0486acc3/dev"
|
CLANG_BIN="$CLANG_BASE/bin"
|
||||||
CLANG_BIN="$CLANG_BASE/centos6-native/af4b1a0/bin"
|
CLANG_LIB="$CLANG_BASE/lib"
|
||||||
|
CLANG_SRC="$CLANG_BASE/../../src"
|
||||||
|
|
||||||
CLANG_ANALYZER="$CLANG_BIN/clang++"
|
CLANG_ANALYZER="$CLANG_BIN/clang++"
|
||||||
CLANG_SCAN_BUILD="$CLANG_BASE/src/clang/tools/scan-build/scan-build"
|
CLANG_SCAN_BUILD="$CLANG_SRC/llvm/tools/clang/tools/scan-build/bin/scan-build"
|
||||||
|
|
||||||
if [ -z "$USE_CLANG" ]; then
|
if [ -z "$USE_CLANG" ]; then
|
||||||
# gcc
|
# gcc
|
||||||
CC="$GCC_BASE/bin/gcc"
|
CC="$GCC_BASE/bin/gcc"
|
||||||
CXX="$GCC_BASE/bin/g++"
|
CXX="$GCC_BASE/bin/g++"
|
||||||
|
|
||||||
CFLAGS+=" -B$BINUTILS/gold"
|
CFLAGS+=" -B$BINUTILS/gold"
|
||||||
CFLAGS+=" -isystem $GLIBC_INCLUDE"
|
|
||||||
CFLAGS+=" -isystem $LIBGCC_INCLUDE"
|
CFLAGS+=" -isystem $LIBGCC_INCLUDE"
|
||||||
|
CFLAGS+=" -isystem $GLIBC_INCLUDE"
|
||||||
|
JEMALLOC=1
|
||||||
else
|
else
|
||||||
# clang
|
# clang
|
||||||
CLANG_INCLUDE="$CLANG_BASE/gcc-4.9-glibc-2.20/74c386f/lib/clang/dev/include/"
|
CLANG_INCLUDE="$CLANG_LIB/clang/stable/include"
|
||||||
CC="$CLANG_BIN/clang"
|
CC="$CLANG_BIN/clang"
|
||||||
CXX="$CLANG_BIN/clang++"
|
CXX="$CLANG_BIN/clang++"
|
||||||
|
|
||||||
KERNEL_HEADERS_INCLUDE="/mnt/gvfs/third-party2/kernel-headers/ffd14f660a43c4b92717986b1bba66722ef089d0/3.2.18_70_fbk11_00129_gc8882d0/gcc-4.9-glibc-2.20/da39a3e/include"
|
KERNEL_HEADERS_INCLUDE="$KERNEL_HEADERS_BASE/include"
|
||||||
|
|
||||||
CFLAGS+=" -B$BINUTILS/gold -nostdinc -nostdlib"
|
CFLAGS+=" -B$BINUTILS/gold -nostdinc -nostdlib"
|
||||||
CFLAGS+=" -isystem $LIBGCC_BASE/include/c++/4.9.x "
|
CFLAGS+=" -isystem $LIBGCC_BASE/include/c++/7.x "
|
||||||
CFLAGS+=" -isystem $LIBGCC_BASE/include/c++/4.9.x/x86_64-facebook-linux "
|
CFLAGS+=" -isystem $LIBGCC_BASE/include/c++/7.x/x86_64-facebook-linux "
|
||||||
CFLAGS+=" -isystem $GLIBC_INCLUDE"
|
CFLAGS+=" -isystem $GLIBC_INCLUDE"
|
||||||
CFLAGS+=" -isystem $LIBGCC_INCLUDE"
|
CFLAGS+=" -isystem $LIBGCC_INCLUDE"
|
||||||
CFLAGS+=" -isystem $CLANG_INCLUDE"
|
CFLAGS+=" -isystem $CLANG_INCLUDE"
|
||||||
CFLAGS+=" -isystem $KERNEL_HEADERS_INCLUDE/linux "
|
CFLAGS+=" -isystem $KERNEL_HEADERS_INCLUDE/linux "
|
||||||
CFLAGS+=" -isystem $KERNEL_HEADERS_INCLUDE "
|
CFLAGS+=" -isystem $KERNEL_HEADERS_INCLUDE "
|
||||||
|
CFLAGS+=" -Wno-expansion-to-defined "
|
||||||
CXXFLAGS="-nostdinc++"
|
CXXFLAGS="-nostdinc++"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
CFLAGS+=" $DEPS_INCLUDE"
|
CFLAGS+=" $DEPS_INCLUDE"
|
||||||
CFLAGS+=" -DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX -DROCKSDB_FALLOCATE_PRESENT -DROCKSDB_MALLOC_USABLE_SIZE"
|
CFLAGS+=" -DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX -DROCKSDB_FALLOCATE_PRESENT -DROCKSDB_MALLOC_USABLE_SIZE -DROCKSDB_RANGESYNC_PRESENT -DROCKSDB_SCHED_GETCPU_PRESENT -DROCKSDB_SUPPORT_THREAD_LOCAL -DHAVE_SSE42"
|
||||||
CXXFLAGS+=" $CFLAGS"
|
CXXFLAGS+=" $CFLAGS"
|
||||||
|
|
||||||
EXEC_LDFLAGS=" $SNAPPY_LIBS $ZLIB_LIBS $BZIP_LIBS $LZ4_LIBS $ZSTD_LIBS $GFLAGS_LIBS $NUMA_LIB"
|
EXEC_LDFLAGS=" $SNAPPY_LIBS $ZLIB_LIBS $BZIP_LIBS $LZ4_LIBS $ZSTD_LIBS $GFLAGS_LIBS $NUMA_LIB $TBB_LIBS"
|
||||||
EXEC_LDFLAGS+=" -Wl,--dynamic-linker,/usr/local/fbcode/gcc-4.9-glibc-2.20/lib/ld.so"
|
EXEC_LDFLAGS+=" -B$BINUTILS/gold"
|
||||||
|
EXEC_LDFLAGS+=" -Wl,--dynamic-linker,/usr/local/fbcode/platform007/lib/ld.so"
|
||||||
EXEC_LDFLAGS+=" $LIBUNWIND"
|
EXEC_LDFLAGS+=" $LIBUNWIND"
|
||||||
EXEC_LDFLAGS+=" -Wl,-rpath=/usr/local/fbcode/gcc-4.9-glibc-2.20/lib"
|
EXEC_LDFLAGS+=" -Wl,-rpath=/usr/local/fbcode/platform007/lib"
|
||||||
|
# required by libtbb
|
||||||
|
EXEC_LDFLAGS+=" -ldl"
|
||||||
|
|
||||||
PLATFORM_LDFLAGS="$LIBGCC_LIBS $GLIBC_LIBS $STDLIBS -lgcc -lstdc++"
|
PLATFORM_LDFLAGS="$LIBGCC_LIBS $GLIBC_LIBS $STDLIBS -lgcc -lstdc++"
|
||||||
|
|
||||||
EXEC_LDFLAGS_SHARED="$SNAPPY_LIBS $ZLIB_LIBS $BZIP_LIBS $LZ4_LIBS $ZSTD_LIBS $GFLAGS_LIBS"
|
EXEC_LDFLAGS_SHARED="$SNAPPY_LIBS $ZLIB_LIBS $BZIP_LIBS $LZ4_LIBS $ZSTD_LIBS $GFLAGS_LIBS $TBB_LIBS"
|
||||||
|
|
||||||
VALGRIND_VER="/mnt/gvfs/third-party2/valgrind/6c45ef049cbf11c2df593addb712cd891049e737/3.10.0/gcc-4.9-glibc-2.20/4230243/bin/"
|
VALGRIND_VER="$VALGRIND_BASE/bin/"
|
||||||
|
|
||||||
export CC CXX AR CFLAGS CXXFLAGS EXEC_LDFLAGS EXEC_LDFLAGS_SHARED VALGRIND_VER JEMALLOC_LIB JEMALLOC_INCLUDE CLANG_ANALYZER CLANG_SCAN_BUILD
|
export CC CXX AR CFLAGS CXXFLAGS EXEC_LDFLAGS EXEC_LDFLAGS_SHARED VALGRIND_VER JEMALLOC_LIB JEMALLOC_INCLUDE CLANG_ANALYZER CLANG_SCAN_BUILD
|
||||||
|
@ -96,8 +96,7 @@ Status BuildTable(
|
|||||||
snapshots.empty() ? 0 : snapshots.back());
|
snapshots.empty() ? 0 : snapshots.back());
|
||||||
|
|
||||||
CompactionIterator c_iter(iter, internal_comparator.user_comparator(),
|
CompactionIterator c_iter(iter, internal_comparator.user_comparator(),
|
||||||
&merge, kMaxSequenceNumber, &snapshots,
|
&merge, kMaxSequenceNumber, &snapshots, env,
|
||||||
kMaxSequenceNumber, env,
|
|
||||||
true /* internal key corruption is not ok */);
|
true /* internal key corruption is not ok */);
|
||||||
c_iter.SeekToFirst();
|
c_iter.SeekToFirst();
|
||||||
for (; c_iter.Valid(); c_iter.Next()) {
|
for (; c_iter.Valid(); c_iter.Next()) {
|
||||||
|
@ -1270,13 +1270,15 @@ const int kMainThreadStartPersistingOptionsFile = 1;
|
|||||||
const int kChildThreadFinishDroppingColumnFamily = 2;
|
const int kChildThreadFinishDroppingColumnFamily = 2;
|
||||||
const int kChildThreadWaitingMainThreadPersistOptions = 3;
|
const int kChildThreadWaitingMainThreadPersistOptions = 3;
|
||||||
void DropSingleColumnFamily(ColumnFamilyTest* cf_test, int cf_id,
|
void DropSingleColumnFamily(ColumnFamilyTest* cf_test, int cf_id,
|
||||||
std::vector<Comparator*> comparators) {
|
std::vector<Comparator*>* comparators) {
|
||||||
while (test_stage < kMainThreadStartPersistingOptionsFile) {
|
while (test_stage < kMainThreadStartPersistingOptionsFile) {
|
||||||
Env::Default()->SleepForMicroseconds(100);
|
Env::Default()->SleepForMicroseconds(100);
|
||||||
}
|
}
|
||||||
cf_test->DropColumnFamilies({cf_id});
|
cf_test->DropColumnFamilies({cf_id});
|
||||||
delete comparators[cf_id];
|
if ((*comparators)[cf_id]) {
|
||||||
comparators[cf_id] = nullptr;
|
delete (*comparators)[cf_id];
|
||||||
|
(*comparators)[cf_id] = nullptr;
|
||||||
|
}
|
||||||
test_stage = kChildThreadFinishDroppingColumnFamily;
|
test_stage = kChildThreadFinishDroppingColumnFamily;
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
@ -1328,15 +1330,19 @@ TEST_F(ColumnFamilyTest, CreateAndDropRace) {
|
|||||||
|
|
||||||
// Start a thread that will drop the first column family
|
// Start a thread that will drop the first column family
|
||||||
// and its comparator
|
// and its comparator
|
||||||
std::thread drop_cf_thread(DropSingleColumnFamily, this, 1, comparators);
|
std::thread drop_cf_thread(DropSingleColumnFamily, this, 1, &comparators);
|
||||||
|
|
||||||
DropColumnFamilies({2});
|
DropColumnFamilies({2});
|
||||||
|
|
||||||
drop_cf_thread.join();
|
drop_cf_thread.join();
|
||||||
|
|
||||||
Close();
|
Close();
|
||||||
Destroy();
|
Destroy();
|
||||||
rocksdb::SyncPoint::GetInstance()->DisableProcessing();
|
rocksdb::SyncPoint::GetInstance()->DisableProcessing();
|
||||||
|
for (auto* comparator : comparators) {
|
||||||
|
if (comparator) {
|
||||||
|
delete comparator;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif // !ROCKSDB_LITE
|
#endif // !ROCKSDB_LITE
|
||||||
|
|
||||||
|
@ -13,14 +13,12 @@ namespace rocksdb {
|
|||||||
CompactionIterator::CompactionIterator(
|
CompactionIterator::CompactionIterator(
|
||||||
InternalIterator* input, const Comparator* cmp, MergeHelper* merge_helper,
|
InternalIterator* input, const Comparator* cmp, MergeHelper* merge_helper,
|
||||||
SequenceNumber last_sequence, std::vector<SequenceNumber>* snapshots,
|
SequenceNumber last_sequence, std::vector<SequenceNumber>* snapshots,
|
||||||
SequenceNumber earliest_write_conflict_snapshot, Env* env,
|
Env* env, bool expect_valid_internal_key, Compaction* compaction,
|
||||||
bool expect_valid_internal_key, Compaction* compaction,
|
|
||||||
const CompactionFilter* compaction_filter, LogBuffer* log_buffer)
|
const CompactionFilter* compaction_filter, LogBuffer* log_buffer)
|
||||||
: input_(input),
|
: input_(input),
|
||||||
cmp_(cmp),
|
cmp_(cmp),
|
||||||
merge_helper_(merge_helper),
|
merge_helper_(merge_helper),
|
||||||
snapshots_(snapshots),
|
snapshots_(snapshots),
|
||||||
earliest_write_conflict_snapshot_(earliest_write_conflict_snapshot),
|
|
||||||
env_(env),
|
env_(env),
|
||||||
expect_valid_internal_key_(expect_valid_internal_key),
|
expect_valid_internal_key_(expect_valid_internal_key),
|
||||||
compaction_(compaction),
|
compaction_(compaction),
|
||||||
@ -202,11 +200,6 @@ void CompactionIterator::NextFromInput() {
|
|||||||
ParsedInternalKey next_ikey;
|
ParsedInternalKey next_ikey;
|
||||||
input_->Next();
|
input_->Next();
|
||||||
|
|
||||||
if (earliest_write_conflict_snapshot_) {
|
|
||||||
// TODO(agiardullo): to be used in D50295
|
|
||||||
// adding this if statement to keep CLANG happy in the meantime
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check whether the current key is valid, not corrupt and the same
|
// Check whether the current key is valid, not corrupt and the same
|
||||||
// as the single delete.
|
// as the single delete.
|
||||||
if (input_->Valid() && ParseInternalKey(input_->key(), &next_ikey) &&
|
if (input_->Valid() && ParseInternalKey(input_->key(), &next_ikey) &&
|
||||||
|
@ -39,8 +39,7 @@ class CompactionIterator {
|
|||||||
public:
|
public:
|
||||||
CompactionIterator(InternalIterator* input, const Comparator* cmp,
|
CompactionIterator(InternalIterator* input, const Comparator* cmp,
|
||||||
MergeHelper* merge_helper, SequenceNumber last_sequence,
|
MergeHelper* merge_helper, SequenceNumber last_sequence,
|
||||||
std::vector<SequenceNumber>* snapshots,
|
std::vector<SequenceNumber>* snapshots, Env* env,
|
||||||
SequenceNumber earliest_write_conflict_snapshot, Env* env,
|
|
||||||
bool expect_valid_internal_key,
|
bool expect_valid_internal_key,
|
||||||
Compaction* compaction = nullptr,
|
Compaction* compaction = nullptr,
|
||||||
const CompactionFilter* compaction_filter = nullptr,
|
const CompactionFilter* compaction_filter = nullptr,
|
||||||
@ -89,7 +88,6 @@ class CompactionIterator {
|
|||||||
const Comparator* cmp_;
|
const Comparator* cmp_;
|
||||||
MergeHelper* merge_helper_;
|
MergeHelper* merge_helper_;
|
||||||
const std::vector<SequenceNumber>* snapshots_;
|
const std::vector<SequenceNumber>* snapshots_;
|
||||||
const SequenceNumber earliest_write_conflict_snapshot_;
|
|
||||||
Env* env_;
|
Env* env_;
|
||||||
bool expect_valid_internal_key_;
|
bool expect_valid_internal_key_;
|
||||||
Compaction* compaction_;
|
Compaction* compaction_;
|
||||||
|
@ -20,9 +20,9 @@ class CompactionIteratorTest : public testing::Test {
|
|||||||
nullptr, 0U, false, 0));
|
nullptr, 0U, false, 0));
|
||||||
iter_.reset(new test::VectorIterator(ks, vs));
|
iter_.reset(new test::VectorIterator(ks, vs));
|
||||||
iter_->SeekToFirst();
|
iter_->SeekToFirst();
|
||||||
c_iter_.reset(new CompactionIterator(
|
c_iter_.reset(new CompactionIterator(iter_.get(), cmp_, merge_helper_.get(),
|
||||||
iter_.get(), cmp_, merge_helper_.get(), last_sequence, &snapshots_,
|
last_sequence, &snapshots_,
|
||||||
kMaxSequenceNumber, Env::Default(), false));
|
Env::Default(), false));
|
||||||
}
|
}
|
||||||
|
|
||||||
const Comparator* cmp_;
|
const Comparator* cmp_;
|
||||||
|
@ -212,7 +212,6 @@ CompactionJob::CompactionJob(
|
|||||||
std::atomic<bool>* shutting_down, LogBuffer* log_buffer,
|
std::atomic<bool>* shutting_down, LogBuffer* log_buffer,
|
||||||
Directory* db_directory, Directory* output_directory, Statistics* stats,
|
Directory* db_directory, Directory* output_directory, Statistics* stats,
|
||||||
std::vector<SequenceNumber> existing_snapshots,
|
std::vector<SequenceNumber> existing_snapshots,
|
||||||
SequenceNumber earliest_write_conflict_snapshot,
|
|
||||||
std::shared_ptr<Cache> table_cache, EventLogger* event_logger,
|
std::shared_ptr<Cache> table_cache, EventLogger* event_logger,
|
||||||
bool paranoid_file_checks, bool measure_io_stats, const std::string& dbname,
|
bool paranoid_file_checks, bool measure_io_stats, const std::string& dbname,
|
||||||
CompactionJobStats* compaction_job_stats)
|
CompactionJobStats* compaction_job_stats)
|
||||||
@ -231,7 +230,6 @@ CompactionJob::CompactionJob(
|
|||||||
output_directory_(output_directory),
|
output_directory_(output_directory),
|
||||||
stats_(stats),
|
stats_(stats),
|
||||||
existing_snapshots_(std::move(existing_snapshots)),
|
existing_snapshots_(std::move(existing_snapshots)),
|
||||||
earliest_write_conflict_snapshot_(earliest_write_conflict_snapshot),
|
|
||||||
table_cache_(std::move(table_cache)),
|
table_cache_(std::move(table_cache)),
|
||||||
event_logger_(event_logger),
|
event_logger_(event_logger),
|
||||||
paranoid_file_checks_(paranoid_file_checks),
|
paranoid_file_checks_(paranoid_file_checks),
|
||||||
@ -640,8 +638,8 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
|
|||||||
Status status;
|
Status status;
|
||||||
sub_compact->c_iter.reset(new CompactionIterator(
|
sub_compact->c_iter.reset(new CompactionIterator(
|
||||||
input.get(), cfd->user_comparator(), &merge, versions_->LastSequence(),
|
input.get(), cfd->user_comparator(), &merge, versions_->LastSequence(),
|
||||||
&existing_snapshots_, earliest_write_conflict_snapshot_, env_, false,
|
&existing_snapshots_, env_, false, sub_compact->compaction,
|
||||||
sub_compact->compaction, compaction_filter));
|
compaction_filter));
|
||||||
auto c_iter = sub_compact->c_iter.get();
|
auto c_iter = sub_compact->c_iter.get();
|
||||||
c_iter->SeekToFirst();
|
c_iter->SeekToFirst();
|
||||||
const auto& c_iter_stats = c_iter->iter_stats();
|
const auto& c_iter_stats = c_iter->iter_stats();
|
||||||
|
@ -58,7 +58,6 @@ class CompactionJob {
|
|||||||
Directory* db_directory, Directory* output_directory,
|
Directory* db_directory, Directory* output_directory,
|
||||||
Statistics* stats,
|
Statistics* stats,
|
||||||
std::vector<SequenceNumber> existing_snapshots,
|
std::vector<SequenceNumber> existing_snapshots,
|
||||||
SequenceNumber earliest_write_conflict_snapshot,
|
|
||||||
std::shared_ptr<Cache> table_cache, EventLogger* event_logger,
|
std::shared_ptr<Cache> table_cache, EventLogger* event_logger,
|
||||||
bool paranoid_file_checks, bool measure_io_stats,
|
bool paranoid_file_checks, bool measure_io_stats,
|
||||||
const std::string& dbname,
|
const std::string& dbname,
|
||||||
@ -135,12 +134,6 @@ class CompactionJob {
|
|||||||
// entirely within s1 and s2, then the earlier version of k1 can be safely
|
// entirely within s1 and s2, then the earlier version of k1 can be safely
|
||||||
// deleted because that version is not visible in any snapshot.
|
// deleted because that version is not visible in any snapshot.
|
||||||
std::vector<SequenceNumber> existing_snapshots_;
|
std::vector<SequenceNumber> existing_snapshots_;
|
||||||
|
|
||||||
// This is the earliest snapshot that could be used for write-conflict
|
|
||||||
// checking by a transaction. For any user-key newer than this snapshot, we
|
|
||||||
// should make sure not to remove evidence that a write occured.
|
|
||||||
SequenceNumber earliest_write_conflict_snapshot_;
|
|
||||||
|
|
||||||
std::shared_ptr<Cache> table_cache_;
|
std::shared_ptr<Cache> table_cache_;
|
||||||
|
|
||||||
EventLogger* event_logger_;
|
EventLogger* event_logger_;
|
||||||
|
@ -243,11 +243,11 @@ class CompactionJobTest : public testing::Test {
|
|||||||
LogBuffer log_buffer(InfoLogLevel::INFO_LEVEL, db_options_.info_log.get());
|
LogBuffer log_buffer(InfoLogLevel::INFO_LEVEL, db_options_.info_log.get());
|
||||||
mutex_.Lock();
|
mutex_.Lock();
|
||||||
EventLogger event_logger(db_options_.info_log.get());
|
EventLogger event_logger(db_options_.info_log.get());
|
||||||
CompactionJob compaction_job(
|
CompactionJob compaction_job(0, &compaction, db_options_, env_options_,
|
||||||
0, &compaction, db_options_, env_options_, versions_.get(),
|
versions_.get(), &shutting_down_, &log_buffer,
|
||||||
&shutting_down_, &log_buffer, nullptr, nullptr, nullptr, snapshots,
|
nullptr, nullptr, nullptr, snapshots,
|
||||||
kMaxSequenceNumber, table_cache_, &event_logger, false, false, dbname_,
|
table_cache_, &event_logger, false, false,
|
||||||
&compaction_job_stats_);
|
dbname_, &compaction_job_stats_);
|
||||||
|
|
||||||
VerifyInitializationOfCompactionJobStats(compaction_job_stats_);
|
VerifyInitializationOfCompactionJobStats(compaction_job_stats_);
|
||||||
|
|
||||||
|
@ -1779,16 +1779,12 @@ Status DBImpl::CompactFilesImpl(
|
|||||||
// deletion compaction currently not allowed in CompactFiles.
|
// deletion compaction currently not allowed in CompactFiles.
|
||||||
assert(!c->deletion_compaction());
|
assert(!c->deletion_compaction());
|
||||||
|
|
||||||
SequenceNumber earliest_write_conflict_snapshot;
|
|
||||||
std::vector<SequenceNumber> snapshot_seqs =
|
|
||||||
snapshots_.GetAll(&earliest_write_conflict_snapshot);
|
|
||||||
|
|
||||||
assert(is_snapshot_supported_ || snapshots_.empty());
|
assert(is_snapshot_supported_ || snapshots_.empty());
|
||||||
CompactionJob compaction_job(
|
CompactionJob compaction_job(
|
||||||
job_context->job_id, c.get(), db_options_, env_options_, versions_.get(),
|
job_context->job_id, c.get(), db_options_, env_options_, versions_.get(),
|
||||||
&shutting_down_, log_buffer, directories_.GetDbDir(),
|
&shutting_down_, log_buffer, directories_.GetDbDir(),
|
||||||
directories_.GetDataDir(c->output_path_id()), stats_, snapshot_seqs,
|
directories_.GetDataDir(c->output_path_id()), stats_, snapshots_.GetAll(),
|
||||||
earliest_write_conflict_snapshot, table_cache_, &event_logger_,
|
table_cache_, &event_logger_,
|
||||||
c->mutable_cf_options()->paranoid_file_checks,
|
c->mutable_cf_options()->paranoid_file_checks,
|
||||||
c->mutable_cf_options()->compaction_measure_io_stats, dbname_,
|
c->mutable_cf_options()->compaction_measure_io_stats, dbname_,
|
||||||
nullptr); // Here we pass a nullptr for CompactionJobStats because
|
nullptr); // Here we pass a nullptr for CompactionJobStats because
|
||||||
@ -2879,17 +2875,12 @@ Status DBImpl::BackgroundCompaction(bool* made_progress,
|
|||||||
int output_level __attribute__((unused)) = c->output_level();
|
int output_level __attribute__((unused)) = c->output_level();
|
||||||
TEST_SYNC_POINT_CALLBACK("DBImpl::BackgroundCompaction:NonTrivial",
|
TEST_SYNC_POINT_CALLBACK("DBImpl::BackgroundCompaction:NonTrivial",
|
||||||
&output_level);
|
&output_level);
|
||||||
|
|
||||||
SequenceNumber earliest_write_conflict_snapshot;
|
|
||||||
std::vector<SequenceNumber> snapshot_seqs =
|
|
||||||
snapshots_.GetAll(&earliest_write_conflict_snapshot);
|
|
||||||
|
|
||||||
assert(is_snapshot_supported_ || snapshots_.empty());
|
assert(is_snapshot_supported_ || snapshots_.empty());
|
||||||
CompactionJob compaction_job(
|
CompactionJob compaction_job(
|
||||||
job_context->job_id, c.get(), db_options_, env_options_,
|
job_context->job_id, c.get(), db_options_, env_options_,
|
||||||
versions_.get(), &shutting_down_, log_buffer, directories_.GetDbDir(),
|
versions_.get(), &shutting_down_, log_buffer, directories_.GetDbDir(),
|
||||||
directories_.GetDataDir(c->output_path_id()), stats_, snapshot_seqs,
|
directories_.GetDataDir(c->output_path_id()), stats_,
|
||||||
earliest_write_conflict_snapshot, table_cache_, &event_logger_,
|
snapshots_.GetAll(), table_cache_, &event_logger_,
|
||||||
c->mutable_cf_options()->paranoid_file_checks,
|
c->mutable_cf_options()->paranoid_file_checks,
|
||||||
c->mutable_cf_options()->compaction_measure_io_stats, dbname_,
|
c->mutable_cf_options()->compaction_measure_io_stats, dbname_,
|
||||||
&compaction_job_stats);
|
&compaction_job_stats);
|
||||||
@ -3811,13 +3802,7 @@ Status DBImpl::NewIterators(
|
|||||||
return Status::OK();
|
return Status::OK();
|
||||||
}
|
}
|
||||||
|
|
||||||
const Snapshot* DBImpl::GetSnapshot() { return GetSnapshotImpl(false); }
|
const Snapshot* DBImpl::GetSnapshot() {
|
||||||
|
|
||||||
const Snapshot* DBImpl::GetSnapshotForWriteConflictBoundary() {
|
|
||||||
return GetSnapshotImpl(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
const Snapshot* DBImpl::GetSnapshotImpl(bool is_write_conflict_boundary) {
|
|
||||||
int64_t unix_time = 0;
|
int64_t unix_time = 0;
|
||||||
env_->GetCurrentTime(&unix_time); // Ignore error
|
env_->GetCurrentTime(&unix_time); // Ignore error
|
||||||
SnapshotImpl* s = new SnapshotImpl;
|
SnapshotImpl* s = new SnapshotImpl;
|
||||||
@ -3828,8 +3813,7 @@ const Snapshot* DBImpl::GetSnapshotImpl(bool is_write_conflict_boundary) {
|
|||||||
delete s;
|
delete s;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
return snapshots_.New(s, versions_->LastSequence(), unix_time,
|
return snapshots_.New(s, versions_->LastSequence(), unix_time);
|
||||||
is_write_conflict_boundary);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DBImpl::ReleaseSnapshot(const Snapshot* s) {
|
void DBImpl::ReleaseSnapshot(const Snapshot* s) {
|
||||||
|
@ -243,12 +243,6 @@ class DBImpl : public DB {
|
|||||||
|
|
||||||
#endif // ROCKSDB_LITE
|
#endif // ROCKSDB_LITE
|
||||||
|
|
||||||
// Similar to GetSnapshot(), but also lets the db know that this snapshot
|
|
||||||
// will be used for transaction write-conflict checking. The DB can then
|
|
||||||
// make sure not to compact any keys that would prevent a write-conflict from
|
|
||||||
// being detected.
|
|
||||||
const Snapshot* GetSnapshotForWriteConflictBoundary();
|
|
||||||
|
|
||||||
// checks if all live files exist on file system and that their file sizes
|
// checks if all live files exist on file system and that their file sizes
|
||||||
// match to our in-memory records
|
// match to our in-memory records
|
||||||
virtual Status CheckConsistency();
|
virtual Status CheckConsistency();
|
||||||
@ -570,8 +564,6 @@ class DBImpl : public DB {
|
|||||||
// helper function to call after some of the logs_ were synced
|
// helper function to call after some of the logs_ were synced
|
||||||
void MarkLogsSynced(uint64_t up_to, bool synced_dir, const Status& status);
|
void MarkLogsSynced(uint64_t up_to, bool synced_dir, const Status& status);
|
||||||
|
|
||||||
const Snapshot* GetSnapshotImpl(bool is_write_conflict_boundary);
|
|
||||||
|
|
||||||
// table_cache_ provides its own synchronization
|
// table_cache_ provides its own synchronization
|
||||||
std::shared_ptr<Cache> table_cache_;
|
std::shared_ptr<Cache> table_cache_;
|
||||||
|
|
||||||
|
@ -10534,6 +10534,86 @@ TEST_F(DBTest, WalFilterTestWithChangeBatchExtraKeys) {
|
|||||||
|
|
||||||
#endif // ROCKSDB_LITE
|
#endif // ROCKSDB_LITE
|
||||||
|
|
||||||
|
class SliceTransformLimitedDomain : public SliceTransform {
|
||||||
|
const char* Name() const override { return "SliceTransformLimitedDomain"; }
|
||||||
|
|
||||||
|
Slice Transform(const Slice& src) const override {
|
||||||
|
return Slice(src.data(), 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InDomain(const Slice& src) const override {
|
||||||
|
// prefix will be x????
|
||||||
|
return src.size() >= 5 && src[0] == 'x';
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InRange(const Slice& dst) const override {
|
||||||
|
// prefix will be x????
|
||||||
|
return dst.size() == 5 && dst[0] == 'x';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(DBTest, PrefixExtractorFullFilter) {
|
||||||
|
BlockBasedTableOptions bbto;
|
||||||
|
// Full Filter Block
|
||||||
|
bbto.filter_policy.reset(rocksdb::NewBloomFilterPolicy(10, false));
|
||||||
|
bbto.whole_key_filtering = false;
|
||||||
|
|
||||||
|
Options options = CurrentOptions();
|
||||||
|
options.prefix_extractor = std::make_shared<SliceTransformLimitedDomain>();
|
||||||
|
options.table_factory.reset(NewBlockBasedTableFactory(bbto));
|
||||||
|
|
||||||
|
DestroyAndReopen(options);
|
||||||
|
|
||||||
|
ASSERT_OK(Put("x1111_AAAA", "val1"));
|
||||||
|
ASSERT_OK(Put("x1112_AAAA", "val2"));
|
||||||
|
ASSERT_OK(Put("x1113_AAAA", "val3"));
|
||||||
|
ASSERT_OK(Put("x1114_AAAA", "val4"));
|
||||||
|
// Not in domain, wont be added to filter
|
||||||
|
ASSERT_OK(Put("zzzzz_AAAA", "val5"));
|
||||||
|
|
||||||
|
ASSERT_OK(Flush());
|
||||||
|
|
||||||
|
ASSERT_EQ(Get("x1111_AAAA"), "val1");
|
||||||
|
ASSERT_EQ(Get("x1112_AAAA"), "val2");
|
||||||
|
ASSERT_EQ(Get("x1113_AAAA"), "val3");
|
||||||
|
ASSERT_EQ(Get("x1114_AAAA"), "val4");
|
||||||
|
// Was not added to filter but rocksdb will try to read it from the filter
|
||||||
|
ASSERT_EQ(Get("zzzzz_AAAA"), "val5");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(DBTest, PrefixExtractorBlockFilter) {
|
||||||
|
BlockBasedTableOptions bbto;
|
||||||
|
// Block Filter Block
|
||||||
|
bbto.filter_policy.reset(rocksdb::NewBloomFilterPolicy(10, true));
|
||||||
|
|
||||||
|
Options options = CurrentOptions();
|
||||||
|
options.prefix_extractor = std::make_shared<SliceTransformLimitedDomain>();
|
||||||
|
options.table_factory.reset(NewBlockBasedTableFactory(bbto));
|
||||||
|
|
||||||
|
DestroyAndReopen(options);
|
||||||
|
|
||||||
|
ASSERT_OK(Put("x1113_AAAA", "val3"));
|
||||||
|
ASSERT_OK(Put("x1114_AAAA", "val4"));
|
||||||
|
// Not in domain, wont be added to filter
|
||||||
|
ASSERT_OK(Put("zzzzz_AAAA", "val1"));
|
||||||
|
ASSERT_OK(Put("zzzzz_AAAB", "val2"));
|
||||||
|
ASSERT_OK(Put("zzzzz_AAAC", "val3"));
|
||||||
|
ASSERT_OK(Put("zzzzz_AAAD", "val4"));
|
||||||
|
|
||||||
|
ASSERT_OK(Flush());
|
||||||
|
|
||||||
|
std::vector<std::string> iter_res;
|
||||||
|
auto iter = db_->NewIterator(ReadOptions());
|
||||||
|
// Seek to a key that was not in Domain
|
||||||
|
for (iter->Seek("zzzzz_AAAA"); iter->Valid(); iter->Next()) {
|
||||||
|
iter_res.emplace_back(iter->value().ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> expected_res = {"val1", "val2", "val3", "val4"};
|
||||||
|
ASSERT_EQ(iter_res, expected_res);
|
||||||
|
delete iter;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef ROCKSDB_LITE
|
#ifndef ROCKSDB_LITE
|
||||||
class BloomStatsTestWithParam
|
class BloomStatsTestWithParam
|
||||||
: public DBTest,
|
: public DBTest,
|
||||||
|
@ -12,9 +12,6 @@ namespace rocksdb {
|
|||||||
ManagedSnapshot::ManagedSnapshot(DB* db) : db_(db),
|
ManagedSnapshot::ManagedSnapshot(DB* db) : db_(db),
|
||||||
snapshot_(db->GetSnapshot()) {}
|
snapshot_(db->GetSnapshot()) {}
|
||||||
|
|
||||||
ManagedSnapshot::ManagedSnapshot(DB* db, const Snapshot* _snapshot)
|
|
||||||
: db_(db), snapshot_(_snapshot) {}
|
|
||||||
|
|
||||||
ManagedSnapshot::~ManagedSnapshot() {
|
ManagedSnapshot::~ManagedSnapshot() {
|
||||||
if (snapshot_) {
|
if (snapshot_) {
|
||||||
db_->ReleaseSnapshot(snapshot_);
|
db_->ReleaseSnapshot(snapshot_);
|
||||||
|
@ -34,9 +34,6 @@ class SnapshotImpl : public Snapshot {
|
|||||||
SnapshotList* list_; // just for sanity checks
|
SnapshotList* list_; // just for sanity checks
|
||||||
|
|
||||||
int64_t unix_time_;
|
int64_t unix_time_;
|
||||||
|
|
||||||
// Will this snapshot be used by a Transaction to do write-conflict checking?
|
|
||||||
bool is_write_conflict_boundary_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class SnapshotList {
|
class SnapshotList {
|
||||||
@ -53,10 +50,9 @@ class SnapshotList {
|
|||||||
SnapshotImpl* newest() const { assert(!empty()); return list_.prev_; }
|
SnapshotImpl* newest() const { assert(!empty()); return list_.prev_; }
|
||||||
|
|
||||||
const SnapshotImpl* New(SnapshotImpl* s, SequenceNumber seq,
|
const SnapshotImpl* New(SnapshotImpl* s, SequenceNumber seq,
|
||||||
uint64_t unix_time, bool is_write_conflict_boundary) {
|
uint64_t unix_time) {
|
||||||
s->number_ = seq;
|
s->number_ = seq;
|
||||||
s->unix_time_ = unix_time;
|
s->unix_time_ = unix_time;
|
||||||
s->is_write_conflict_boundary_ = is_write_conflict_boundary;
|
|
||||||
s->list_ = this;
|
s->list_ = this;
|
||||||
s->next_ = &list_;
|
s->next_ = &list_;
|
||||||
s->prev_ = list_.prev_;
|
s->prev_ = list_.prev_;
|
||||||
@ -75,29 +71,14 @@ class SnapshotList {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// retrieve all snapshot numbers. They are sorted in ascending order.
|
// retrieve all snapshot numbers. They are sorted in ascending order.
|
||||||
std::vector<SequenceNumber> GetAll(
|
std::vector<SequenceNumber> GetAll() {
|
||||||
SequenceNumber* oldest_write_conflict_snapshot = nullptr) {
|
|
||||||
std::vector<SequenceNumber> ret;
|
std::vector<SequenceNumber> ret;
|
||||||
|
|
||||||
if (oldest_write_conflict_snapshot != nullptr) {
|
|
||||||
*oldest_write_conflict_snapshot = kMaxSequenceNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty()) {
|
if (empty()) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
SnapshotImpl* s = &list_;
|
SnapshotImpl* s = &list_;
|
||||||
while (s->next_ != &list_) {
|
while (s->next_ != &list_) {
|
||||||
ret.push_back(s->next_->number_);
|
ret.push_back(s->next_->number_);
|
||||||
|
|
||||||
if (oldest_write_conflict_snapshot != nullptr &&
|
|
||||||
*oldest_write_conflict_snapshot != kMaxSequenceNumber &&
|
|
||||||
s->next_->is_write_conflict_boundary_) {
|
|
||||||
// If this is the first write-conflict boundary snapshot in the list,
|
|
||||||
// it is the oldest
|
|
||||||
*oldest_write_conflict_snapshot = s->next_->number_;
|
|
||||||
}
|
|
||||||
|
|
||||||
s = s->next_;
|
s = s->next_;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -33,9 +33,6 @@ class ManagedSnapshot {
|
|||||||
public:
|
public:
|
||||||
explicit ManagedSnapshot(DB* db);
|
explicit ManagedSnapshot(DB* db);
|
||||||
|
|
||||||
// Instead of creating a snapshot, take ownership of the input snapshot.
|
|
||||||
ManagedSnapshot(DB* db, const Snapshot* _snapshot);
|
|
||||||
|
|
||||||
~ManagedSnapshot();
|
~ManagedSnapshot();
|
||||||
|
|
||||||
const Snapshot* snapshot();
|
const Snapshot* snapshot();
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#define ROCKSDB_MAJOR 4
|
#define ROCKSDB_MAJOR 4
|
||||||
#define ROCKSDB_MINOR 3
|
#define ROCKSDB_MINOR 3
|
||||||
#define ROCKSDB_PATCH 0
|
#define ROCKSDB_PATCH 1
|
||||||
|
|
||||||
// Do not use these. We made the mistake of declaring macros starting with
|
// Do not use these. We made the mistake of declaring macros starting with
|
||||||
// double underscore. Now we have to live with our choice. We'll deprecate these
|
// double underscore. Now we have to live with our choice. We'll deprecate these
|
||||||
|
@ -1117,9 +1117,12 @@ bool BlockBasedTable::PrefixMayMatch(const Slice& internal_key) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert(rep_->ioptions.prefix_extractor != nullptr);
|
assert(rep_->ioptions.prefix_extractor != nullptr);
|
||||||
auto prefix = rep_->ioptions.prefix_extractor->Transform(
|
auto user_key = ExtractUserKey(internal_key);
|
||||||
ExtractUserKey(internal_key));
|
if (!rep_->ioptions.prefix_extractor->InDomain(user_key)) {
|
||||||
InternalKey internal_key_prefix(prefix, 0, kTypeValue);
|
return true;
|
||||||
|
}
|
||||||
|
auto prefix = rep_->ioptions.prefix_extractor->Transform(user_key);
|
||||||
|
InternalKey internal_key_prefix(prefix, kMaxSequenceNumber, kTypeValue);
|
||||||
auto internal_prefix = internal_key_prefix.Encode();
|
auto internal_prefix = internal_key_prefix.Encode();
|
||||||
|
|
||||||
bool may_match = true;
|
bool may_match = true;
|
||||||
@ -1202,6 +1205,7 @@ bool BlockBasedTable::FullFilterKeyMayMatch(FilterBlockReader* filter,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (rep_->ioptions.prefix_extractor &&
|
if (rep_->ioptions.prefix_extractor &&
|
||||||
|
rep_->ioptions.prefix_extractor->InDomain(user_key) &&
|
||||||
!filter->PrefixMayMatch(
|
!filter->PrefixMayMatch(
|
||||||
rep_->ioptions.prefix_extractor->Transform(user_key))) {
|
rep_->ioptions.prefix_extractor->Transform(user_key))) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -1242,6 +1242,41 @@ TEST_F(BlockBasedTableTest, TotalOrderSeekOnHashIndex) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(BlockBasedTableTest, NoopTransformSeek) {
|
||||||
|
BlockBasedTableOptions table_options;
|
||||||
|
table_options.filter_policy.reset(NewBloomFilterPolicy(10));
|
||||||
|
|
||||||
|
Options options;
|
||||||
|
options.comparator = BytewiseComparator();
|
||||||
|
options.table_factory.reset(new BlockBasedTableFactory(table_options));
|
||||||
|
options.prefix_extractor.reset(NewNoopTransform());
|
||||||
|
|
||||||
|
TableConstructor c(options.comparator);
|
||||||
|
// To tickle the PrefixMayMatch bug it is important that the
|
||||||
|
// user-key is a single byte so that the index key exactly matches
|
||||||
|
// the user-key.
|
||||||
|
InternalKey key("a", 1, kTypeValue);
|
||||||
|
c.Add(key.Encode().ToString(), "b");
|
||||||
|
std::vector<std::string> keys;
|
||||||
|
stl_wrappers::KVMap kvmap;
|
||||||
|
const ImmutableCFOptions ioptions(options);
|
||||||
|
const InternalKeyComparator internal_comparator(options.comparator);
|
||||||
|
c.Finish(options, ioptions, table_options, internal_comparator, &keys,
|
||||||
|
&kvmap);
|
||||||
|
|
||||||
|
auto* reader = c.GetTableReader();
|
||||||
|
for (int i = 0; i < 2; ++i) {
|
||||||
|
ReadOptions ro;
|
||||||
|
ro.total_order_seek = (i == 0);
|
||||||
|
std::unique_ptr<InternalIterator> iter(reader->NewIterator(ro));
|
||||||
|
|
||||||
|
iter->Seek(key.Encode());
|
||||||
|
ASSERT_OK(iter->status());
|
||||||
|
ASSERT_TRUE(iter->Valid());
|
||||||
|
ASSERT_EQ("a", ExtractUserKey(iter->key()).ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static std::string RandomString(Random* rnd, int len) {
|
static std::string RandomString(Random* rnd, int len) {
|
||||||
std::string r;
|
std::string r;
|
||||||
test::RandomString(rnd, len, &r);
|
test::RandomString(rnd, len, &r);
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
|
#include <functional>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
#include "utilities/transactions/transaction_base.h"
|
#include "utilities/transactions/transaction_base.h"
|
||||||
|
|
||||||
#include "db/db_impl.h"
|
|
||||||
#include "db/column_family.h"
|
#include "db/column_family.h"
|
||||||
#include "rocksdb/comparator.h"
|
#include "rocksdb/comparator.h"
|
||||||
#include "rocksdb/db.h"
|
#include "rocksdb/db.h"
|
||||||
@ -36,11 +35,7 @@ void TransactionBaseImpl::Clear() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TransactionBaseImpl::SetSnapshot() {
|
void TransactionBaseImpl::SetSnapshot() {
|
||||||
assert(dynamic_cast<DBImpl*>(db_) != nullptr);
|
snapshot_.reset(new ManagedSnapshot(db_));
|
||||||
auto db_impl = reinterpret_cast<DBImpl*>(db_);
|
|
||||||
|
|
||||||
const Snapshot* snapshot = db_impl->GetSnapshotForWriteConflictBoundary();
|
|
||||||
snapshot_.reset(new ManagedSnapshot(db_, snapshot));
|
|
||||||
snapshot_needed_ = false;
|
snapshot_needed_ = false;
|
||||||
snapshot_notifier_ = nullptr;
|
snapshot_notifier_ = nullptr;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user