Compare commits
17 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
7ec5bac7e0 | ||
|
7225953ea1 | ||
|
66b9400b39 | ||
|
0e74858d53 | ||
|
6e638705fc | ||
|
2c560cae1e | ||
|
c03f2462a8 | ||
|
9de6ee2820 | ||
|
d99227db23 | ||
|
28d3aa3667 | ||
|
79c2075b53 | ||
|
0640c28723 | ||
|
718309432b | ||
|
bc672aefb3 | ||
|
b565228e1e | ||
|
dc3cdfede9 | ||
|
8856b22edd |
@ -1,10 +1,16 @@
|
|||||||
# Rocksdb Change Log
|
# Rocksdb Change Log
|
||||||
|
|
||||||
|
## 3.12.1 (7/16/2015)
|
||||||
|
* Fix data loss after DB recovery by not allowing flush/compaction to be scheduled until DB opened
|
||||||
|
|
||||||
## 3.12.0 (7/2/2015)
|
## 3.12.0 (7/2/2015)
|
||||||
### New Features
|
### New Features
|
||||||
* Added experimental support for optimistic transactions. See include/rocksdb/utilities/optimistic_transaction.h for more info.
|
* Added experimental support for optimistic transactions. See include/rocksdb/utilities/optimistic_transaction.h for more info.
|
||||||
* Added a new way to report QPS from db_bench (check out --report_file and --report_interval_seconds)
|
* Added a new way to report QPS from db_bench (check out --report_file and --report_interval_seconds)
|
||||||
* Added a cache for individual rows. See DBOptions::row_cache for more info.
|
* Added a cache for individual rows. See DBOptions::row_cache for more info.
|
||||||
|
* Several new features on EventListener (see include/rocksdb/listener.h):
|
||||||
|
- OnCompationCompleted() now returns per-compaciton job statistics, defined in include/rocksdb/compaction_job_stats.h.
|
||||||
|
- Added OnTableFileCreated() and OnTableFileDeleted().
|
||||||
|
|
||||||
### Public API changes
|
### Public API changes
|
||||||
* EventListener::OnFlushCompleted() now passes FlushJobInfo instead of a list of parameters.
|
* EventListener::OnFlushCompleted() now passes FlushJobInfo instead of a list of parameters.
|
||||||
|
4
Makefile
4
Makefile
@ -167,10 +167,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
|
||||||
|
|
||||||
|
@ -50,12 +50,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,123 +6,143 @@
|
|||||||
# 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_INCLUDE=" -I $ZSTD_BASE/include/"
|
||||||
|
ZSTD_LIBS=" $ZSTD_BASE/lib/libzstd.a"
|
||||||
|
CFLAGS+=" -DZSTD"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 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 $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_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 $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 $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
|
||||||
|
@ -59,6 +59,7 @@ ColumnFamilyHandleImpl::~ColumnFamilyHandleImpl() {
|
|||||||
if (job_context.HaveSomethingToDelete()) {
|
if (job_context.HaveSomethingToDelete()) {
|
||||||
db_->PurgeObsoleteFiles(job_context);
|
db_->PurgeObsoleteFiles(job_context);
|
||||||
}
|
}
|
||||||
|
job_context.Clean();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,11 +76,10 @@ class CompactionJobTest : public testing::Test {
|
|||||||
largest = internal_key;
|
largest = internal_key;
|
||||||
largest_seqno = sequence_number;
|
largest_seqno = sequence_number;
|
||||||
}
|
}
|
||||||
std::pair<std::string, std::string> key_value(
|
contents.insert({internal_key.Encode().ToString(), value});
|
||||||
{bottommost_internal_key.Encode().ToString(), value});
|
|
||||||
contents.insert(key_value);
|
|
||||||
if (i == 1 || k < kKeysPerFile / 2) {
|
if (i == 1 || k < kKeysPerFile / 2) {
|
||||||
expected_results.insert(key_value);
|
expected_results.insert(
|
||||||
|
{bottommost_internal_key.Encode().ToString(), value});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,7 +96,7 @@ class CompactionJobTest : public testing::Test {
|
|||||||
mutable_cf_options_, &edit, &mutex_);
|
mutable_cf_options_, &edit, &mutex_);
|
||||||
mutex_.Unlock();
|
mutex_.Unlock();
|
||||||
}
|
}
|
||||||
versions_->SetLastSequence(sequence_number);
|
versions_->SetLastSequence(sequence_number + 1);
|
||||||
return expected_results;
|
return expected_results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -527,6 +527,25 @@ void DBImpl::FindObsoleteFiles(JobContext* job_context, bool force,
|
|||||||
versions_->GetObsoleteFiles(&job_context->sst_delete_files,
|
versions_->GetObsoleteFiles(&job_context->sst_delete_files,
|
||||||
job_context->min_pending_output);
|
job_context->min_pending_output);
|
||||||
|
|
||||||
|
uint64_t min_log_number = versions_->MinLogNumber();
|
||||||
|
if (!alive_log_files_.empty()) {
|
||||||
|
// find newly obsoleted log files
|
||||||
|
while (alive_log_files_.begin()->number < min_log_number) {
|
||||||
|
auto& earliest = *alive_log_files_.begin();
|
||||||
|
job_context->log_delete_files.push_back(earliest.number);
|
||||||
|
total_log_size_ -= earliest.size;
|
||||||
|
alive_log_files_.pop_front();
|
||||||
|
// Current log should always stay alive since it can't have
|
||||||
|
// number < MinLogNumber().
|
||||||
|
assert(alive_log_files_.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We're just cleaning up for DB::Write().
|
||||||
|
assert(job_context->logs_to_free.empty());
|
||||||
|
job_context->logs_to_free = logs_to_free_;
|
||||||
|
logs_to_free_.clear();
|
||||||
|
|
||||||
// store the current filenum, lognum, etc
|
// store the current filenum, lognum, etc
|
||||||
job_context->manifest_file_number = versions_->manifest_file_number();
|
job_context->manifest_file_number = versions_->manifest_file_number();
|
||||||
job_context->pending_manifest_file_number =
|
job_context->pending_manifest_file_number =
|
||||||
@ -1309,17 +1328,6 @@ Status DBImpl::FlushMemTableToOutputFile(
|
|||||||
VersionStorageInfo::LevelSummaryStorage tmp;
|
VersionStorageInfo::LevelSummaryStorage tmp;
|
||||||
LogToBuffer(log_buffer, "[%s] Level summary: %s\n", cfd->GetName().c_str(),
|
LogToBuffer(log_buffer, "[%s] Level summary: %s\n", cfd->GetName().c_str(),
|
||||||
cfd->current()->storage_info()->LevelSummary(&tmp));
|
cfd->current()->storage_info()->LevelSummary(&tmp));
|
||||||
|
|
||||||
if (disable_delete_obsolete_files_ == 0) {
|
|
||||||
// add to deletion state
|
|
||||||
while (alive_log_files_.size() &&
|
|
||||||
alive_log_files_.begin()->number < versions_->MinLogNumber()) {
|
|
||||||
const auto& earliest = *alive_log_files_.begin();
|
|
||||||
job_context->log_delete_files.push_back(earliest.number);
|
|
||||||
total_log_size_ -= earliest.size;
|
|
||||||
alive_log_files_.pop_front();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s.ok() && !s.IsShutdownInProgress() && db_options_.paranoid_checks &&
|
if (!s.ok() && !s.IsShutdownInProgress() && db_options_.paranoid_checks &&
|
||||||
@ -2048,6 +2056,10 @@ Status DBImpl::WaitForFlushMemTable(ColumnFamilyData* cfd) {
|
|||||||
|
|
||||||
void DBImpl::MaybeScheduleFlushOrCompaction() {
|
void DBImpl::MaybeScheduleFlushOrCompaction() {
|
||||||
mutex_.AssertHeld();
|
mutex_.AssertHeld();
|
||||||
|
if (!opened_successfully_) {
|
||||||
|
// Compaction may introduce data race to DB open
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (bg_work_gate_closed_) {
|
if (bg_work_gate_closed_) {
|
||||||
// gate closed for background work
|
// gate closed for background work
|
||||||
return;
|
return;
|
||||||
@ -2145,7 +2157,9 @@ void DBImpl::RecordFlushIOStats() {
|
|||||||
|
|
||||||
void DBImpl::BGWorkFlush(void* db) {
|
void DBImpl::BGWorkFlush(void* db) {
|
||||||
IOSTATS_SET_THREAD_POOL_ID(Env::Priority::HIGH);
|
IOSTATS_SET_THREAD_POOL_ID(Env::Priority::HIGH);
|
||||||
|
TEST_SYNC_POINT("DBImpl::BGWorkFlush");
|
||||||
reinterpret_cast<DBImpl*>(db)->BackgroundCallFlush();
|
reinterpret_cast<DBImpl*>(db)->BackgroundCallFlush();
|
||||||
|
TEST_SYNC_POINT("DBImpl::BGWorkFlush:done");
|
||||||
}
|
}
|
||||||
|
|
||||||
void DBImpl::BGWorkCompaction(void* db) {
|
void DBImpl::BGWorkCompaction(void* db) {
|
||||||
@ -2238,10 +2252,6 @@ void DBImpl::BackgroundCallFlush() {
|
|||||||
|
|
||||||
ReleaseFileNumberFromPendingOutputs(pending_outputs_inserted_elem);
|
ReleaseFileNumberFromPendingOutputs(pending_outputs_inserted_elem);
|
||||||
|
|
||||||
// We're just cleaning up for DB::Write()
|
|
||||||
job_context.logs_to_free = logs_to_free_;
|
|
||||||
logs_to_free_.clear();
|
|
||||||
|
|
||||||
// If flush failed, we want to delete all temporary files that we might have
|
// If flush failed, we want to delete all temporary files that we might have
|
||||||
// created. Thus, we force full scan in FindObsoleteFiles()
|
// created. Thus, we force full scan in FindObsoleteFiles()
|
||||||
FindObsoleteFiles(&job_context, !s.ok() && !s.IsShutdownInProgress());
|
FindObsoleteFiles(&job_context, !s.ok() && !s.IsShutdownInProgress());
|
||||||
@ -2308,10 +2318,6 @@ void DBImpl::BackgroundCallCompaction() {
|
|||||||
|
|
||||||
ReleaseFileNumberFromPendingOutputs(pending_outputs_inserted_elem);
|
ReleaseFileNumberFromPendingOutputs(pending_outputs_inserted_elem);
|
||||||
|
|
||||||
// We're just cleaning up for DB::Write()
|
|
||||||
job_context.logs_to_free = logs_to_free_;
|
|
||||||
logs_to_free_.clear();
|
|
||||||
|
|
||||||
// If compaction failed, we want to delete all temporary files that we might
|
// If compaction failed, we want to delete all temporary files that we might
|
||||||
// have created (they might not be all recorded in job_context in case of a
|
// have created (they might not be all recorded in job_context in case of a
|
||||||
// failure). Thus, we force full scan in FindObsoleteFiles()
|
// failure). Thus, we force full scan in FindObsoleteFiles()
|
||||||
@ -2597,6 +2603,7 @@ Status DBImpl::BackgroundCompaction(bool* madeProgress, JobContext* job_context,
|
|||||||
|
|
||||||
mutex_.Unlock();
|
mutex_.Unlock();
|
||||||
status = compaction_job.Run();
|
status = compaction_job.Run();
|
||||||
|
TEST_SYNC_POINT("DBImpl::BackgroundCompaction:NonTrivial:AfterRun");
|
||||||
mutex_.Lock();
|
mutex_.Lock();
|
||||||
|
|
||||||
compaction_job.Install(&status, *c->mutable_cf_options(), &mutex_);
|
compaction_job.Install(&status, *c->mutable_cf_options(), &mutex_);
|
||||||
@ -4353,11 +4360,14 @@ Status DB::Open(const DBOptions& db_options, const std::string& dbname,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
TEST_SYNC_POINT("DBImpl::Open:Opened");
|
||||||
|
if (s.ok()) {
|
||||||
|
impl->opened_successfully_ = true;
|
||||||
|
impl->MaybeScheduleFlushOrCompaction();
|
||||||
|
}
|
||||||
impl->mutex_.Unlock();
|
impl->mutex_.Unlock();
|
||||||
|
|
||||||
if (s.ok()) {
|
if (s.ok()) {
|
||||||
impl->opened_successfully_ = true;
|
|
||||||
Log(InfoLogLevel::INFO_LEVEL, impl->db_options_.info_log, "DB pointer %p",
|
Log(InfoLogLevel::INFO_LEVEL, impl->db_options_.info_log, "DB pointer %p",
|
||||||
impl);
|
impl);
|
||||||
*dbptr = impl;
|
*dbptr = impl;
|
||||||
|
@ -290,6 +290,8 @@ class DBImpl : public DB {
|
|||||||
|
|
||||||
size_t TEST_LogsToFreeSize();
|
size_t TEST_LogsToFreeSize();
|
||||||
|
|
||||||
|
uint64_t TEST_LogfileNumber();
|
||||||
|
|
||||||
#endif // ROCKSDB_LITE
|
#endif // ROCKSDB_LITE
|
||||||
|
|
||||||
// Returns the list of live files in 'live' and the list
|
// Returns the list of live files in 'live' and the list
|
||||||
|
@ -148,5 +148,10 @@ size_t DBImpl::TEST_LogsToFreeSize() {
|
|||||||
return logs_to_free_.size();
|
return logs_to_free_.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t DBImpl::TEST_LogfileNumber() {
|
||||||
|
InstrumentedMutexLock l(&mutex_);
|
||||||
|
return logfile_number_;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace rocksdb
|
} // namespace rocksdb
|
||||||
#endif // ROCKSDB_LITE
|
#endif // ROCKSDB_LITE
|
||||||
|
@ -350,9 +350,6 @@ void DBIter::MergeValuesNewToOld() {
|
|||||||
void DBIter::Prev() {
|
void DBIter::Prev() {
|
||||||
assert(valid_);
|
assert(valid_);
|
||||||
if (direction_ == kForward) {
|
if (direction_ == kForward) {
|
||||||
if (!iter_->Valid()) {
|
|
||||||
iter_->SeekToLast();
|
|
||||||
}
|
|
||||||
FindPrevUserKey();
|
FindPrevUserKey();
|
||||||
direction_ = kReverse;
|
direction_ = kReverse;
|
||||||
}
|
}
|
||||||
@ -556,7 +553,7 @@ void DBIter::FindNextUserKey() {
|
|||||||
ParsedInternalKey ikey;
|
ParsedInternalKey ikey;
|
||||||
FindParseableKey(&ikey, kForward);
|
FindParseableKey(&ikey, kForward);
|
||||||
while (iter_->Valid() &&
|
while (iter_->Valid() &&
|
||||||
user_comparator_->Compare(ikey.user_key, saved_key_.GetKey()) <= 0) {
|
user_comparator_->Compare(ikey.user_key, saved_key_.GetKey()) != 0) {
|
||||||
iter_->Next();
|
iter_->Next();
|
||||||
FindParseableKey(&ikey, kForward);
|
FindParseableKey(&ikey, kForward);
|
||||||
}
|
}
|
||||||
@ -571,7 +568,7 @@ void DBIter::FindPrevUserKey() {
|
|||||||
ParsedInternalKey ikey;
|
ParsedInternalKey ikey;
|
||||||
FindParseableKey(&ikey, kReverse);
|
FindParseableKey(&ikey, kReverse);
|
||||||
while (iter_->Valid() &&
|
while (iter_->Valid() &&
|
||||||
user_comparator_->Compare(ikey.user_key, saved_key_.GetKey()) >= 0) {
|
user_comparator_->Compare(ikey.user_key, saved_key_.GetKey()) == 0) {
|
||||||
if (num_skipped >= max_skip_) {
|
if (num_skipped >= max_skip_) {
|
||||||
num_skipped = 0;
|
num_skipped = 0;
|
||||||
IterKey last_key;
|
IterKey last_key;
|
||||||
|
@ -1668,7 +1668,9 @@ TEST_F(DBIteratorTest, DBIterator8) {
|
|||||||
ASSERT_EQ(db_iter->value().ToString(), "0");
|
ASSERT_EQ(db_iter->value().ToString(), "0");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(DBIteratorTest, DBIterator9) {
|
// TODO(3.13): fix the issue of Seek() then Prev() which might not necessary
|
||||||
|
// return the biggest element smaller than the seek key.
|
||||||
|
TEST_F(DBIteratorTest, DISABLED_DBIterator9) {
|
||||||
Options options;
|
Options options;
|
||||||
options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
|
options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
|
||||||
{
|
{
|
||||||
@ -1716,7 +1718,9 @@ TEST_F(DBIteratorTest, DBIterator9) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(DBIteratorTest, DBIterator10) {
|
// TODO(3.13): fix the issue of Seek() then Prev() which might not necessary
|
||||||
|
// return the biggest element smaller than the seek key.
|
||||||
|
TEST_F(DBIteratorTest, DISABLED_DBIterator10) {
|
||||||
Options options;
|
Options options;
|
||||||
|
|
||||||
TestIterator* internal_iter = new TestIterator(BytewiseComparator());
|
TestIterator* internal_iter = new TestIterator(BytewiseComparator());
|
||||||
|
@ -7579,7 +7579,9 @@ TEST_F(DBTest, DropWrites) {
|
|||||||
ASSERT_LT(CountFiles(), num_files + 3);
|
ASSERT_LT(CountFiles(), num_files + 3);
|
||||||
|
|
||||||
// Check that compaction attempts slept after errors
|
// Check that compaction attempts slept after errors
|
||||||
ASSERT_TRUE(env_->sleep_counter_.WaitFor(5));
|
// TODO @krad: Figure out why ASSERT_EQ 5 keeps failing in certain compiler
|
||||||
|
// versions
|
||||||
|
ASSERT_GE(env_->sleep_counter_.Read(), 4);
|
||||||
} while (ChangeCompactOptions());
|
} while (ChangeCompactOptions());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8540,7 +8542,6 @@ TEST_F(DBTest, TransactionLogIterator) {
|
|||||||
} while (ChangeCompactOptions());
|
} while (ChangeCompactOptions());
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NDEBUG // sync point is not included with DNDEBUG build
|
|
||||||
TEST_F(DBTest, TransactionLogIteratorRace) {
|
TEST_F(DBTest, TransactionLogIteratorRace) {
|
||||||
static const int LOG_ITERATOR_RACE_TEST_COUNT = 2;
|
static const int LOG_ITERATOR_RACE_TEST_COUNT = 2;
|
||||||
static const char* sync_points[LOG_ITERATOR_RACE_TEST_COUNT][4] = {
|
static const char* sync_points[LOG_ITERATOR_RACE_TEST_COUNT][4] = {
|
||||||
@ -8595,7 +8596,6 @@ TEST_F(DBTest, TransactionLogIteratorRace) {
|
|||||||
} while (ChangeCompactOptions());
|
} while (ChangeCompactOptions());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
TEST_F(DBTest, TransactionLogIteratorStallAtLastRecord) {
|
TEST_F(DBTest, TransactionLogIteratorStallAtLastRecord) {
|
||||||
do {
|
do {
|
||||||
@ -12672,6 +12672,7 @@ TEST_F(DBTest, DontDeletePendingOutputs) {
|
|||||||
dbfull()->FindObsoleteFiles(&job_context, true /*force*/);
|
dbfull()->FindObsoleteFiles(&job_context, true /*force*/);
|
||||||
dbfull()->TEST_UnlockMutex();
|
dbfull()->TEST_UnlockMutex();
|
||||||
dbfull()->PurgeObsoleteFiles(job_context);
|
dbfull()->PurgeObsoleteFiles(job_context);
|
||||||
|
job_context.Clean();
|
||||||
};
|
};
|
||||||
|
|
||||||
env_->table_write_callback_ = &purge_obsolete_files_function;
|
env_->table_write_callback_ = &purge_obsolete_files_function;
|
||||||
@ -14113,7 +14114,9 @@ TEST_F(DBTest, RowCache) {
|
|||||||
ASSERT_EQ(TestGetTickerCount(options, ROW_CACHE_MISS), 1);
|
ASSERT_EQ(TestGetTickerCount(options, ROW_CACHE_MISS), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(DBTest, PrevAfterMerge) {
|
// TODO(3.13): fix the issue of Seek() + Prev() which might not necessary
|
||||||
|
// return the biggest key which is smaller than the seek key.
|
||||||
|
TEST_F(DBTest, DISABLED_PrevAfterMerge) {
|
||||||
Options options;
|
Options options;
|
||||||
options.create_if_missing = true;
|
options.create_if_missing = true;
|
||||||
options.merge_operator = MergeOperators::CreatePutOperator();
|
options.merge_operator = MergeOperators::CreatePutOperator();
|
||||||
@ -14136,6 +14139,40 @@ TEST_F(DBTest, PrevAfterMerge) {
|
|||||||
ASSERT_EQ("1", it->key().ToString());
|
ASSERT_EQ("1", it->key().ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(DBTest, DeletingOldWalAfterDrop) {
|
||||||
|
rocksdb::SyncPoint::GetInstance()->LoadDependency(
|
||||||
|
{ { "Test:AllowFlushes", "DBImpl::BGWorkFlush" },
|
||||||
|
{ "DBImpl::BGWorkFlush:done", "Test:WaitForFlush"} });
|
||||||
|
rocksdb::SyncPoint::GetInstance()->ClearTrace();
|
||||||
|
|
||||||
|
rocksdb::SyncPoint::GetInstance()->DisableProcessing();
|
||||||
|
Options options = CurrentOptions();
|
||||||
|
options.max_total_wal_size = 8192;
|
||||||
|
options.compression = kNoCompression;
|
||||||
|
options.write_buffer_size = 1 << 20;
|
||||||
|
options.level0_file_num_compaction_trigger = (1<<30);
|
||||||
|
options.level0_slowdown_writes_trigger = (1<<30);
|
||||||
|
options.level0_stop_writes_trigger = (1<<30);
|
||||||
|
options.disable_auto_compactions = true;
|
||||||
|
DestroyAndReopen(options);
|
||||||
|
rocksdb::SyncPoint::GetInstance()->EnableProcessing();
|
||||||
|
|
||||||
|
CreateColumnFamilies({"cf1", "cf2"}, options);
|
||||||
|
ASSERT_OK(Put(0, "key1", DummyString(8192)));
|
||||||
|
ASSERT_OK(Put(0, "key2", DummyString(8192)));
|
||||||
|
// the oldest wal should now be getting_flushed
|
||||||
|
ASSERT_OK(db_->DropColumnFamily(handles_[0]));
|
||||||
|
// all flushes should now do nothing because their CF is dropped
|
||||||
|
TEST_SYNC_POINT("Test:AllowFlushes");
|
||||||
|
TEST_SYNC_POINT("Test:WaitForFlush");
|
||||||
|
uint64_t lognum1 = dbfull()->TEST_LogfileNumber();
|
||||||
|
ASSERT_OK(Put(1, "key3", DummyString(8192)));
|
||||||
|
ASSERT_OK(Put(1, "key4", DummyString(8192)));
|
||||||
|
// new wal should have been created
|
||||||
|
uint64_t lognum2 = dbfull()->TEST_LogfileNumber();
|
||||||
|
EXPECT_GT(lognum2, lognum1);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace rocksdb
|
} // namespace rocksdb
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include "util/logging.h"
|
#include "util/logging.h"
|
||||||
#include "util/mock_env.h"
|
#include "util/mock_env.h"
|
||||||
#include "util/mutexlock.h"
|
#include "util/mutexlock.h"
|
||||||
|
#include "util/sync_point.h"
|
||||||
#include "util/testharness.h"
|
#include "util/testharness.h"
|
||||||
#include "util/testutil.h"
|
#include "util/testutil.h"
|
||||||
|
|
||||||
@ -185,6 +186,13 @@ class FaultInjectionTestEnv : public EnvWrapper {
|
|||||||
Status NewWritableFile(const std::string& fname,
|
Status NewWritableFile(const std::string& fname,
|
||||||
unique_ptr<WritableFile>* result,
|
unique_ptr<WritableFile>* result,
|
||||||
const EnvOptions& soptions) override {
|
const EnvOptions& soptions) override {
|
||||||
|
if (!IsFilesystemActive()) {
|
||||||
|
return Status::Corruption("Not Active");
|
||||||
|
}
|
||||||
|
// Not allow overwriting files
|
||||||
|
if (target()->FileExists(fname)) {
|
||||||
|
return Status::Corruption("File already exists.");
|
||||||
|
}
|
||||||
Status s = target()->NewWritableFile(fname, result, soptions);
|
Status s = target()->NewWritableFile(fname, result, soptions);
|
||||||
if (s.ok()) {
|
if (s.ok()) {
|
||||||
result->reset(new TestWritableFile(fname, std::move(*result), this));
|
result->reset(new TestWritableFile(fname, std::move(*result), this));
|
||||||
@ -201,6 +209,9 @@ class FaultInjectionTestEnv : public EnvWrapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual Status DeleteFile(const std::string& f) override {
|
virtual Status DeleteFile(const std::string& f) override {
|
||||||
|
if (!IsFilesystemActive()) {
|
||||||
|
return Status::Corruption("Not Active");
|
||||||
|
}
|
||||||
Status s = EnvWrapper::DeleteFile(f);
|
Status s = EnvWrapper::DeleteFile(f);
|
||||||
if (!s.ok()) {
|
if (!s.ok()) {
|
||||||
fprintf(stderr, "Cannot delete file %s: %s\n", f.c_str(),
|
fprintf(stderr, "Cannot delete file %s: %s\n", f.c_str(),
|
||||||
@ -215,6 +226,9 @@ class FaultInjectionTestEnv : public EnvWrapper {
|
|||||||
|
|
||||||
virtual Status RenameFile(const std::string& s,
|
virtual Status RenameFile(const std::string& s,
|
||||||
const std::string& t) override {
|
const std::string& t) override {
|
||||||
|
if (!IsFilesystemActive()) {
|
||||||
|
return Status::Corruption("Not Active");
|
||||||
|
}
|
||||||
Status ret = EnvWrapper::RenameFile(s, t);
|
Status ret = EnvWrapper::RenameFile(s, t);
|
||||||
|
|
||||||
if (ret.ok()) {
|
if (ret.ok()) {
|
||||||
@ -373,8 +387,11 @@ TestWritableFile::~TestWritableFile() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Status TestWritableFile::Append(const Slice& data) {
|
Status TestWritableFile::Append(const Slice& data) {
|
||||||
|
if (!env_->IsFilesystemActive()) {
|
||||||
|
return Status::Corruption("Not Active");
|
||||||
|
}
|
||||||
Status s = target_->Append(data);
|
Status s = target_->Append(data);
|
||||||
if (s.ok() && env_->IsFilesystemActive()) {
|
if (s.ok()) {
|
||||||
state_.pos_ += data.size();
|
state_.pos_ += data.size();
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
@ -544,33 +561,34 @@ class FaultInjectionTest : public testing::Test {
|
|||||||
ASSERT_OK(s);
|
ASSERT_OK(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Build(const WriteOptions& write_options, int start_idx, int num_vals) {
|
void Build(const WriteOptions& write_options, int start_idx, int num_vals,
|
||||||
|
bool sequential = true) {
|
||||||
std::string key_space, value_space;
|
std::string key_space, value_space;
|
||||||
WriteBatch batch;
|
WriteBatch batch;
|
||||||
for (int i = start_idx; i < start_idx + num_vals; i++) {
|
for (int i = start_idx; i < start_idx + num_vals; i++) {
|
||||||
Slice key = Key(i, &key_space);
|
Slice key = Key(sequential, i, &key_space);
|
||||||
batch.Clear();
|
batch.Clear();
|
||||||
batch.Put(key, Value(i, &value_space));
|
batch.Put(key, Value(i, &value_space));
|
||||||
ASSERT_OK(db_->Write(write_options, &batch));
|
ASSERT_OK(db_->Write(write_options, &batch));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Status ReadValue(int i, std::string* val) const {
|
Status ReadValue(int i, std::string* val, bool sequential) const {
|
||||||
std::string key_space, value_space;
|
std::string key_space, value_space;
|
||||||
Slice key = Key(i, &key_space);
|
Slice key = Key(sequential, i, &key_space);
|
||||||
Value(i, &value_space);
|
Value(i, &value_space);
|
||||||
ReadOptions options;
|
ReadOptions options;
|
||||||
return db_->Get(options, key, val);
|
return db_->Get(options, key, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
Status Verify(int start_idx, int num_vals,
|
Status Verify(int start_idx, int num_vals, ExpectedVerifResult expected,
|
||||||
ExpectedVerifResult expected) const {
|
bool seqeuntial = true) const {
|
||||||
std::string val;
|
std::string val;
|
||||||
std::string value_space;
|
std::string value_space;
|
||||||
Status s;
|
Status s;
|
||||||
for (int i = start_idx; i < start_idx + num_vals && s.ok(); i++) {
|
for (int i = start_idx; i < start_idx + num_vals && s.ok(); i++) {
|
||||||
Value(i, &value_space);
|
Value(i, &value_space);
|
||||||
s = ReadValue(i, &val);
|
s = ReadValue(i, &val, seqeuntial);
|
||||||
if (s.ok()) {
|
if (s.ok()) {
|
||||||
EXPECT_EQ(value_space, val);
|
EXPECT_EQ(value_space, val);
|
||||||
}
|
}
|
||||||
@ -590,9 +608,16 @@ class FaultInjectionTest : public testing::Test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Return the ith key
|
// Return the ith key
|
||||||
Slice Key(int i, std::string* storage) const {
|
Slice Key(bool seqeuntial, int i, std::string* storage) const {
|
||||||
|
int num = i;
|
||||||
|
if (!seqeuntial) {
|
||||||
|
// random transfer
|
||||||
|
const int m = 0x5bd1e995;
|
||||||
|
num *= m;
|
||||||
|
num ^= num << 24;
|
||||||
|
}
|
||||||
char buf[100];
|
char buf[100];
|
||||||
snprintf(buf, sizeof(buf), "%016d", i);
|
snprintf(buf, sizeof(buf), "%016d", num);
|
||||||
storage->assign(buf, strlen(buf));
|
storage->assign(buf, strlen(buf));
|
||||||
return Slice(*storage);
|
return Slice(*storage);
|
||||||
}
|
}
|
||||||
@ -772,14 +797,14 @@ TEST_F(FaultInjectionTest, DISABLED_WriteOptionSyncTest) {
|
|||||||
write_options.sync = false;
|
write_options.sync = false;
|
||||||
|
|
||||||
std::string key_space, value_space;
|
std::string key_space, value_space;
|
||||||
ASSERT_OK(
|
ASSERT_OK(db_->Put(write_options, Key(true, 1, &key_space),
|
||||||
db_->Put(write_options, Key(1, &key_space), Value(1, &value_space)));
|
Value(1, &value_space)));
|
||||||
FlushOptions flush_options;
|
FlushOptions flush_options;
|
||||||
flush_options.wait = false;
|
flush_options.wait = false;
|
||||||
ASSERT_OK(db_->Flush(flush_options));
|
ASSERT_OK(db_->Flush(flush_options));
|
||||||
write_options.sync = true;
|
write_options.sync = true;
|
||||||
ASSERT_OK(
|
ASSERT_OK(db_->Put(write_options, Key(true, 2, &key_space),
|
||||||
db_->Put(write_options, Key(2, &key_space), Value(2, &value_space)));
|
Value(2, &value_space)));
|
||||||
|
|
||||||
env_->SetFilesystemActive(false);
|
env_->SetFilesystemActive(false);
|
||||||
NoWriteTestReopenWithFault(kResetDropAndDeleteUnsynced);
|
NoWriteTestReopenWithFault(kResetDropAndDeleteUnsynced);
|
||||||
@ -788,14 +813,59 @@ TEST_F(FaultInjectionTest, DISABLED_WriteOptionSyncTest) {
|
|||||||
ASSERT_OK(OpenDB());
|
ASSERT_OK(OpenDB());
|
||||||
std::string val;
|
std::string val;
|
||||||
Value(2, &value_space);
|
Value(2, &value_space);
|
||||||
ASSERT_OK(ReadValue(2, &val));
|
ASSERT_OK(ReadValue(2, &val, true));
|
||||||
ASSERT_EQ(value_space, val);
|
ASSERT_EQ(value_space, val);
|
||||||
|
|
||||||
Value(1, &value_space);
|
Value(1, &value_space);
|
||||||
ASSERT_OK(ReadValue(1, &val));
|
ASSERT_OK(ReadValue(1, &val, true));
|
||||||
ASSERT_EQ(value_space, val);
|
ASSERT_EQ(value_space, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(FaultInjectionTest, UninstalledCompaction) {
|
||||||
|
options_.target_file_size_base = 32 * 1024;
|
||||||
|
options_.write_buffer_size = 100 << 10; // 100KB
|
||||||
|
options_.level0_file_num_compaction_trigger = 6;
|
||||||
|
options_.level0_stop_writes_trigger = 1 << 10;
|
||||||
|
options_.level0_slowdown_writes_trigger = 1 << 10;
|
||||||
|
options_.max_background_compactions = 1;
|
||||||
|
OpenDB();
|
||||||
|
|
||||||
|
rocksdb::SyncPoint::GetInstance()->LoadDependency({
|
||||||
|
{"FaultInjectionTest::FaultTest:0", "DBImpl::BGWorkCompaction"},
|
||||||
|
{"CompactionJob::Run():End", "FaultInjectionTest::FaultTest:1"},
|
||||||
|
{"FaultInjectionTest::FaultTest:2",
|
||||||
|
"DBImpl::BackgroundCompaction:NonTrivial:AfterRun"},
|
||||||
|
});
|
||||||
|
rocksdb::SyncPoint::GetInstance()->EnableProcessing();
|
||||||
|
|
||||||
|
int kNumKeys = 1000;
|
||||||
|
Build(WriteOptions(), 0, kNumKeys, false);
|
||||||
|
FlushOptions flush_options;
|
||||||
|
flush_options.wait = true;
|
||||||
|
db_->Flush(flush_options);
|
||||||
|
ASSERT_OK(db_->Put(WriteOptions(), "", ""));
|
||||||
|
TEST_SYNC_POINT("FaultInjectionTest::FaultTest:0");
|
||||||
|
TEST_SYNC_POINT("FaultInjectionTest::FaultTest:1");
|
||||||
|
env_->SetFilesystemActive(false);
|
||||||
|
TEST_SYNC_POINT("FaultInjectionTest::FaultTest:2");
|
||||||
|
CloseDB();
|
||||||
|
rocksdb::SyncPoint::GetInstance()->DisableProcessing();
|
||||||
|
ResetDBState(kResetDropUnsyncedData);
|
||||||
|
|
||||||
|
std::atomic<bool> opened(false);
|
||||||
|
rocksdb::SyncPoint::GetInstance()->SetCallBack(
|
||||||
|
"DBImpl::Open:Opened", [&](void* arg) { opened.store(true); });
|
||||||
|
rocksdb::SyncPoint::GetInstance()->SetCallBack(
|
||||||
|
"DBImpl::BGWorkCompaction",
|
||||||
|
[&](void* arg) { ASSERT_TRUE(opened.load()); });
|
||||||
|
rocksdb::SyncPoint::GetInstance()->EnableProcessing();
|
||||||
|
ASSERT_OK(OpenDB());
|
||||||
|
static_cast<DBImpl*>(db_)->TEST_WaitForCompact();
|
||||||
|
ASSERT_OK(Verify(0, kNumKeys, FaultInjectionTest::kValExpectFound, false));
|
||||||
|
ASSERT_OK(db_->Put(WriteOptions(), "", ""));
|
||||||
|
rocksdb::SyncPoint::GetInstance()->DisableProcessing();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace rocksdb
|
} // namespace rocksdb
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
|
@ -169,6 +169,7 @@ void ForwardIterator::Cleanup(bool release_sv) {
|
|||||||
if (job_context.HaveSomethingToDelete()) {
|
if (job_context.HaveSomethingToDelete()) {
|
||||||
db_->PurgeObsoleteFiles(job_context);
|
db_->PurgeObsoleteFiles(job_context);
|
||||||
}
|
}
|
||||||
|
job_context.Clean();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,6 +83,10 @@ struct JobContext {
|
|||||||
new_superversion = create_superversion ? new SuperVersion() : nullptr;
|
new_superversion = create_superversion ? new SuperVersion() : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For non-empty JobContext Clean() has to be called at least once before
|
||||||
|
// before destruction (see asserts in ~JobContext()). Should be called with
|
||||||
|
// unlocked DB mutex. Destructor doesn't call Clean() to avoid accidentally
|
||||||
|
// doing potentially slow Clean() with locked DB mutex.
|
||||||
void Clean() {
|
void Clean() {
|
||||||
// free pending memtables
|
// free pending memtables
|
||||||
for (auto m : memtables_to_free) {
|
for (auto m : memtables_to_free) {
|
||||||
@ -109,6 +113,7 @@ struct JobContext {
|
|||||||
assert(memtables_to_free.size() == 0);
|
assert(memtables_to_free.size() == 0);
|
||||||
assert(superversions_to_free.size() == 0);
|
assert(superversions_to_free.size() == 0);
|
||||||
assert(new_superversion == nullptr);
|
assert(new_superversion == nullptr);
|
||||||
|
assert(logs_to_free.size() == 0);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -612,7 +612,9 @@ class VersionSet {
|
|||||||
uint64_t MinLogNumber() const {
|
uint64_t MinLogNumber() const {
|
||||||
uint64_t min_log_num = std::numeric_limits<uint64_t>::max();
|
uint64_t min_log_num = std::numeric_limits<uint64_t>::max();
|
||||||
for (auto cfd : *column_family_set_) {
|
for (auto cfd : *column_family_set_) {
|
||||||
if (min_log_num > cfd->GetLogNumber()) {
|
// It's safe to ignore dropped column families here:
|
||||||
|
// cfd->IsDropped() becomes true after the drop is persisted in MANIFEST.
|
||||||
|
if (min_log_num > cfd->GetLogNumber() && !cfd->IsDropped()) {
|
||||||
min_log_num = cfd->GetLogNumber();
|
min_log_num = cfd->GetLogNumber();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#define ROCKSDB_MAJOR 3
|
#define ROCKSDB_MAJOR 3
|
||||||
#define ROCKSDB_MINOR 12
|
#define ROCKSDB_MINOR 12
|
||||||
#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
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#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>
|
||||||
|
@ -38,7 +38,6 @@
|
|||||||
|
|
||||||
namespace rocksdb {
|
namespace rocksdb {
|
||||||
|
|
||||||
namespace {
|
|
||||||
class BackupRateLimiter {
|
class BackupRateLimiter {
|
||||||
public:
|
public:
|
||||||
BackupRateLimiter(Env* env, uint64_t max_bytes_per_second,
|
BackupRateLimiter(Env* env, uint64_t max_bytes_per_second,
|
||||||
@ -79,7 +78,6 @@ class BackupRateLimiter {
|
|||||||
uint64_t bytes_since_start_;
|
uint64_t bytes_since_start_;
|
||||||
static const uint64_t kMicrosInSecond = 1000 * 1000LL;
|
static const uint64_t kMicrosInSecond = 1000 * 1000LL;
|
||||||
};
|
};
|
||||||
} // namespace
|
|
||||||
|
|
||||||
void BackupStatistics::IncrementNumberSuccessBackup() {
|
void BackupStatistics::IncrementNumberSuccessBackup() {
|
||||||
number_success_backup++;
|
number_success_backup++;
|
||||||
@ -444,26 +442,6 @@ BackupEngineImpl::BackupEngineImpl(Env* db_env,
|
|||||||
copy_file_buffer_size_(kDefaultCopyFileBufferSize),
|
copy_file_buffer_size_(kDefaultCopyFileBufferSize),
|
||||||
read_only_(read_only) {
|
read_only_(read_only) {
|
||||||
|
|
||||||
// set up threads perform copies from files_to_copy_ in the background
|
|
||||||
for (int t = 0; t < options_.max_background_operations; t++) {
|
|
||||||
threads_.emplace_back([&]() {
|
|
||||||
CopyWorkItem work_item;
|
|
||||||
while (files_to_copy_.read(work_item)) {
|
|
||||||
CopyResult result;
|
|
||||||
result.status = CopyFile(work_item.src_path,
|
|
||||||
work_item.dst_path,
|
|
||||||
work_item.src_env,
|
|
||||||
work_item.dst_env,
|
|
||||||
work_item.sync,
|
|
||||||
work_item.rate_limiter,
|
|
||||||
&result.size,
|
|
||||||
&result.checksum_value,
|
|
||||||
work_item.size_limit);
|
|
||||||
work_item.result.set_value(std::move(result));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (read_only_) {
|
if (read_only_) {
|
||||||
Log(options_.info_log, "Starting read_only backup engine");
|
Log(options_.info_log, "Starting read_only backup engine");
|
||||||
}
|
}
|
||||||
@ -583,6 +561,27 @@ BackupEngineImpl::BackupEngineImpl(Env* db_env,
|
|||||||
if (!read_only_) {
|
if (!read_only_) {
|
||||||
PutLatestBackupFileContents(latest_backup_id_); // Ignore errors
|
PutLatestBackupFileContents(latest_backup_id_); // Ignore errors
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set up threads perform copies from files_to_copy_ in the background
|
||||||
|
for (int t = 0; t < options_.max_background_operations; t++) {
|
||||||
|
threads_.emplace_back([&]() {
|
||||||
|
CopyWorkItem work_item;
|
||||||
|
while (files_to_copy_.read(work_item)) {
|
||||||
|
CopyResult result;
|
||||||
|
result.status = CopyFile(work_item.src_path,
|
||||||
|
work_item.dst_path,
|
||||||
|
work_item.src_env,
|
||||||
|
work_item.dst_env,
|
||||||
|
work_item.sync,
|
||||||
|
work_item.rate_limiter,
|
||||||
|
&result.size,
|
||||||
|
&result.checksum_value,
|
||||||
|
work_item.size_limit);
|
||||||
|
work_item.result.set_value(std::move(result));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
Log(options_.info_log, "Initialized BackupEngine");
|
Log(options_.info_log, "Initialized BackupEngine");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user