2017-01-20 22:16:22 +01:00
|
|
|
# Prerequisites for Windows:
|
|
|
|
# This cmake build is for Windows 64-bit only.
|
2015-07-02 01:13:49 +02:00
|
|
|
#
|
|
|
|
# Prerequisites:
|
2016-10-12 22:40:20 +02:00
|
|
|
# You must have at least Visual Studio 2015 Update 3. Start the Developer Command Prompt window that is a part of Visual Studio installation.
|
2015-07-02 01:13:49 +02:00
|
|
|
# Run the build commands from within the Developer Command Prompt window to have paths to the compiler and runtime libraries set.
|
2015-07-09 23:42:41 +02:00
|
|
|
# You must have git.exe in your %PATH% environment variable.
|
2015-07-02 01:13:49 +02:00
|
|
|
#
|
|
|
|
# To build Rocksdb for Windows is as easy as 1-2-3-4-5:
|
2015-07-15 23:51:51 +02:00
|
|
|
#
|
2015-07-09 23:42:41 +02:00
|
|
|
# 1. Update paths to third-party libraries in thirdparty.inc file
|
2015-07-02 01:13:49 +02:00
|
|
|
# 2. Create a new directory for build artifacts
|
|
|
|
# mkdir build
|
|
|
|
# cd build
|
2015-07-09 23:42:41 +02:00
|
|
|
# 3. Run cmake to generate project files for Windows, add more options to enable required third-party libraries.
|
|
|
|
# See thirdparty.inc for more information.
|
2019-12-09 06:33:23 +01:00
|
|
|
# sample command: cmake -G "Visual Studio 15 Win64" -DCMAKE_BUILD_TYPE=Release -DWITH_GFLAGS=1 -DWITH_SNAPPY=1 -DWITH_JEMALLOC=1 -DWITH_JNI=1 ..
|
2015-10-20 22:35:08 +02:00
|
|
|
# 4. Then build the project in debug mode (you may want to add /m[:<N>] flag to run msbuild in <N> parallel threads
|
2018-05-05 00:09:40 +02:00
|
|
|
# or simply /m to use all avail cores)
|
2015-10-20 22:35:08 +02:00
|
|
|
# msbuild rocksdb.sln
|
|
|
|
#
|
|
|
|
# rocksdb.sln build features exclusions of test only code in Release. If you build ALL_BUILD then everything
|
|
|
|
# will be attempted but test only code does not build in Release mode.
|
|
|
|
#
|
2015-09-30 20:20:23 +02:00
|
|
|
# 5. And release mode (/m[:<N>] is also supported)
|
2015-10-20 22:35:08 +02:00
|
|
|
# msbuild rocksdb.sln /p:Configuration=Release
|
2015-07-02 01:13:49 +02:00
|
|
|
#
|
2017-01-20 22:16:22 +01:00
|
|
|
# Linux:
|
|
|
|
#
|
|
|
|
# 1. Install a recent toolchain such as devtoolset-3 if you're on a older distro. C++11 required.
|
|
|
|
# 2. mkdir build; cd build
|
|
|
|
# 3. cmake ..
|
|
|
|
# 4. make -j
|
2015-07-02 01:13:49 +02:00
|
|
|
|
2019-08-06 04:47:33 +02:00
|
|
|
cmake_minimum_required(VERSION 3.5.1)
|
|
|
|
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/modules/")
|
|
|
|
include(ReadVersion)
|
|
|
|
get_rocksdb_version(rocksdb_VERSION)
|
|
|
|
project(rocksdb
|
|
|
|
VERSION ${rocksdb_VERSION}
|
|
|
|
LANGUAGES CXX C ASM)
|
2015-07-02 01:13:49 +02:00
|
|
|
|
2016-09-28 20:53:15 +02:00
|
|
|
if(POLICY CMP0042)
|
|
|
|
cmake_policy(SET CMP0042 NEW)
|
|
|
|
endif()
|
|
|
|
|
2019-12-13 20:33:59 +01:00
|
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
|
|
if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
|
|
|
set(default_build_type "Debug")
|
|
|
|
else()
|
|
|
|
set(default_build_type "RelWithDebInfo")
|
|
|
|
endif()
|
|
|
|
set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING
|
|
|
|
"Default BUILD_TYPE is ${default_build_type}" FORCE)
|
|
|
|
endif()
|
|
|
|
|
2019-05-31 19:40:39 +02:00
|
|
|
find_program(CCACHE_FOUND ccache)
|
|
|
|
if(CCACHE_FOUND)
|
|
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
|
|
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
|
|
|
|
endif(CCACHE_FOUND)
|
|
|
|
|
2017-10-27 22:14:07 +02:00
|
|
|
option(WITH_JEMALLOC "build with JeMalloc" OFF)
|
2018-01-05 23:52:57 +01:00
|
|
|
option(WITH_SNAPPY "build with SNAPPY" OFF)
|
|
|
|
option(WITH_LZ4 "build with lz4" OFF)
|
|
|
|
option(WITH_ZLIB "build with zlib" OFF)
|
2018-07-20 00:07:22 +02:00
|
|
|
option(WITH_ZSTD "build with zstd" OFF)
|
2018-10-12 08:22:42 +02:00
|
|
|
option(WITH_WINDOWS_UTF8_FILENAMES "use UTF8 as characterset for opening files, regardles of the system code page" OFF)
|
|
|
|
if (WITH_WINDOWS_UTF8_FILENAMES)
|
|
|
|
add_definitions(-DROCKSDB_WINDOWS_UTF8_FILENAMES)
|
|
|
|
endif()
|
2019-08-07 23:29:35 +02:00
|
|
|
# third-party/folly is only validated to work on Linux and Windows for now.
|
|
|
|
# So only turn it on there by default.
|
2019-12-13 20:33:59 +01:00
|
|
|
if(CMAKE_SYSTEM_NAME MATCHES "Linux|Windows")
|
2019-12-11 05:00:57 +01:00
|
|
|
if(MSVC AND MSVC_VERSION LESS 1910)
|
|
|
|
# Folly does not compile with MSVC older than VS2017
|
|
|
|
option(WITH_FOLLY_DISTRIBUTED_MUTEX "build with folly::DistributedMutex" OFF)
|
|
|
|
else()
|
|
|
|
option(WITH_FOLLY_DISTRIBUTED_MUTEX "build with folly::DistributedMutex" ON)
|
|
|
|
endif()
|
2019-08-07 23:29:35 +02:00
|
|
|
else()
|
|
|
|
option(WITH_FOLLY_DISTRIBUTED_MUTEX "build with folly::DistributedMutex" OFF)
|
|
|
|
endif()
|
2019-12-13 20:33:59 +01:00
|
|
|
|
2020-04-20 22:21:34 +02:00
|
|
|
if( NOT DEFINED CMAKE_CXX_STANDARD )
|
|
|
|
set(CMAKE_CXX_STANDARD 11)
|
|
|
|
endif()
|
|
|
|
|
2019-12-13 20:33:59 +01:00
|
|
|
include(CMakeDependentOption)
|
|
|
|
CMAKE_DEPENDENT_OPTION(WITH_GFLAGS "build with GFlags" ON
|
|
|
|
"NOT MSVC;NOT MINGW" OFF)
|
|
|
|
|
2017-04-06 22:54:49 +02:00
|
|
|
if(MSVC)
|
2018-01-05 23:52:57 +01:00
|
|
|
option(WITH_XPRESS "build with windows built in compression" OFF)
|
2016-09-28 20:53:15 +02:00
|
|
|
include(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty.inc)
|
|
|
|
else()
|
2020-06-18 18:50:05 +02:00
|
|
|
if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD" AND NOT CMAKE_SYSTEM_NAME MATCHES "kFreeBSD")
|
2018-03-08 19:18:34 +01:00
|
|
|
# FreeBSD has jemalloc as default malloc
|
2017-04-09 20:15:35 +02:00
|
|
|
# but it does not have all the jemalloc files in include/...
|
2017-04-06 22:54:49 +02:00
|
|
|
set(WITH_JEMALLOC ON)
|
2017-04-09 20:15:35 +02:00
|
|
|
else()
|
|
|
|
if(WITH_JEMALLOC)
|
|
|
|
find_package(JeMalloc REQUIRED)
|
|
|
|
add_definitions(-DROCKSDB_JEMALLOC -DJEMALLOC_NO_DEMANGLE)
|
2019-08-06 04:47:33 +02:00
|
|
|
list(APPEND THIRDPARTY_LIBS JeMalloc::JeMalloc)
|
2017-04-09 20:15:35 +02:00
|
|
|
endif()
|
2017-04-16 20:41:12 +02:00
|
|
|
endif()
|
2018-03-28 19:23:31 +02:00
|
|
|
|
2020-06-26 02:21:27 +02:00
|
|
|
set(GFLAGS_LIB)
|
2018-01-05 23:52:57 +01:00
|
|
|
if(WITH_GFLAGS)
|
2020-05-11 19:26:18 +02:00
|
|
|
# Config with namespace available since gflags 2.2.2
|
|
|
|
option(GFLAGS_USE_TARGET_NAMESPACE "Use gflags import target with namespace." ON)
|
|
|
|
find_package(gflags CONFIG)
|
|
|
|
if(gflags_FOUND)
|
|
|
|
if(TARGET ${GFLAGS_TARGET})
|
|
|
|
# Config with GFLAGS_TARGET available since gflags 2.2.0
|
2020-06-26 02:21:27 +02:00
|
|
|
set(GFLAGS_LIB ${GFLAGS_TARGET})
|
2020-05-11 19:26:18 +02:00
|
|
|
else()
|
|
|
|
# Config with GFLAGS_LIBRARIES available since gflags 2.1.0
|
2020-06-26 02:21:27 +02:00
|
|
|
set(GFLAGS_LIB ${GFLAGS_LIBRARIES})
|
2020-05-11 19:26:18 +02:00
|
|
|
endif()
|
|
|
|
else()
|
|
|
|
find_package(gflags REQUIRED)
|
2020-06-26 02:21:27 +02:00
|
|
|
set(GFLAGS_LIB gflags::gflags)
|
2020-05-11 19:26:18 +02:00
|
|
|
endif()
|
2020-06-26 02:21:27 +02:00
|
|
|
include_directories(${GFLAGS_INCLUDE_DIR})
|
|
|
|
list(APPEND THIRDPARTY_LIBS ${GFLAGS_LIB})
|
2019-12-13 20:33:59 +01:00
|
|
|
add_definitions(-DGFLAGS=1)
|
2018-01-05 23:52:57 +01:00
|
|
|
endif()
|
2017-08-14 06:29:53 +02:00
|
|
|
|
2016-09-28 20:53:15 +02:00
|
|
|
if(WITH_SNAPPY)
|
2020-05-11 19:26:18 +02:00
|
|
|
find_package(Snappy CONFIG)
|
|
|
|
if(NOT Snappy_FOUND)
|
|
|
|
find_package(Snappy REQUIRED)
|
|
|
|
endif()
|
2016-09-28 20:53:15 +02:00
|
|
|
add_definitions(-DSNAPPY)
|
2020-05-11 19:26:18 +02:00
|
|
|
list(APPEND THIRDPARTY_LIBS Snappy::snappy)
|
2016-09-28 20:53:15 +02:00
|
|
|
endif()
|
2017-08-14 06:29:53 +02:00
|
|
|
|
|
|
|
if(WITH_ZLIB)
|
2019-04-30 00:27:09 +02:00
|
|
|
find_package(ZLIB REQUIRED)
|
2017-08-14 06:29:53 +02:00
|
|
|
add_definitions(-DZLIB)
|
2019-08-06 04:47:33 +02:00
|
|
|
list(APPEND THIRDPARTY_LIBS ZLIB::ZLIB)
|
2017-08-14 06:29:53 +02:00
|
|
|
endif()
|
|
|
|
|
|
|
|
option(WITH_BZ2 "build with bzip2" OFF)
|
|
|
|
if(WITH_BZ2)
|
2019-08-06 04:47:33 +02:00
|
|
|
find_package(BZip2 REQUIRED)
|
2017-08-14 06:29:53 +02:00
|
|
|
add_definitions(-DBZIP2)
|
2019-08-06 04:47:33 +02:00
|
|
|
if(BZIP2_INCLUDE_DIRS)
|
|
|
|
include_directories(${BZIP2_INCLUDE_DIRS})
|
|
|
|
else()
|
|
|
|
include_directories(${BZIP2_INCLUDE_DIR})
|
|
|
|
endif()
|
2017-08-14 06:29:53 +02:00
|
|
|
list(APPEND THIRDPARTY_LIBS ${BZIP2_LIBRARIES})
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(WITH_LZ4)
|
|
|
|
find_package(lz4 REQUIRED)
|
|
|
|
add_definitions(-DLZ4)
|
2019-08-06 04:47:33 +02:00
|
|
|
list(APPEND THIRDPARTY_LIBS lz4::lz4)
|
2017-08-14 06:29:53 +02:00
|
|
|
endif()
|
|
|
|
|
|
|
|
if(WITH_ZSTD)
|
|
|
|
find_package(zstd REQUIRED)
|
|
|
|
add_definitions(-DZSTD)
|
|
|
|
include_directories(${ZSTD_INCLUDE_DIR})
|
2019-08-06 04:47:33 +02:00
|
|
|
list(APPEND THIRDPARTY_LIBS zstd::zstd)
|
2017-08-14 06:29:53 +02:00
|
|
|
endif()
|
2016-09-28 20:53:15 +02:00
|
|
|
endif()
|
|
|
|
|
2019-09-12 02:58:34 +02:00
|
|
|
string(TIMESTAMP TS "%Y/%m/%d %H:%M:%S" UTC)
|
|
|
|
set(GIT_DATE_TIME "${TS}" CACHE STRING "the time we first built rocksdb")
|
2015-07-02 01:13:49 +02:00
|
|
|
|
2015-10-20 20:27:48 +02:00
|
|
|
find_package(Git)
|
|
|
|
|
2017-04-03 18:58:35 +02:00
|
|
|
if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
|
2016-09-28 20:53:15 +02:00
|
|
|
if(WIN32)
|
2015-10-20 20:27:48 +02:00
|
|
|
execute_process(COMMAND $ENV{COMSPEC} /C ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
|
2016-09-28 20:53:15 +02:00
|
|
|
else()
|
|
|
|
execute_process(COMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse HEAD OUTPUT_VARIABLE GIT_SHA)
|
|
|
|
endif()
|
2015-10-20 20:27:48 +02:00
|
|
|
else()
|
2016-09-28 20:53:15 +02:00
|
|
|
set(GIT_SHA 0)
|
2015-10-20 20:27:48 +02:00
|
|
|
endif()
|
|
|
|
|
2016-07-27 05:29:02 +02:00
|
|
|
string(REGEX REPLACE "[^0-9a-f]+" "" GIT_SHA "${GIT_SHA}")
|
2015-07-02 01:13:49 +02:00
|
|
|
|
2018-04-20 02:39:30 +02:00
|
|
|
|
cross-platform compatibility improvements
Summary:
We've had a couple CockroachDB users fail to build RocksDB on exotic platforms, so I figured I'd try my hand at solving these issues upstream. The problems stem from a) `USE_SSE=1` being too aggressive about turning on SSE4.2, even on toolchains that don't support SSE4.2 and b) RocksDB attempting to detect support for thread-local storage based on OS, even though it can vary by compiler on the same OS.
See the individual commit messages for details. Regarding SSE support, this PR should change virtually nothing for non-CMake based builds. `make`, `PORTABLE=1 make`, `USE_SSE=1 make`, and `PORTABLE=1 USE_SSE=1 make` function exactly as before, except that SSE support will be automatically disabled when a simple SSE4.2-using test program fails to compile, as it does on OpenBSD. (OpenBSD's ports GCC supports SSE4.2, but its binutils do not, so `__SSE_4_2__` is defined but an SSE4.2-using program will fail to assemble.) A warning is emitted in this case. The CMake build is modified to support the same set of options, except that `USE_SSE` is spelled `FORCE_SSE42` because `USE_SSE` is rather useless now that we can automatically detect SSE support, and I figure changing options in the CMake build is less disruptive than changing the non-CMake build.
I've tested these changes on all the platforms I can get my hands on (macOS, Windows MSVC, Windows MinGW, and OpenBSD) and it all works splendidly. Let me know if there's anything you object to—I obviously don't mean to break any of your build pipelines in the process of fixing ours downstream.
Closes https://github.com/facebook/rocksdb/pull/2199
Differential Revision: D5054042
Pulled By: yiwu-arbug
fbshipit-source-id: 938e1fc665c049c02ae15698e1409155b8e72171
2017-05-15 23:42:32 +02:00
|
|
|
option(WITH_MD_LIBRARY "build with MD" ON)
|
|
|
|
if(WIN32 AND MSVC)
|
|
|
|
if(WITH_MD_LIBRARY)
|
|
|
|
set(RUNTIME_LIBRARY "MD")
|
|
|
|
else()
|
|
|
|
set(RUNTIME_LIBRARY "MT")
|
2017-04-03 18:58:35 +02:00
|
|
|
endif()
|
cross-platform compatibility improvements
Summary:
We've had a couple CockroachDB users fail to build RocksDB on exotic platforms, so I figured I'd try my hand at solving these issues upstream. The problems stem from a) `USE_SSE=1` being too aggressive about turning on SSE4.2, even on toolchains that don't support SSE4.2 and b) RocksDB attempting to detect support for thread-local storage based on OS, even though it can vary by compiler on the same OS.
See the individual commit messages for details. Regarding SSE support, this PR should change virtually nothing for non-CMake based builds. `make`, `PORTABLE=1 make`, `USE_SSE=1 make`, and `PORTABLE=1 USE_SSE=1 make` function exactly as before, except that SSE support will be automatically disabled when a simple SSE4.2-using test program fails to compile, as it does on OpenBSD. (OpenBSD's ports GCC supports SSE4.2, but its binutils do not, so `__SSE_4_2__` is defined but an SSE4.2-using program will fail to assemble.) A warning is emitted in this case. The CMake build is modified to support the same set of options, except that `USE_SSE` is spelled `FORCE_SSE42` because `USE_SSE` is rather useless now that we can automatically detect SSE support, and I figure changing options in the CMake build is less disruptive than changing the non-CMake build.
I've tested these changes on all the platforms I can get my hands on (macOS, Windows MSVC, Windows MinGW, and OpenBSD) and it all works splendidly. Let me know if there's anything you object to—I obviously don't mean to break any of your build pipelines in the process of fixing ours downstream.
Closes https://github.com/facebook/rocksdb/pull/2199
Differential Revision: D5054042
Pulled By: yiwu-arbug
fbshipit-source-id: 938e1fc665c049c02ae15698e1409155b8e72171
2017-05-15 23:42:32 +02:00
|
|
|
endif()
|
2017-04-22 05:41:37 +02:00
|
|
|
|
2017-08-14 06:46:05 +02:00
|
|
|
set(BUILD_VERSION_CC ${CMAKE_BINARY_DIR}/build_version.cc)
|
|
|
|
configure_file(util/build_version.cc.in ${BUILD_VERSION_CC} @ONLY)
|
|
|
|
add_library(build_version OBJECT ${BUILD_VERSION_CC})
|
|
|
|
target_include_directories(build_version PRIVATE
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/util)
|
|
|
|
if(MSVC)
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi /nologo /EHsc /GS /Gd /GR /GF /fp:precise /Zc:wchar_t /Zc:forScope /errorReport:queue")
|
2017-10-19 19:48:47 +02:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4800 /wd4996 /wd4351 /wd4100 /wd4204 /wd4324")
|
2017-08-14 06:46:05 +02:00
|
|
|
else()
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wextra -Wall")
|
2017-09-19 19:15:13 +02:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsign-compare -Wshadow -Wno-unused-parameter -Wno-unused-variable -Woverloaded-virtual -Wnon-virtual-dtor -Wno-missing-field-initializers -Wno-strict-aliasing")
|
2017-08-14 06:46:05 +02:00
|
|
|
if(MINGW)
|
2019-12-09 06:33:23 +01:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-format -fno-asynchronous-unwind-tables")
|
2019-06-17 19:15:58 +02:00
|
|
|
add_definitions(-D_POSIX_C_SOURCE=1)
|
2017-08-14 06:46:05 +02:00
|
|
|
endif()
|
|
|
|
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
2018-07-13 19:47:49 +02:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
|
2017-08-14 06:46:05 +02:00
|
|
|
include(CheckCXXCompilerFlag)
|
|
|
|
CHECK_CXX_COMPILER_FLAG("-momit-leaf-frame-pointer" HAVE_OMIT_LEAF_FRAME_POINTER)
|
|
|
|
if(HAVE_OMIT_LEAF_FRAME_POINTER)
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -momit-leaf-frame-pointer")
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
2018-01-24 01:44:09 +01:00
|
|
|
include(CheckCCompilerFlag)
|
2020-03-11 20:31:06 +01:00
|
|
|
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
|
|
|
|
CHECK_C_COMPILER_FLAG("-mcpu=power9" HAS_POWER9)
|
|
|
|
if(HAS_POWER9)
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=power9 -mtune=power9")
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=power9 -mtune=power9")
|
|
|
|
else()
|
|
|
|
CHECK_C_COMPILER_FLAG("-mcpu=power8" HAS_POWER8)
|
|
|
|
if(HAS_POWER8)
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=power8 -mtune=power8")
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=power8 -mtune=power8")
|
|
|
|
endif(HAS_POWER8)
|
|
|
|
endif(HAS_POWER9)
|
2018-01-24 01:44:09 +01:00
|
|
|
CHECK_C_COMPILER_FLAG("-maltivec" HAS_ALTIVEC)
|
|
|
|
if(HAS_ALTIVEC)
|
|
|
|
message(STATUS " HAS_ALTIVEC yes")
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maltivec")
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maltivec")
|
|
|
|
endif(HAS_ALTIVEC)
|
2020-03-11 20:31:06 +01:00
|
|
|
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
|
2018-01-24 01:44:09 +01:00
|
|
|
|
2019-05-15 22:24:36 +02:00
|
|
|
if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")
|
2019-09-07 02:01:45 +02:00
|
|
|
CHECK_C_COMPILER_FLAG("-march=armv8-a+crc+crypto" HAS_ARMV8_CRC)
|
2019-05-15 22:24:36 +02:00
|
|
|
if(HAS_ARMV8_CRC)
|
|
|
|
message(STATUS " HAS_ARMV8_CRC yes")
|
2019-09-07 02:01:45 +02:00
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a+crc+crypto -Wno-unused-function")
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a+crc+crypto -Wno-unused-function")
|
2019-05-15 22:24:36 +02:00
|
|
|
endif(HAS_ARMV8_CRC)
|
|
|
|
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")
|
|
|
|
|
cross-platform compatibility improvements
Summary:
We've had a couple CockroachDB users fail to build RocksDB on exotic platforms, so I figured I'd try my hand at solving these issues upstream. The problems stem from a) `USE_SSE=1` being too aggressive about turning on SSE4.2, even on toolchains that don't support SSE4.2 and b) RocksDB attempting to detect support for thread-local storage based on OS, even though it can vary by compiler on the same OS.
See the individual commit messages for details. Regarding SSE support, this PR should change virtually nothing for non-CMake based builds. `make`, `PORTABLE=1 make`, `USE_SSE=1 make`, and `PORTABLE=1 USE_SSE=1 make` function exactly as before, except that SSE support will be automatically disabled when a simple SSE4.2-using test program fails to compile, as it does on OpenBSD. (OpenBSD's ports GCC supports SSE4.2, but its binutils do not, so `__SSE_4_2__` is defined but an SSE4.2-using program will fail to assemble.) A warning is emitted in this case. The CMake build is modified to support the same set of options, except that `USE_SSE` is spelled `FORCE_SSE42` because `USE_SSE` is rather useless now that we can automatically detect SSE support, and I figure changing options in the CMake build is less disruptive than changing the non-CMake build.
I've tested these changes on all the platforms I can get my hands on (macOS, Windows MSVC, Windows MinGW, and OpenBSD) and it all works splendidly. Let me know if there's anything you object to—I obviously don't mean to break any of your build pipelines in the process of fixing ours downstream.
Closes https://github.com/facebook/rocksdb/pull/2199
Differential Revision: D5054042
Pulled By: yiwu-arbug
fbshipit-source-id: 938e1fc665c049c02ae15698e1409155b8e72171
2017-05-15 23:42:32 +02:00
|
|
|
option(PORTABLE "build a portable binary" OFF)
|
|
|
|
option(FORCE_SSE42 "force building with SSE4.2, even when PORTABLE=ON" OFF)
|
2020-09-03 17:02:39 +02:00
|
|
|
option(FORCE_AVX "force building with AVX, even when PORTABLE=ON" OFF)
|
|
|
|
option(FORCE_AVX2 "force building with AVX2, even when PORTABLE=ON" OFF)
|
cross-platform compatibility improvements
Summary:
We've had a couple CockroachDB users fail to build RocksDB on exotic platforms, so I figured I'd try my hand at solving these issues upstream. The problems stem from a) `USE_SSE=1` being too aggressive about turning on SSE4.2, even on toolchains that don't support SSE4.2 and b) RocksDB attempting to detect support for thread-local storage based on OS, even though it can vary by compiler on the same OS.
See the individual commit messages for details. Regarding SSE support, this PR should change virtually nothing for non-CMake based builds. `make`, `PORTABLE=1 make`, `USE_SSE=1 make`, and `PORTABLE=1 USE_SSE=1 make` function exactly as before, except that SSE support will be automatically disabled when a simple SSE4.2-using test program fails to compile, as it does on OpenBSD. (OpenBSD's ports GCC supports SSE4.2, but its binutils do not, so `__SSE_4_2__` is defined but an SSE4.2-using program will fail to assemble.) A warning is emitted in this case. The CMake build is modified to support the same set of options, except that `USE_SSE` is spelled `FORCE_SSE42` because `USE_SSE` is rather useless now that we can automatically detect SSE support, and I figure changing options in the CMake build is less disruptive than changing the non-CMake build.
I've tested these changes on all the platforms I can get my hands on (macOS, Windows MSVC, Windows MinGW, and OpenBSD) and it all works splendidly. Let me know if there's anything you object to—I obviously don't mean to break any of your build pipelines in the process of fixing ours downstream.
Closes https://github.com/facebook/rocksdb/pull/2199
Differential Revision: D5054042
Pulled By: yiwu-arbug
fbshipit-source-id: 938e1fc665c049c02ae15698e1409155b8e72171
2017-05-15 23:42:32 +02:00
|
|
|
if(PORTABLE)
|
|
|
|
# MSVC does not need a separate compiler flag to enable SSE4.2; if nmmintrin.h
|
|
|
|
# is available, it is available by default.
|
|
|
|
if(FORCE_SSE42 AND NOT MSVC)
|
Port 3 way SSE4.2 crc32c implementation from Folly
Summary:
**# Summary**
RocksDB uses SSE crc32 intrinsics to calculate the crc32 values but it does it in single way fashion (not pipelined on single CPU core). Intel's whitepaper () published an algorithm that uses 3-way pipelining for the crc32 intrinsics, then use pclmulqdq intrinsic to combine the values. Because pclmulqdq has overhead on its own, this algorithm will show perf gains on buffers larger than 216 bytes, which makes RocksDB a perfect user, since most of the buffers RocksDB call crc32c on is over 4KB. Initial db_bench show tremendous CPU gain.
This change uses the 3-way SSE algorithm by default. The old SSE algorithm is now behind a compiler tag NO_THREEWAY_CRC32C. If user compiles the code with NO_THREEWAY_CRC32C=1 then the old SSE Crc32c algorithm would be used. If the server does not have SSE4.2 at the run time the slow way (Non SSE) will be used.
**# Performance Test Results**
We ran the FillRandom and ReadRandom benchmarks in db_bench. ReadRandom is the point of interest here since it calculates the CRC32 for the in-mem buffers. We did 3 runs for each algorithm.
Before this change the CRC32 value computation takes about 11.5% of total CPU cost, and with the new 3-way algorithm it reduced to around 4.5%. The overall throughput also improved from 25.53MB/s to 27.63MB/s.
1) ReadRandom in db_bench overall metrics
PER RUN
Algorithm | run | micros/op | ops/sec |Throughput (MB/s)
3-way | 1 | 4.143 | 241387 | 26.7
3-way | 2 | 3.775 | 264872 | 29.3
3-way | 3 | 4.116 | 242929 | 26.9
FastCrc32c|1 | 4.037 | 247727 | 27.4
FastCrc32c|2 | 4.648 | 215166 | 23.8
FastCrc32c|3 | 4.352 | 229799 | 25.4
AVG
Algorithm | Average of micros/op | Average of ops/sec | Average of Throughput (MB/s)
3-way | 4.01 | 249,729 | 27.63
FastCrc32c | 4.35 | 230,897 | 25.53
2) Crc32c computation CPU cost (inclusive samples percentage)
PER RUN
Implementation | run | TotalSamples | Crc32c percentage
3-way | 1 | 4,572,250,000 | 4.37%
3-way | 2 | 3,779,250,000 | 4.62%
3-way | 3 | 4,129,500,000 | 4.48%
FastCrc32c | 1 | 4,663,500,000 | 11.24%
FastCrc32c | 2 | 4,047,500,000 | 12.34%
FastCrc32c | 3 | 4,366,750,000 | 11.68%
**# Test Plan**
make -j64 corruption_test && ./corruption_test
By default it uses 3-way SSE algorithm
NO_THREEWAY_CRC32C=1 make -j64 corruption_test && ./corruption_test
make clean && DEBUG_LEVEL=0 make -j64 db_bench
make clean && DEBUG_LEVEL=0 NO_THREEWAY_CRC32C=1 make -j64 db_bench
Closes https://github.com/facebook/rocksdb/pull/3173
Differential Revision: D6330882
Pulled By: yingsu00
fbshipit-source-id: 8ec3d89719533b63b536a736663ca6f0dd4482e9
2017-12-20 03:20:50 +01:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -mpclmul")
|
2017-04-22 05:41:37 +02:00
|
|
|
endif()
|
2020-09-03 17:02:39 +02:00
|
|
|
if(MSVC)
|
|
|
|
if(FORCE_AVX)
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX")
|
|
|
|
endif()
|
|
|
|
# MSVC automatically enables BMI / lzcnt with AVX2.
|
|
|
|
if(FORCE_AVX2)
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
|
|
|
|
endif()
|
|
|
|
else()
|
|
|
|
if(FORCE_AVX)
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx")
|
|
|
|
endif()
|
|
|
|
if(FORCE_AVX2)
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -mbmi -mlzcnt")
|
|
|
|
endif()
|
|
|
|
endif()
|
2017-04-16 20:41:12 +02:00
|
|
|
else()
|
cross-platform compatibility improvements
Summary:
We've had a couple CockroachDB users fail to build RocksDB on exotic platforms, so I figured I'd try my hand at solving these issues upstream. The problems stem from a) `USE_SSE=1` being too aggressive about turning on SSE4.2, even on toolchains that don't support SSE4.2 and b) RocksDB attempting to detect support for thread-local storage based on OS, even though it can vary by compiler on the same OS.
See the individual commit messages for details. Regarding SSE support, this PR should change virtually nothing for non-CMake based builds. `make`, `PORTABLE=1 make`, `USE_SSE=1 make`, and `PORTABLE=1 USE_SSE=1 make` function exactly as before, except that SSE support will be automatically disabled when a simple SSE4.2-using test program fails to compile, as it does on OpenBSD. (OpenBSD's ports GCC supports SSE4.2, but its binutils do not, so `__SSE_4_2__` is defined but an SSE4.2-using program will fail to assemble.) A warning is emitted in this case. The CMake build is modified to support the same set of options, except that `USE_SSE` is spelled `FORCE_SSE42` because `USE_SSE` is rather useless now that we can automatically detect SSE support, and I figure changing options in the CMake build is less disruptive than changing the non-CMake build.
I've tested these changes on all the platforms I can get my hands on (macOS, Windows MSVC, Windows MinGW, and OpenBSD) and it all works splendidly. Let me know if there's anything you object to—I obviously don't mean to break any of your build pipelines in the process of fixing ours downstream.
Closes https://github.com/facebook/rocksdb/pull/2199
Differential Revision: D5054042
Pulled By: yiwu-arbug
fbshipit-source-id: 938e1fc665c049c02ae15698e1409155b8e72171
2017-05-15 23:42:32 +02:00
|
|
|
if(MSVC)
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
|
|
|
|
else()
|
2020-03-11 20:31:06 +01:00
|
|
|
if(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64" AND NOT HAS_ARMV8_CRC)
|
2018-01-24 01:44:09 +01:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
|
|
|
|
endif()
|
2017-04-16 20:41:12 +02:00
|
|
|
endif()
|
2017-04-03 18:58:35 +02:00
|
|
|
endif()
|
|
|
|
|
cross-platform compatibility improvements
Summary:
We've had a couple CockroachDB users fail to build RocksDB on exotic platforms, so I figured I'd try my hand at solving these issues upstream. The problems stem from a) `USE_SSE=1` being too aggressive about turning on SSE4.2, even on toolchains that don't support SSE4.2 and b) RocksDB attempting to detect support for thread-local storage based on OS, even though it can vary by compiler on the same OS.
See the individual commit messages for details. Regarding SSE support, this PR should change virtually nothing for non-CMake based builds. `make`, `PORTABLE=1 make`, `USE_SSE=1 make`, and `PORTABLE=1 USE_SSE=1 make` function exactly as before, except that SSE support will be automatically disabled when a simple SSE4.2-using test program fails to compile, as it does on OpenBSD. (OpenBSD's ports GCC supports SSE4.2, but its binutils do not, so `__SSE_4_2__` is defined but an SSE4.2-using program will fail to assemble.) A warning is emitted in this case. The CMake build is modified to support the same set of options, except that `USE_SSE` is spelled `FORCE_SSE42` because `USE_SSE` is rather useless now that we can automatically detect SSE support, and I figure changing options in the CMake build is less disruptive than changing the non-CMake build.
I've tested these changes on all the platforms I can get my hands on (macOS, Windows MSVC, Windows MinGW, and OpenBSD) and it all works splendidly. Let me know if there's anything you object to—I obviously don't mean to break any of your build pipelines in the process of fixing ours downstream.
Closes https://github.com/facebook/rocksdb/pull/2199
Differential Revision: D5054042
Pulled By: yiwu-arbug
fbshipit-source-id: 938e1fc665c049c02ae15698e1409155b8e72171
2017-05-15 23:42:32 +02:00
|
|
|
include(CheckCXXSourceCompiles)
|
2017-10-11 21:14:53 +02:00
|
|
|
if(NOT MSVC)
|
Port 3 way SSE4.2 crc32c implementation from Folly
Summary:
**# Summary**
RocksDB uses SSE crc32 intrinsics to calculate the crc32 values but it does it in single way fashion (not pipelined on single CPU core). Intel's whitepaper () published an algorithm that uses 3-way pipelining for the crc32 intrinsics, then use pclmulqdq intrinsic to combine the values. Because pclmulqdq has overhead on its own, this algorithm will show perf gains on buffers larger than 216 bytes, which makes RocksDB a perfect user, since most of the buffers RocksDB call crc32c on is over 4KB. Initial db_bench show tremendous CPU gain.
This change uses the 3-way SSE algorithm by default. The old SSE algorithm is now behind a compiler tag NO_THREEWAY_CRC32C. If user compiles the code with NO_THREEWAY_CRC32C=1 then the old SSE Crc32c algorithm would be used. If the server does not have SSE4.2 at the run time the slow way (Non SSE) will be used.
**# Performance Test Results**
We ran the FillRandom and ReadRandom benchmarks in db_bench. ReadRandom is the point of interest here since it calculates the CRC32 for the in-mem buffers. We did 3 runs for each algorithm.
Before this change the CRC32 value computation takes about 11.5% of total CPU cost, and with the new 3-way algorithm it reduced to around 4.5%. The overall throughput also improved from 25.53MB/s to 27.63MB/s.
1) ReadRandom in db_bench overall metrics
PER RUN
Algorithm | run | micros/op | ops/sec |Throughput (MB/s)
3-way | 1 | 4.143 | 241387 | 26.7
3-way | 2 | 3.775 | 264872 | 29.3
3-way | 3 | 4.116 | 242929 | 26.9
FastCrc32c|1 | 4.037 | 247727 | 27.4
FastCrc32c|2 | 4.648 | 215166 | 23.8
FastCrc32c|3 | 4.352 | 229799 | 25.4
AVG
Algorithm | Average of micros/op | Average of ops/sec | Average of Throughput (MB/s)
3-way | 4.01 | 249,729 | 27.63
FastCrc32c | 4.35 | 230,897 | 25.53
2) Crc32c computation CPU cost (inclusive samples percentage)
PER RUN
Implementation | run | TotalSamples | Crc32c percentage
3-way | 1 | 4,572,250,000 | 4.37%
3-way | 2 | 3,779,250,000 | 4.62%
3-way | 3 | 4,129,500,000 | 4.48%
FastCrc32c | 1 | 4,663,500,000 | 11.24%
FastCrc32c | 2 | 4,047,500,000 | 12.34%
FastCrc32c | 3 | 4,366,750,000 | 11.68%
**# Test Plan**
make -j64 corruption_test && ./corruption_test
By default it uses 3-way SSE algorithm
NO_THREEWAY_CRC32C=1 make -j64 corruption_test && ./corruption_test
make clean && DEBUG_LEVEL=0 make -j64 db_bench
make clean && DEBUG_LEVEL=0 NO_THREEWAY_CRC32C=1 make -j64 db_bench
Closes https://github.com/facebook/rocksdb/pull/3173
Differential Revision: D6330882
Pulled By: yingsu00
fbshipit-source-id: 8ec3d89719533b63b536a736663ca6f0dd4482e9
2017-12-20 03:20:50 +01:00
|
|
|
set(CMAKE_REQUIRED_FLAGS "-msse4.2 -mpclmul")
|
2017-10-11 21:14:53 +02:00
|
|
|
endif()
|
2020-04-20 22:21:34 +02:00
|
|
|
|
cross-platform compatibility improvements
Summary:
We've had a couple CockroachDB users fail to build RocksDB on exotic platforms, so I figured I'd try my hand at solving these issues upstream. The problems stem from a) `USE_SSE=1` being too aggressive about turning on SSE4.2, even on toolchains that don't support SSE4.2 and b) RocksDB attempting to detect support for thread-local storage based on OS, even though it can vary by compiler on the same OS.
See the individual commit messages for details. Regarding SSE support, this PR should change virtually nothing for non-CMake based builds. `make`, `PORTABLE=1 make`, `USE_SSE=1 make`, and `PORTABLE=1 USE_SSE=1 make` function exactly as before, except that SSE support will be automatically disabled when a simple SSE4.2-using test program fails to compile, as it does on OpenBSD. (OpenBSD's ports GCC supports SSE4.2, but its binutils do not, so `__SSE_4_2__` is defined but an SSE4.2-using program will fail to assemble.) A warning is emitted in this case. The CMake build is modified to support the same set of options, except that `USE_SSE` is spelled `FORCE_SSE42` because `USE_SSE` is rather useless now that we can automatically detect SSE support, and I figure changing options in the CMake build is less disruptive than changing the non-CMake build.
I've tested these changes on all the platforms I can get my hands on (macOS, Windows MSVC, Windows MinGW, and OpenBSD) and it all works splendidly. Let me know if there's anything you object to—I obviously don't mean to break any of your build pipelines in the process of fixing ours downstream.
Closes https://github.com/facebook/rocksdb/pull/2199
Differential Revision: D5054042
Pulled By: yiwu-arbug
fbshipit-source-id: 938e1fc665c049c02ae15698e1409155b8e72171
2017-05-15 23:42:32 +02:00
|
|
|
CHECK_CXX_SOURCE_COMPILES("
|
|
|
|
#include <cstdint>
|
|
|
|
#include <nmmintrin.h>
|
Port 3 way SSE4.2 crc32c implementation from Folly
Summary:
**# Summary**
RocksDB uses SSE crc32 intrinsics to calculate the crc32 values but it does it in single way fashion (not pipelined on single CPU core). Intel's whitepaper () published an algorithm that uses 3-way pipelining for the crc32 intrinsics, then use pclmulqdq intrinsic to combine the values. Because pclmulqdq has overhead on its own, this algorithm will show perf gains on buffers larger than 216 bytes, which makes RocksDB a perfect user, since most of the buffers RocksDB call crc32c on is over 4KB. Initial db_bench show tremendous CPU gain.
This change uses the 3-way SSE algorithm by default. The old SSE algorithm is now behind a compiler tag NO_THREEWAY_CRC32C. If user compiles the code with NO_THREEWAY_CRC32C=1 then the old SSE Crc32c algorithm would be used. If the server does not have SSE4.2 at the run time the slow way (Non SSE) will be used.
**# Performance Test Results**
We ran the FillRandom and ReadRandom benchmarks in db_bench. ReadRandom is the point of interest here since it calculates the CRC32 for the in-mem buffers. We did 3 runs for each algorithm.
Before this change the CRC32 value computation takes about 11.5% of total CPU cost, and with the new 3-way algorithm it reduced to around 4.5%. The overall throughput also improved from 25.53MB/s to 27.63MB/s.
1) ReadRandom in db_bench overall metrics
PER RUN
Algorithm | run | micros/op | ops/sec |Throughput (MB/s)
3-way | 1 | 4.143 | 241387 | 26.7
3-way | 2 | 3.775 | 264872 | 29.3
3-way | 3 | 4.116 | 242929 | 26.9
FastCrc32c|1 | 4.037 | 247727 | 27.4
FastCrc32c|2 | 4.648 | 215166 | 23.8
FastCrc32c|3 | 4.352 | 229799 | 25.4
AVG
Algorithm | Average of micros/op | Average of ops/sec | Average of Throughput (MB/s)
3-way | 4.01 | 249,729 | 27.63
FastCrc32c | 4.35 | 230,897 | 25.53
2) Crc32c computation CPU cost (inclusive samples percentage)
PER RUN
Implementation | run | TotalSamples | Crc32c percentage
3-way | 1 | 4,572,250,000 | 4.37%
3-way | 2 | 3,779,250,000 | 4.62%
3-way | 3 | 4,129,500,000 | 4.48%
FastCrc32c | 1 | 4,663,500,000 | 11.24%
FastCrc32c | 2 | 4,047,500,000 | 12.34%
FastCrc32c | 3 | 4,366,750,000 | 11.68%
**# Test Plan**
make -j64 corruption_test && ./corruption_test
By default it uses 3-way SSE algorithm
NO_THREEWAY_CRC32C=1 make -j64 corruption_test && ./corruption_test
make clean && DEBUG_LEVEL=0 make -j64 db_bench
make clean && DEBUG_LEVEL=0 NO_THREEWAY_CRC32C=1 make -j64 db_bench
Closes https://github.com/facebook/rocksdb/pull/3173
Differential Revision: D6330882
Pulled By: yingsu00
fbshipit-source-id: 8ec3d89719533b63b536a736663ca6f0dd4482e9
2017-12-20 03:20:50 +01:00
|
|
|
#include <wmmintrin.h>
|
cross-platform compatibility improvements
Summary:
We've had a couple CockroachDB users fail to build RocksDB on exotic platforms, so I figured I'd try my hand at solving these issues upstream. The problems stem from a) `USE_SSE=1` being too aggressive about turning on SSE4.2, even on toolchains that don't support SSE4.2 and b) RocksDB attempting to detect support for thread-local storage based on OS, even though it can vary by compiler on the same OS.
See the individual commit messages for details. Regarding SSE support, this PR should change virtually nothing for non-CMake based builds. `make`, `PORTABLE=1 make`, `USE_SSE=1 make`, and `PORTABLE=1 USE_SSE=1 make` function exactly as before, except that SSE support will be automatically disabled when a simple SSE4.2-using test program fails to compile, as it does on OpenBSD. (OpenBSD's ports GCC supports SSE4.2, but its binutils do not, so `__SSE_4_2__` is defined but an SSE4.2-using program will fail to assemble.) A warning is emitted in this case. The CMake build is modified to support the same set of options, except that `USE_SSE` is spelled `FORCE_SSE42` because `USE_SSE` is rather useless now that we can automatically detect SSE support, and I figure changing options in the CMake build is less disruptive than changing the non-CMake build.
I've tested these changes on all the platforms I can get my hands on (macOS, Windows MSVC, Windows MinGW, and OpenBSD) and it all works splendidly. Let me know if there's anything you object to—I obviously don't mean to break any of your build pipelines in the process of fixing ours downstream.
Closes https://github.com/facebook/rocksdb/pull/2199
Differential Revision: D5054042
Pulled By: yiwu-arbug
fbshipit-source-id: 938e1fc665c049c02ae15698e1409155b8e72171
2017-05-15 23:42:32 +02:00
|
|
|
int main() {
|
|
|
|
volatile uint32_t x = _mm_crc32_u32(0, 0);
|
Port 3 way SSE4.2 crc32c implementation from Folly
Summary:
**# Summary**
RocksDB uses SSE crc32 intrinsics to calculate the crc32 values but it does it in single way fashion (not pipelined on single CPU core). Intel's whitepaper () published an algorithm that uses 3-way pipelining for the crc32 intrinsics, then use pclmulqdq intrinsic to combine the values. Because pclmulqdq has overhead on its own, this algorithm will show perf gains on buffers larger than 216 bytes, which makes RocksDB a perfect user, since most of the buffers RocksDB call crc32c on is over 4KB. Initial db_bench show tremendous CPU gain.
This change uses the 3-way SSE algorithm by default. The old SSE algorithm is now behind a compiler tag NO_THREEWAY_CRC32C. If user compiles the code with NO_THREEWAY_CRC32C=1 then the old SSE Crc32c algorithm would be used. If the server does not have SSE4.2 at the run time the slow way (Non SSE) will be used.
**# Performance Test Results**
We ran the FillRandom and ReadRandom benchmarks in db_bench. ReadRandom is the point of interest here since it calculates the CRC32 for the in-mem buffers. We did 3 runs for each algorithm.
Before this change the CRC32 value computation takes about 11.5% of total CPU cost, and with the new 3-way algorithm it reduced to around 4.5%. The overall throughput also improved from 25.53MB/s to 27.63MB/s.
1) ReadRandom in db_bench overall metrics
PER RUN
Algorithm | run | micros/op | ops/sec |Throughput (MB/s)
3-way | 1 | 4.143 | 241387 | 26.7
3-way | 2 | 3.775 | 264872 | 29.3
3-way | 3 | 4.116 | 242929 | 26.9
FastCrc32c|1 | 4.037 | 247727 | 27.4
FastCrc32c|2 | 4.648 | 215166 | 23.8
FastCrc32c|3 | 4.352 | 229799 | 25.4
AVG
Algorithm | Average of micros/op | Average of ops/sec | Average of Throughput (MB/s)
3-way | 4.01 | 249,729 | 27.63
FastCrc32c | 4.35 | 230,897 | 25.53
2) Crc32c computation CPU cost (inclusive samples percentage)
PER RUN
Implementation | run | TotalSamples | Crc32c percentage
3-way | 1 | 4,572,250,000 | 4.37%
3-way | 2 | 3,779,250,000 | 4.62%
3-way | 3 | 4,129,500,000 | 4.48%
FastCrc32c | 1 | 4,663,500,000 | 11.24%
FastCrc32c | 2 | 4,047,500,000 | 12.34%
FastCrc32c | 3 | 4,366,750,000 | 11.68%
**# Test Plan**
make -j64 corruption_test && ./corruption_test
By default it uses 3-way SSE algorithm
NO_THREEWAY_CRC32C=1 make -j64 corruption_test && ./corruption_test
make clean && DEBUG_LEVEL=0 make -j64 db_bench
make clean && DEBUG_LEVEL=0 NO_THREEWAY_CRC32C=1 make -j64 db_bench
Closes https://github.com/facebook/rocksdb/pull/3173
Differential Revision: D6330882
Pulled By: yingsu00
fbshipit-source-id: 8ec3d89719533b63b536a736663ca6f0dd4482e9
2017-12-20 03:20:50 +01:00
|
|
|
const auto a = _mm_set_epi64x(0, 0);
|
|
|
|
const auto b = _mm_set_epi64x(0, 0);
|
|
|
|
const auto c = _mm_clmulepi64_si128(a, b, 0x00);
|
|
|
|
auto d = _mm_cvtsi128_si64(c);
|
cross-platform compatibility improvements
Summary:
We've had a couple CockroachDB users fail to build RocksDB on exotic platforms, so I figured I'd try my hand at solving these issues upstream. The problems stem from a) `USE_SSE=1` being too aggressive about turning on SSE4.2, even on toolchains that don't support SSE4.2 and b) RocksDB attempting to detect support for thread-local storage based on OS, even though it can vary by compiler on the same OS.
See the individual commit messages for details. Regarding SSE support, this PR should change virtually nothing for non-CMake based builds. `make`, `PORTABLE=1 make`, `USE_SSE=1 make`, and `PORTABLE=1 USE_SSE=1 make` function exactly as before, except that SSE support will be automatically disabled when a simple SSE4.2-using test program fails to compile, as it does on OpenBSD. (OpenBSD's ports GCC supports SSE4.2, but its binutils do not, so `__SSE_4_2__` is defined but an SSE4.2-using program will fail to assemble.) A warning is emitted in this case. The CMake build is modified to support the same set of options, except that `USE_SSE` is spelled `FORCE_SSE42` because `USE_SSE` is rather useless now that we can automatically detect SSE support, and I figure changing options in the CMake build is less disruptive than changing the non-CMake build.
I've tested these changes on all the platforms I can get my hands on (macOS, Windows MSVC, Windows MinGW, and OpenBSD) and it all works splendidly. Let me know if there's anything you object to—I obviously don't mean to break any of your build pipelines in the process of fixing ours downstream.
Closes https://github.com/facebook/rocksdb/pull/2199
Differential Revision: D5054042
Pulled By: yiwu-arbug
fbshipit-source-id: 938e1fc665c049c02ae15698e1409155b8e72171
2017-05-15 23:42:32 +02:00
|
|
|
}
|
|
|
|
" HAVE_SSE42)
|
2017-10-11 21:14:53 +02:00
|
|
|
unset(CMAKE_REQUIRED_FLAGS)
|
cross-platform compatibility improvements
Summary:
We've had a couple CockroachDB users fail to build RocksDB on exotic platforms, so I figured I'd try my hand at solving these issues upstream. The problems stem from a) `USE_SSE=1` being too aggressive about turning on SSE4.2, even on toolchains that don't support SSE4.2 and b) RocksDB attempting to detect support for thread-local storage based on OS, even though it can vary by compiler on the same OS.
See the individual commit messages for details. Regarding SSE support, this PR should change virtually nothing for non-CMake based builds. `make`, `PORTABLE=1 make`, `USE_SSE=1 make`, and `PORTABLE=1 USE_SSE=1 make` function exactly as before, except that SSE support will be automatically disabled when a simple SSE4.2-using test program fails to compile, as it does on OpenBSD. (OpenBSD's ports GCC supports SSE4.2, but its binutils do not, so `__SSE_4_2__` is defined but an SSE4.2-using program will fail to assemble.) A warning is emitted in this case. The CMake build is modified to support the same set of options, except that `USE_SSE` is spelled `FORCE_SSE42` because `USE_SSE` is rather useless now that we can automatically detect SSE support, and I figure changing options in the CMake build is less disruptive than changing the non-CMake build.
I've tested these changes on all the platforms I can get my hands on (macOS, Windows MSVC, Windows MinGW, and OpenBSD) and it all works splendidly. Let me know if there's anything you object to—I obviously don't mean to break any of your build pipelines in the process of fixing ours downstream.
Closes https://github.com/facebook/rocksdb/pull/2199
Differential Revision: D5054042
Pulled By: yiwu-arbug
fbshipit-source-id: 938e1fc665c049c02ae15698e1409155b8e72171
2017-05-15 23:42:32 +02:00
|
|
|
if(HAVE_SSE42)
|
|
|
|
add_definitions(-DHAVE_SSE42)
|
2018-04-03 05:39:11 +02:00
|
|
|
add_definitions(-DHAVE_PCLMUL)
|
cross-platform compatibility improvements
Summary:
We've had a couple CockroachDB users fail to build RocksDB on exotic platforms, so I figured I'd try my hand at solving these issues upstream. The problems stem from a) `USE_SSE=1` being too aggressive about turning on SSE4.2, even on toolchains that don't support SSE4.2 and b) RocksDB attempting to detect support for thread-local storage based on OS, even though it can vary by compiler on the same OS.
See the individual commit messages for details. Regarding SSE support, this PR should change virtually nothing for non-CMake based builds. `make`, `PORTABLE=1 make`, `USE_SSE=1 make`, and `PORTABLE=1 USE_SSE=1 make` function exactly as before, except that SSE support will be automatically disabled when a simple SSE4.2-using test program fails to compile, as it does on OpenBSD. (OpenBSD's ports GCC supports SSE4.2, but its binutils do not, so `__SSE_4_2__` is defined but an SSE4.2-using program will fail to assemble.) A warning is emitted in this case. The CMake build is modified to support the same set of options, except that `USE_SSE` is spelled `FORCE_SSE42` because `USE_SSE` is rather useless now that we can automatically detect SSE support, and I figure changing options in the CMake build is less disruptive than changing the non-CMake build.
I've tested these changes on all the platforms I can get my hands on (macOS, Windows MSVC, Windows MinGW, and OpenBSD) and it all works splendidly. Let me know if there's anything you object to—I obviously don't mean to break any of your build pipelines in the process of fixing ours downstream.
Closes https://github.com/facebook/rocksdb/pull/2199
Differential Revision: D5054042
Pulled By: yiwu-arbug
fbshipit-source-id: 938e1fc665c049c02ae15698e1409155b8e72171
2017-05-15 23:42:32 +02:00
|
|
|
elseif(FORCE_SSE42)
|
|
|
|
message(FATAL_ERROR "FORCE_SSE42=ON but unable to compile with SSE4.2 enabled")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
CHECK_CXX_SOURCE_COMPILES("
|
|
|
|
#if defined(_MSC_VER) && !defined(__thread)
|
|
|
|
#define __thread __declspec(thread)
|
|
|
|
#endif
|
|
|
|
int main() {
|
|
|
|
static __thread int tls;
|
|
|
|
}
|
|
|
|
" HAVE_THREAD_LOCAL)
|
|
|
|
if(HAVE_THREAD_LOCAL)
|
|
|
|
add_definitions(-DROCKSDB_SUPPORT_THREAD_LOCAL)
|
|
|
|
endif()
|
|
|
|
|
2016-11-01 09:11:02 +01:00
|
|
|
option(FAIL_ON_WARNINGS "Treat compile warnings as errors" ON)
|
|
|
|
if(FAIL_ON_WARNINGS)
|
|
|
|
if(MSVC)
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX")
|
|
|
|
else() # assume GCC
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
2016-09-28 20:53:15 +02:00
|
|
|
option(WITH_ASAN "build with ASAN" OFF)
|
|
|
|
if(WITH_ASAN)
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
|
|
|
|
if(WITH_JEMALLOC)
|
|
|
|
message(FATAL "ASAN does not work well with JeMalloc")
|
|
|
|
endif()
|
|
|
|
endif()
|
2015-07-02 01:13:49 +02:00
|
|
|
|
2016-09-28 20:53:15 +02:00
|
|
|
option(WITH_TSAN "build with TSAN" OFF)
|
|
|
|
if(WITH_TSAN)
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread -pie")
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fPIC")
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread -fPIC")
|
|
|
|
if(WITH_JEMALLOC)
|
|
|
|
message(FATAL "TSAN does not work well with JeMalloc")
|
|
|
|
endif()
|
|
|
|
endif()
|
2015-11-19 01:23:19 +01:00
|
|
|
|
2016-09-28 20:53:15 +02:00
|
|
|
option(WITH_UBSAN "build with UBSAN" OFF)
|
|
|
|
if(WITH_UBSAN)
|
2017-05-30 20:05:28 +02:00
|
|
|
add_definitions(-DROCKSDB_UBSAN_RUN)
|
2016-09-28 20:53:15 +02:00
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined")
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined")
|
|
|
|
if(WITH_JEMALLOC)
|
|
|
|
message(FATAL "UBSAN does not work well with JeMalloc")
|
|
|
|
endif()
|
|
|
|
endif()
|
2015-07-02 01:13:49 +02:00
|
|
|
|
2018-04-25 23:26:11 +02:00
|
|
|
option(WITH_NUMA "build with NUMA policy support" OFF)
|
|
|
|
if(WITH_NUMA)
|
|
|
|
find_package(NUMA REQUIRED)
|
2017-12-01 07:37:19 +01:00
|
|
|
add_definitions(-DNUMA)
|
|
|
|
include_directories(${NUMA_INCLUDE_DIR})
|
2019-08-06 04:47:33 +02:00
|
|
|
list(APPEND THIRDPARTY_LIBS NUMA::NUMA)
|
2017-12-01 07:37:19 +01:00
|
|
|
endif()
|
|
|
|
|
2018-04-25 23:26:11 +02:00
|
|
|
option(WITH_TBB "build with Threading Building Blocks (TBB)" OFF)
|
|
|
|
if(WITH_TBB)
|
|
|
|
find_package(TBB REQUIRED)
|
2017-12-01 07:37:19 +01:00
|
|
|
add_definitions(-DTBB)
|
2019-08-06 04:47:33 +02:00
|
|
|
list(APPEND THIRDPARTY_LIBS TBB::TBB)
|
2017-12-01 07:37:19 +01:00
|
|
|
endif()
|
|
|
|
|
2018-05-09 19:04:55 +02:00
|
|
|
# Stall notifications eat some performance from inserts
|
|
|
|
option(DISABLE_STALL_NOTIF "Build with stall notifications" OFF)
|
|
|
|
if(DISABLE_STALL_NOTIF)
|
|
|
|
add_definitions(-DROCKSDB_DISABLE_STALL_NOTIFICATION)
|
|
|
|
endif()
|
|
|
|
|
2019-06-05 22:56:46 +02:00
|
|
|
option(WITH_DYNAMIC_EXTENSION "build with dynamic extension support" OFF)
|
|
|
|
if(NOT WITH_DYNAMIC_EXTENSION)
|
|
|
|
add_definitions(-DROCKSDB_NO_DYNAMIC_EXTENSION)
|
|
|
|
endif()
|
2015-09-29 21:22:48 +02:00
|
|
|
|
2018-05-07 23:17:49 +02:00
|
|
|
if(DEFINED USE_RTTI)
|
|
|
|
if(USE_RTTI)
|
|
|
|
message(STATUS "Enabling RTTI")
|
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
|
|
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DROCKSDB_USE_RTTI")
|
|
|
|
else()
|
2018-06-04 21:04:52 +02:00
|
|
|
if(MSVC)
|
|
|
|
message(STATUS "Disabling RTTI in Release builds. Always on in Debug.")
|
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
|
|
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GR-")
|
|
|
|
else()
|
|
|
|
message(STATUS "Disabling RTTI in Release builds")
|
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-rtti")
|
|
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-rtti")
|
|
|
|
endif()
|
2018-05-07 23:17:49 +02:00
|
|
|
endif()
|
2018-05-05 00:09:40 +02:00
|
|
|
else()
|
|
|
|
message(STATUS "Enabling RTTI in Debug builds only (default)")
|
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DROCKSDB_USE_RTTI")
|
2018-06-04 21:04:52 +02:00
|
|
|
if(MSVC)
|
|
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GR-")
|
|
|
|
else()
|
|
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-rtti")
|
|
|
|
endif()
|
2018-05-05 00:09:40 +02:00
|
|
|
endif()
|
|
|
|
|
2018-07-20 00:07:22 +02:00
|
|
|
# Used to run CI build and tests so we can run faster
|
|
|
|
option(OPTDBG "Build optimized debug build with MSVC" OFF)
|
2018-08-28 00:48:57 +02:00
|
|
|
option(WITH_RUNTIME_DEBUG "build with debug version of runtime library" ON)
|
2017-03-31 01:47:19 +02:00
|
|
|
if(MSVC)
|
2018-07-20 00:07:22 +02:00
|
|
|
if(OPTDBG)
|
2016-09-28 20:53:15 +02:00
|
|
|
message(STATUS "Debug optimization is enabled")
|
2018-08-28 00:48:57 +02:00
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "/Oxt")
|
2016-09-28 20:53:15 +02:00
|
|
|
else()
|
2020-04-20 22:21:34 +02:00
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /RTC1")
|
|
|
|
|
|
|
|
# Minimal Build is deprecated after MSVC 2015
|
|
|
|
if( MSVC_VERSION GREATER 1900 )
|
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Gm-")
|
|
|
|
else()
|
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Gm")
|
|
|
|
endif()
|
|
|
|
|
2018-08-28 00:48:57 +02:00
|
|
|
endif()
|
|
|
|
if(WITH_RUNTIME_DEBUG)
|
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /${RUNTIME_LIBRARY}d")
|
|
|
|
else()
|
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /${RUNTIME_LIBRARY}")
|
2016-09-28 20:53:15 +02:00
|
|
|
endif()
|
2017-04-22 05:41:37 +02:00
|
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oxt /Zp8 /Gm- /Gy /${RUNTIME_LIBRARY}")
|
2016-09-28 20:53:15 +02:00
|
|
|
|
|
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG")
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG")
|
2015-09-29 21:22:48 +02:00
|
|
|
endif()
|
|
|
|
|
2016-09-28 20:53:15 +02:00
|
|
|
if(CMAKE_COMPILER_IS_GNUCXX)
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-memcmp")
|
|
|
|
endif()
|
2015-07-02 01:13:49 +02:00
|
|
|
|
2016-09-28 20:53:15 +02:00
|
|
|
option(ROCKSDB_LITE "Build RocksDBLite version" OFF)
|
|
|
|
if(ROCKSDB_LITE)
|
|
|
|
add_definitions(-DROCKSDB_LITE)
|
2018-11-08 07:08:35 +01:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -Os")
|
2016-09-28 20:53:15 +02:00
|
|
|
endif()
|
2015-07-02 01:13:49 +02:00
|
|
|
|
2016-09-28 20:53:15 +02:00
|
|
|
if(CMAKE_SYSTEM_NAME MATCHES "Cygwin")
|
|
|
|
add_definitions(-fno-builtin-memcmp -DCYGWIN)
|
|
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
|
|
|
|
add_definitions(-DOS_MACOSX)
|
|
|
|
if(CMAKE_SYSTEM_PROCESSOR MATCHES arm)
|
|
|
|
add_definitions(-DIOS_CROSS_COMPILE -DROCKSDB_LITE)
|
|
|
|
# no debug info for IOS, that will make our library big
|
|
|
|
add_definitions(-DNDEBUG)
|
|
|
|
endif()
|
|
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
|
|
|
add_definitions(-DOS_LINUX)
|
|
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "SunOS")
|
|
|
|
add_definitions(-DOS_SOLARIS)
|
2020-06-18 18:50:05 +02:00
|
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "kFreeBSD")
|
|
|
|
add_definitions(-DOS_GNU_KFREEBSD)
|
2016-09-28 20:53:15 +02:00
|
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
|
|
|
|
add_definitions(-DOS_FREEBSD)
|
|
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "NetBSD")
|
|
|
|
add_definitions(-DOS_NETBSD)
|
|
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
|
|
|
|
add_definitions(-DOS_OPENBSD)
|
|
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly")
|
|
|
|
add_definitions(-DOS_DRAGONFLYBSD)
|
|
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "Android")
|
|
|
|
add_definitions(-DOS_ANDROID)
|
|
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
|
|
|
|
add_definitions(-DWIN32 -DOS_WIN -D_MBCS -DWIN64 -DNOMINMAX)
|
2017-03-31 01:47:19 +02:00
|
|
|
if(MINGW)
|
|
|
|
add_definitions(-D_WIN32_WINNT=_WIN32_WINNT_VISTA)
|
|
|
|
endif()
|
2016-09-28 20:53:15 +02:00
|
|
|
endif()
|
|
|
|
|
|
|
|
if(NOT WIN32)
|
|
|
|
add_definitions(-DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
option(WITH_FALLOCATE "build with fallocate" ON)
|
|
|
|
if(WITH_FALLOCATE)
|
2017-12-01 07:37:19 +01:00
|
|
|
CHECK_CXX_SOURCE_COMPILES("
|
2016-09-28 20:53:15 +02:00
|
|
|
#include <fcntl.h>
|
|
|
|
#include <linux/falloc.h>
|
|
|
|
int main() {
|
|
|
|
int fd = open(\"/dev/null\", 0);
|
2019-03-05 00:40:26 +01:00
|
|
|
fallocate(fd, FALLOC_FL_KEEP_SIZE, 0, 1024);
|
2016-09-28 20:53:15 +02:00
|
|
|
}
|
|
|
|
" HAVE_FALLOCATE)
|
|
|
|
if(HAVE_FALLOCATE)
|
|
|
|
add_definitions(-DROCKSDB_FALLOCATE_PRESENT)
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
2017-12-01 07:37:19 +01:00
|
|
|
CHECK_CXX_SOURCE_COMPILES("
|
|
|
|
#include <fcntl.h>
|
|
|
|
int main() {
|
|
|
|
int fd = open(\"/dev/null\", 0);
|
|
|
|
sync_file_range(fd, 0, 1024, SYNC_FILE_RANGE_WRITE);
|
|
|
|
}
|
|
|
|
" HAVE_SYNC_FILE_RANGE_WRITE)
|
|
|
|
if(HAVE_SYNC_FILE_RANGE_WRITE)
|
|
|
|
add_definitions(-DROCKSDB_RANGESYNC_PRESENT)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
CHECK_CXX_SOURCE_COMPILES("
|
|
|
|
#include <pthread.h>
|
|
|
|
int main() {
|
|
|
|
(void) PTHREAD_MUTEX_ADAPTIVE_NP;
|
|
|
|
}
|
|
|
|
" HAVE_PTHREAD_MUTEX_ADAPTIVE_NP)
|
|
|
|
if(HAVE_PTHREAD_MUTEX_ADAPTIVE_NP)
|
|
|
|
add_definitions(-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
include(CheckCXXSymbolExists)
|
2020-06-26 02:28:02 +02:00
|
|
|
if(CMAKE_SYSTEM_NAME MATCHES "^FreeBSD")
|
|
|
|
check_cxx_symbol_exists(malloc_usable_size malloc_np.h HAVE_MALLOC_USABLE_SIZE)
|
|
|
|
else()
|
|
|
|
check_cxx_symbol_exists(malloc_usable_size malloc.h HAVE_MALLOC_USABLE_SIZE)
|
|
|
|
endif()
|
2016-09-28 20:53:15 +02:00
|
|
|
if(HAVE_MALLOC_USABLE_SIZE)
|
|
|
|
add_definitions(-DROCKSDB_MALLOC_USABLE_SIZE)
|
|
|
|
endif()
|
2015-07-02 01:13:49 +02:00
|
|
|
|
2017-12-01 07:37:19 +01:00
|
|
|
check_cxx_symbol_exists(sched_getcpu sched.h HAVE_SCHED_GETCPU)
|
|
|
|
if(HAVE_SCHED_GETCPU)
|
|
|
|
add_definitions(-DROCKSDB_SCHED_GETCPU_PRESENT)
|
|
|
|
endif()
|
|
|
|
|
2020-03-04 03:06:56 +01:00
|
|
|
check_cxx_symbol_exists(getauxval auvx.h HAVE_AUXV_GETAUXVAL)
|
|
|
|
if(HAVE_AUXV_GETAUXVAL)
|
|
|
|
add_definitions(-DROCKSDB_AUXV_GETAUXVAL_PRESENT)
|
|
|
|
endif()
|
|
|
|
|
2015-07-02 01:13:49 +02:00
|
|
|
include_directories(${PROJECT_SOURCE_DIR})
|
|
|
|
include_directories(${PROJECT_SOURCE_DIR}/include)
|
2019-11-14 23:00:58 +01:00
|
|
|
if(WITH_FOLLY_DISTRIBUTED_MUTEX)
|
2019-08-07 23:29:35 +02:00
|
|
|
include_directories(${PROJECT_SOURCE_DIR}/third-party/folly)
|
|
|
|
endif()
|
2016-09-28 20:53:15 +02:00
|
|
|
find_package(Threads REQUIRED)
|
2015-07-02 01:13:49 +02:00
|
|
|
|
2015-10-20 22:35:08 +02:00
|
|
|
# Main library source code
|
2016-09-28 20:53:15 +02:00
|
|
|
|
2015-07-02 01:13:49 +02:00
|
|
|
set(SOURCES
|
2020-04-29 03:02:11 +02:00
|
|
|
cache/cache.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
cache/clock_cache.cc
|
|
|
|
cache/lru_cache.cc
|
|
|
|
cache/sharded_cache.cc
|
2019-09-13 22:48:04 +02:00
|
|
|
db/arena_wrapped_db_iter.cc
|
2020-03-12 18:58:27 +01:00
|
|
|
db/blob/blob_file_addition.cc
|
2020-08-27 20:54:43 +02:00
|
|
|
db/blob/blob_file_builder.cc
|
2020-03-12 18:58:27 +01:00
|
|
|
db/blob/blob_file_garbage.cc
|
Add blob files to VersionStorageInfo/VersionBuilder (#6597)
Summary:
The patch adds a couple of classes to represent metadata about
blob files: `SharedBlobFileMetaData` contains the information elements
that are immutable (once the blob file is closed), e.g. blob file number,
total number and size of blob files, checksum method/value, while
`BlobFileMetaData` contains attributes that can vary across versions like
the amount of garbage in the file. There is a single `SharedBlobFileMetaData`
for each blob file, which is jointly owned by the `BlobFileMetaData` objects
that point to it; `BlobFileMetaData` objects, in turn, are owned by `Version`s
and can also be shared if the (immutable _and_ mutable) state of the blob file
is the same in two versions.
In addition, the patch adds the blob file metadata to `VersionStorageInfo`, and extends
`VersionBuilder` so that it can apply blob file related `VersionEdit`s (i.e. those
containing `BlobFileAddition`s and/or `BlobFileGarbage`), and save blob file metadata
to a new `VersionStorageInfo`. Consistency checks are also extended to ensure
that table files point to blob files that are part of the `Version`, and that all blob files
that are part of any given `Version` have at least some _non_-garbage data in them.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6597
Test Plan: `make check`
Reviewed By: riversand963
Differential Revision: D20656803
Pulled By: ltamasi
fbshipit-source-id: f1f74d135045b3b42d0146f03ee576ef0a4bfd80
2020-03-27 02:48:55 +01:00
|
|
|
db/blob/blob_file_meta.cc
|
2020-06-10 00:12:59 +02:00
|
|
|
db/blob/blob_log_format.cc
|
|
|
|
db/blob/blob_log_reader.cc
|
|
|
|
db/blob/blob_log_writer.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/builder.cc
|
|
|
|
db/c.cc
|
|
|
|
db/column_family.cc
|
2015-07-16 21:10:16 +02:00
|
|
|
db/compacted_db_impl.cc
|
2019-05-31 20:52:59 +02:00
|
|
|
db/compaction/compaction.cc
|
|
|
|
db/compaction/compaction_iterator.cc
|
2019-06-05 22:56:46 +02:00
|
|
|
db/compaction/compaction_picker.cc
|
2019-05-31 20:52:59 +02:00
|
|
|
db/compaction/compaction_job.cc
|
|
|
|
db/compaction/compaction_picker_fifo.cc
|
|
|
|
db/compaction/compaction_picker_level.cc
|
|
|
|
db/compaction/compaction_picker_universal.cc
|
2020-07-24 22:43:14 +02:00
|
|
|
db/compaction/sst_partitioner.cc
|
2015-07-15 23:51:51 +02:00
|
|
|
db/convenience.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/db_filesnapshot.cc
|
2019-05-31 20:52:59 +02:00
|
|
|
db/db_impl/db_impl.cc
|
|
|
|
db/db_impl/db_impl_write.cc
|
|
|
|
db/db_impl/db_impl_compaction_flush.cc
|
|
|
|
db/db_impl/db_impl_files.cc
|
|
|
|
db/db_impl/db_impl_open.cc
|
|
|
|
db/db_impl/db_impl_debug.cc
|
|
|
|
db/db_impl/db_impl_experimental.cc
|
|
|
|
db/db_impl/db_impl_readonly.cc
|
|
|
|
db/db_impl/db_impl_secondary.cc
|
2016-01-26 02:49:58 +01:00
|
|
|
db/db_info_dumper.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/db_iter.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
db/dbformat.cc
|
2018-06-28 21:23:57 +02:00
|
|
|
db/error_handler.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/event_helpers.cc
|
|
|
|
db/experimental.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
db/external_sst_file_ingestion_job.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/file_indexer.cc
|
|
|
|
db/flush_job.cc
|
|
|
|
db/flush_scheduler.cc
|
|
|
|
db/forward_iterator.cc
|
2019-07-24 02:08:26 +02:00
|
|
|
db/import_column_family_job.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/internal_stats.cc
|
Skip deleted WALs during recovery
Summary:
This patch record min log number to keep to the manifest while flushing SST files to ignore them and any WAL older than them during recovery. This is to avoid scenarios when we have a gap between the WAL files are fed to the recovery procedure. The gap could happen by for example out-of-order WAL deletion. Such gap could cause problems in 2PC recovery where the prepared and commit entry are placed into two separate WAL and gap in the WALs could result into not processing the WAL with the commit entry and hence breaking the 2PC recovery logic.
Before the commit, for 2PC case, we determined which log number to keep in FindObsoleteFiles(). We looked at the earliest logs with outstanding prepare entries, or prepare entries whose respective commit or abort are in memtable. With the commit, the same calculation is done while we apply the SST flush. Just before installing the flush file, we precompute the earliest log file to keep after the flush finishes using the same logic (but skipping the memtables just flushed), record this information to the manifest entry for this new flushed SST file. This pre-computed value is also remembered in memory, and will later be used to determine whether a log file can be deleted. This value is unlikely to change until next flush because the commit entry will stay in memtable. (In WritePrepared, we could have removed the older log files as soon as all prepared entries are committed. It's not yet done anyway. Even if we do it, the only thing we loss with this new approach is earlier log deletion between two flushes, which does not guarantee to happen anyway because the obsolete file clean-up function is only executed after flush or compaction)
This min log number to keep is stored in the manifest using the safely-ignore customized field of AddFile entry, in order to guarantee that the DB generated using newer release can be opened by previous releases no older than 4.2.
Closes https://github.com/facebook/rocksdb/pull/3765
Differential Revision: D7747618
Pulled By: siying
fbshipit-source-id: d00c92105b4f83852e9754a1b70d6b64cb590729
2018-05-04 00:35:11 +02:00
|
|
|
db/logs_with_prep_tracker.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/log_reader.cc
|
|
|
|
db/log_writer.cc
|
2017-06-01 07:41:44 +02:00
|
|
|
db/malloc_stats.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/memtable.cc
|
|
|
|
db/memtable_list.cc
|
|
|
|
db/merge_helper.cc
|
|
|
|
db/merge_operator.cc
|
Compaction Support for Range Deletion
Summary:
This diff introduces RangeDelAggregator, which takes ownership of iterators
provided to it via AddTombstones(). The tombstones are organized in a two-level
map (snapshot stripe -> begin key -> tombstone). Tombstone creation avoids data
copy by holding Slices returned by the iterator, which remain valid thanks to pinning.
For compaction, we create a hierarchical range tombstone iterator with structure
matching the iterator over compaction input data. An aggregator based on that
iterator is used by CompactionIterator to determine which keys are covered by
range tombstones. In case of merge operand, the same aggregator is used by
MergeHelper. Upon finishing each file in the compaction, relevant range tombstones
are added to the output file's range tombstone metablock and file boundaries are
updated accordingly.
To check whether a key is covered by range tombstone, RangeDelAggregator::ShouldDelete()
considers tombstones in the key's snapshot stripe. When this function is used outside of
compaction, it also checks newer stripes, which can contain covering tombstones. Currently
the intra-stripe check involves a linear scan; however, in the future we plan to collapse ranges
within a stripe such that binary search can be used.
RangeDelAggregator::AddToBuilder() adds all range tombstones in the table's key-range
to a new table's range tombstone meta-block. Since range tombstones may fall in the gap
between files, we may need to extend some files' key-ranges. The strategy is (1) first file
extends as far left as possible and other files do not extend left, (2) all files extend right
until either the start of the next file or the end of the last range tombstone in the gap,
whichever comes first.
One other notable change is adding release/move semantics to ScopedArenaIterator
such that it can be used to transfer ownership of an arena-allocated iterator, similar to
how unique_ptr is used for malloc'd data.
Depends on D61473
Test Plan: compaction_iterator_test, mock_table, end-to-end tests in D63927
Reviewers: sdong, IslamAbdelRahman, wanning, yhchiang, lightmark
Reviewed By: lightmark
Subscribers: andrewkr, dhruba, leveldb
Differential Revision: https://reviews.facebook.net/D62205
2016-10-18 21:04:56 +02:00
|
|
|
db/range_del_aggregator.cc
|
Use only "local" range tombstones during Get (#4449)
Summary:
Previously, range tombstones were accumulated from every level, which
was necessary if a range tombstone in a higher level covered a key in a lower
level. However, RangeDelAggregator::AddTombstones's complexity is based on
the number of tombstones that are currently stored in it, which is wasteful in
the Get case, where we only need to know the highest sequence number of range
tombstones that cover the key from higher levels, and compute the highest covering
sequence number at the current level. This change introduces this optimization, and
removes the use of RangeDelAggregator from the Get path.
In the benchmark results, the following command was used to initialize the database:
```
./db_bench -db=/dev/shm/5k-rts -use_existing_db=false -benchmarks=filluniquerandom -write_buffer_size=1048576 -compression_type=lz4 -target_file_size_base=1048576 -max_bytes_for_level_base=4194304 -value_size=112 -key_size=16 -block_size=4096 -level_compaction_dynamic_level_bytes=true -num=5000000 -max_background_jobs=12 -benchmark_write_rate_limit=20971520 -range_tombstone_width=100 -writes_per_range_tombstone=100 -max_num_range_tombstones=50000 -bloom_bits=8
```
...and the following command was used to measure read throughput:
```
./db_bench -db=/dev/shm/5k-rts/ -use_existing_db=true -benchmarks=readrandom -disable_auto_compactions=true -num=5000000 -reads=100000 -threads=32
```
The filluniquerandom command was only run once, and the resulting database was used
to measure read performance before and after the PR. Both binaries were compiled with
`DEBUG_LEVEL=0`.
Readrandom results before PR:
```
readrandom : 4.544 micros/op 220090 ops/sec; 16.9 MB/s (63103 of 100000 found)
```
Readrandom results after PR:
```
readrandom : 11.147 micros/op 89707 ops/sec; 6.9 MB/s (63103 of 100000 found)
```
So it's actually slower right now, but this PR paves the way for future optimizations (see #4493).
----
Pull Request resolved: https://github.com/facebook/rocksdb/pull/4449
Differential Revision: D10370575
Pulled By: abhimadan
fbshipit-source-id: 9a2e152be1ef36969055c0e9eb4beb0d96c11f4d
2018-10-24 21:29:29 +02:00
|
|
|
db/range_tombstone_fragmenter.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/repair.cc
|
2015-08-11 22:44:47 +02:00
|
|
|
db/snapshot_impl.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/table_cache.cc
|
|
|
|
db/table_properties_collector.cc
|
|
|
|
db/transaction_log_impl.cc
|
Refactor trimming logic for immutable memtables (#5022)
Summary:
MyRocks currently sets `max_write_buffer_number_to_maintain` in order to maintain enough history for transaction conflict checking. The effectiveness of this approach depends on the size of memtables. When memtables are small, it may not keep enough history; when memtables are large, this may consume too much memory.
We are proposing a new way to configure memtable list history: by limiting the memory usage of immutable memtables. The new option is `max_write_buffer_size_to_maintain` and it will take precedence over the old `max_write_buffer_number_to_maintain` if they are both set to non-zero values. The new option accounts for the total memory usage of flushed immutable memtables and mutable memtable. When the total usage exceeds the limit, RocksDB may start dropping immutable memtables (which is also called trimming history), starting from the oldest one.
The semantics of the old option actually works both as an upper bound and lower bound. History trimming will start if number of immutable memtables exceeds the limit, but it will never go below (limit-1) due to history trimming.
In order the mimic the behavior with the new option, history trimming will stop if dropping the next immutable memtable causes the total memory usage go below the size limit. For example, assuming the size limit is set to 64MB, and there are 3 immutable memtables with sizes of 20, 30, 30. Although the total memory usage is 80MB > 64MB, dropping the oldest memtable will reduce the memory usage to 60MB < 64MB, so in this case no memtable will be dropped.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/5022
Differential Revision: D14394062
Pulled By: miasantreble
fbshipit-source-id: 60457a509c6af89d0993f988c9b5c2aa9e45f5c5
2019-08-23 22:54:09 +02:00
|
|
|
db/trim_history_scheduler.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/version_builder.cc
|
|
|
|
db/version_edit.cc
|
2020-03-21 03:17:54 +01:00
|
|
|
db/version_edit_handler.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/version_set.cc
|
Define WAL related classes to be used in VersionEdit and VersionSet (#7164)
Summary:
`WalAddition`, `WalDeletion` are defined in `wal_version.h` and used in `VersionEdit`.
`WalAddition` is used to represent events of creating a new WAL (no size, just log number), or closing a WAL (with size).
`WalDeletion` is used to represent events of deleting or archiving a WAL, it means the WAL is no longer alive (won't be replayed during recovery).
`WalSet` is the set of alive WALs kept in `VersionSet`.
1. Why use `WalDeletion` instead of relying on `MinLogNumber` to identify outdated WALs
On recovery, we can compute `MinLogNumber()` based on the log numbers kept in MANIFEST, any log with number < MinLogNumber can be ignored. So it seems that we don't need to persist `WalDeletion` to MANIFEST, since we can ignore the WALs based on MinLogNumber.
But the `MinLogNumber()` is actually a lower bound, it does not exactly mean that logs starting from MinLogNumber must exist. This is because in a corner case, when a column family is empty and never flushed, its log number is set to the largest log number, but not persisted in MANIFEST. So let's say there are 2 column families, when creating the DB, the first WAL has log number 1, so it's persisted to MANIFEST for both column families. Then CF 0 is empty and never flushed, CF 1 is updated and flushed, so a new WAL with log number 2 is created and persisted to MANIFEST for CF 1. But CF 0's log number in MANIFEST is still 1. So on recovery, MinLogNumber is 1, but since log 1 only contains data for CF 1, and CF 1 is flushed, log 1 might have already been deleted from disk.
We can make `MinLogNumber()` be the exactly minimum log number that must exist, by persisting the most recent log number for empty column families that are not flushed. But if there are N such column families, then every time a new WAL is created, we need to add N records to MANIFEST.
In current design, a record is persisted to MANIFEST only when WAL is created, closed, or deleted/archived, so the number of WAL related records are bounded to 3x number of WALs.
2. Why keep `WalSet` in `VersionSet` instead of applying the `VersionEdit`s to `VersionStorageInfo`
`VersionEdit`s are originally designed to track the addition and deletion of SST files. The SST files are related to column families, each column family has a list of `Version`s, and each `Version` keeps the set of active SST files in `VersionStorageInfo`.
But WALs are a concept of DB, they are not bounded to specific column families. So logically it does not make sense to store WALs in a column family's `Version`s.
Also, `Version`'s purpose is to keep reference to SST / blob files, so that they are not deleted until there is no version referencing them. But a WAL is deleted regardless of version references.
So we keep the WALs in `VersionSet` for the purpose of writing out the DB state's snapshot when creating new MANIFESTs.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/7164
Test Plan:
make version_edit_test && ./version_edit_test
make wal_edit_test && ./wal_edit_test
Reviewed By: ltamasi
Differential Revision: D22677936
Pulled By: cheng-chang
fbshipit-source-id: 5a3b6890140e572ffd79eb37e6e4c3c32361a859
2020-08-06 01:32:26 +02:00
|
|
|
db/wal_edit.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/wal_manager.cc
|
|
|
|
db/write_batch.cc
|
|
|
|
db/write_batch_base.cc
|
|
|
|
db/write_controller.cc
|
|
|
|
db/write_thread.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
env/env.cc
|
|
|
|
env/env_chroot.cc
|
2017-06-27 01:52:06 +02:00
|
|
|
env/env_encryption.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
env/env_hdfs.cc
|
Introduce a new storage specific Env API (#5761)
Summary:
The current Env API encompasses both storage/file operations, as well as OS related operations. Most of the APIs return a Status, which does not have enough metadata about an error, such as whether its retry-able or not, scope (i.e fault domain) of the error etc., that may be required in order to properly handle a storage error. The file APIs also do not provide enough control over the IO SLA, such as timeout, prioritization, hinting about placement and redundancy etc.
This PR separates out the file/storage APIs from Env into a new FileSystem class. The APIs are updated to return an IOStatus with metadata about the error, as well as to take an IOOptions structure as input in order to allow more control over the IO.
The user can set both ```options.env``` and ```options.file_system``` to specify that RocksDB should use the former for OS related operations and the latter for storage operations. Internally, a ```CompositeEnvWrapper``` has been introduced that inherits from ```Env``` and redirects individual methods to either an ```Env``` implementation or the ```FileSystem``` as appropriate. When options are sanitized during ```DB::Open```, ```options.env``` is replaced with a newly allocated ```CompositeEnvWrapper``` instance if both env and file_system have been specified. This way, the rest of the RocksDB code can continue to function as before.
This PR also ports PosixEnv to the new API by splitting it into two - PosixEnv and PosixFileSystem. PosixEnv is defined as a sub-class of CompositeEnvWrapper, and threading/time functions are overridden with Posix specific implementations in order to avoid an extra level of indirection.
The ```CompositeEnvWrapper``` translates ```IOStatus``` return code to ```Status```, and sets the severity to ```kSoftError``` if the io_status is retryable. The error handling code in RocksDB can then recover the DB automatically.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/5761
Differential Revision: D18868376
Pulled By: anand1976
fbshipit-source-id: 39efe18a162ea746fabac6360ff529baba48486f
2019-12-13 23:47:08 +01:00
|
|
|
env/file_system.cc
|
2020-08-05 03:40:19 +02:00
|
|
|
env/file_system_tracer.cc
|
2017-06-02 00:30:27 +02:00
|
|
|
env/mock_env.cc
|
2019-05-30 05:44:08 +02:00
|
|
|
file/delete_scheduler.cc
|
2019-09-16 19:31:27 +02:00
|
|
|
file/file_prefetch_buffer.cc
|
2019-05-30 05:44:08 +02:00
|
|
|
file/file_util.cc
|
|
|
|
file/filename.cc
|
2019-09-16 19:31:27 +02:00
|
|
|
file/random_access_file_reader.cc
|
|
|
|
file/read_write_util.cc
|
|
|
|
file/readahead_raf.cc
|
|
|
|
file/sequence_file_reader.cc
|
2019-05-30 05:44:08 +02:00
|
|
|
file/sst_file_manager_impl.cc
|
2019-09-16 19:31:27 +02:00
|
|
|
file/writable_file_writer.cc
|
2019-06-01 02:19:43 +02:00
|
|
|
logging/auto_roll_logger.cc
|
|
|
|
logging/event_logger.cc
|
|
|
|
logging/log_buffer.cc
|
2019-05-31 02:39:43 +02:00
|
|
|
memory/arena.cc
|
|
|
|
memory/concurrent_arena.cc
|
|
|
|
memory/jemalloc_nodump_allocator.cc
|
Provide an allocator for new memory type to be used with RocksDB block cache (#6214)
Summary:
New memory technologies are being developed by various hardware vendors (Intel DCPMM is one such technology currently available). These new memory types require different libraries for allocation and management (such as PMDK and memkind). The high capacities available make it possible to provision large caches (up to several TBs in size), beyond what is achievable with DRAM.
The new allocator provided in this PR uses the memkind library to allocate memory on different media.
**Performance**
We tested the new allocator using db_bench.
- For each test, we vary the size of the block cache (relative to the size of the uncompressed data in the database).
- The database is filled sequentially. Throughput is then measured with a readrandom benchmark.
- We use a uniform distribution as a worst-case scenario.
The plot shows throughput (ops/s) relative to a configuration with no block cache and default allocator.
For all tests, p99 latency is below 500 us.
![image](https://user-images.githubusercontent.com/26400080/71108594-42479100-2178-11ea-8231-8a775bbc92db.png)
**Changes**
- Add MemkindKmemAllocator
- Add --use_cache_memkind_kmem_allocator db_bench option (to create an LRU block cache with the new allocator)
- Add detection of memkind library with KMEM DAX support
- Add test for MemkindKmemAllocator
**Minimum Requirements**
- kernel 5.3.12
- ndctl v67 - https://github.com/pmem/ndctl
- memkind v1.10.0 - https://github.com/memkind/memkind
**Memory Configuration**
The allocator uses the MEMKIND_DAX_KMEM memory kind. Follow the instructions on[ memkind’s GitHub page](https://github.com/memkind/memkind) to set up NVDIMM memory accordingly.
Note on memory allocation with NVDIMM memory exposed as system memory.
- The MemkindKmemAllocator will only allocate from NVDIMM memory (using memkind_malloc with MEMKIND_DAX_KMEM kind).
- The default allocator is not restricted to RAM by default. Based on NUMA node latency, the kernel should allocate from local RAM preferentially, but it’s a kernel decision. numactl --preferred/--membind can be used to allocate preferentially/exclusively from the local RAM node.
**Usage**
When creating an LRU cache, pass a MemkindKmemAllocator object as argument.
For example (replace capacity with the desired value in bytes):
```
#include "rocksdb/cache.h"
#include "memory/memkind_kmem_allocator.h"
NewLRUCache(
capacity /*size_t*/,
6 /*cache_numshardbits*/,
false /*strict_capacity_limit*/,
false /*cache_high_pri_pool_ratio*/,
std::make_shared<MemkindKmemAllocator>());
```
Refer to [RocksDB’s block cache documentation](https://github.com/facebook/rocksdb/wiki/Block-Cache) to assign the LRU cache as block cache for a database.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6214
Reviewed By: cheng-chang
Differential Revision: D19292435
fbshipit-source-id: 7202f47b769e7722b539c86c2ffd669f64d7b4e1
2020-04-10 05:45:17 +02:00
|
|
|
memory/memkind_kmem_allocator.cc
|
2017-06-02 23:13:59 +02:00
|
|
|
memtable/alloc_tracker.cc
|
2015-10-16 23:10:33 +02:00
|
|
|
memtable/hash_linklist_rep.cc
|
|
|
|
memtable/hash_skiplist_rep.cc
|
2016-01-26 02:49:58 +01:00
|
|
|
memtable/skiplistrep.cc
|
|
|
|
memtable/vectorrep.cc
|
2017-06-02 23:13:59 +02:00
|
|
|
memtable/write_buffer_manager.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
monitoring/histogram.cc
|
|
|
|
monitoring/histogram_windowing.cc
|
2019-06-18 00:17:43 +02:00
|
|
|
monitoring/in_memory_stats_history.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
monitoring/instrumented_mutex.cc
|
|
|
|
monitoring/iostats_context.cc
|
|
|
|
monitoring/perf_context.cc
|
|
|
|
monitoring/perf_level.cc
|
2019-06-18 00:17:43 +02:00
|
|
|
monitoring/persistent_stats_history.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
monitoring/statistics.cc
|
2020-08-15 05:11:35 +02:00
|
|
|
monitoring/stats_dump_scheduler.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
monitoring/thread_status_impl.cc
|
|
|
|
monitoring/thread_status_updater.cc
|
|
|
|
monitoring/thread_status_util.cc
|
|
|
|
monitoring/thread_status_util_debug.cc
|
|
|
|
options/cf_options.cc
|
|
|
|
options/db_options.cc
|
|
|
|
options/options.cc
|
|
|
|
options/options_helper.cc
|
|
|
|
options/options_parser.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
port/stack_trace.cc
|
2019-05-30 23:47:29 +02:00
|
|
|
table/adaptive/adaptive_table_factory.cc
|
2020-03-13 05:39:36 +01:00
|
|
|
table/block_based/binary_search_index_reader.cc
|
2019-05-30 23:47:29 +02:00
|
|
|
table/block_based/block.cc
|
|
|
|
table/block_based/block_based_filter_block.cc
|
|
|
|
table/block_based/block_based_table_builder.cc
|
|
|
|
table/block_based/block_based_table_factory.cc
|
De-template block based table iterator (#6531)
Summary:
Right now block based table iterator is used as both of iterating data for block based table, and for the index iterator for partitioend index. This was initially convenient for introducing a new iterator and block type for new index format, while reducing code change. However, these two usage doesn't go with each other very well. For example, Prev() is never called for partitioned index iterator, and some other complexity is maintained in block based iterators, which is not needed for index iterator but maintainers will always need to reason about it. Furthermore, the template usage is not following Google C++ Style which we are following, and makes a large chunk of code tangled together. This commit separate the two iterators. Right now, here is what it is done:
1. Copy the block based iterator code into partitioned index iterator, and de-template them.
2. Remove some code not needed for partitioned index. The upper bound check and tricks are removed. We never tested performance for those tricks when partitioned index is enabled in the first place. It's unlikelyl to generate performance regression, as creating new partitioned index block is much rarer than data blocks.
3. Separate out the prefetch logic to a helper class and both classes call them.
This commit will enable future follow-ups. One direction is that we might separate index iterator interface for data blocks and index blocks, as they are quite different.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6531
Test Plan: build using make and cmake. And build release
Differential Revision: D20473108
fbshipit-source-id: e48011783b339a4257c204cc07507b171b834b0f
2020-03-16 20:17:34 +01:00
|
|
|
table/block_based/block_based_table_iterator.cc
|
2019-05-30 23:47:29 +02:00
|
|
|
table/block_based/block_based_table_reader.cc
|
|
|
|
table/block_based/block_builder.cc
|
De-template block based table iterator (#6531)
Summary:
Right now block based table iterator is used as both of iterating data for block based table, and for the index iterator for partitioend index. This was initially convenient for introducing a new iterator and block type for new index format, while reducing code change. However, these two usage doesn't go with each other very well. For example, Prev() is never called for partitioned index iterator, and some other complexity is maintained in block based iterators, which is not needed for index iterator but maintainers will always need to reason about it. Furthermore, the template usage is not following Google C++ Style which we are following, and makes a large chunk of code tangled together. This commit separate the two iterators. Right now, here is what it is done:
1. Copy the block based iterator code into partitioned index iterator, and de-template them.
2. Remove some code not needed for partitioned index. The upper bound check and tricks are removed. We never tested performance for those tricks when partitioned index is enabled in the first place. It's unlikelyl to generate performance regression, as creating new partitioned index block is much rarer than data blocks.
3. Separate out the prefetch logic to a helper class and both classes call them.
This commit will enable future follow-ups. One direction is that we might separate index iterator interface for data blocks and index blocks, as they are quite different.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6531
Test Plan: build using make and cmake. And build release
Differential Revision: D20473108
fbshipit-source-id: e48011783b339a4257c204cc07507b171b834b0f
2020-03-16 20:17:34 +01:00
|
|
|
table/block_based/block_prefetcher.cc
|
2019-05-30 23:47:29 +02:00
|
|
|
table/block_based/block_prefix_index.cc
|
|
|
|
table/block_based/data_block_hash_index.cc
|
|
|
|
table/block_based/data_block_footer.cc
|
Move the filter readers out of the block cache (#5504)
Summary:
Currently, when the block cache is used for the filter block, it is not
really the block itself that is stored in the cache but a FilterBlockReader
object. Since this object is not pure data (it has, for instance, pointers that
might dangle, including in one case a back pointer to the TableReader), it's not
really sharable. To avoid the issues around this, the current code erases the
cache entries when the TableReader is closed (which, BTW, is not sufficient
since a concurrent TableReader might have picked up the object in the meantime).
Instead of doing this, the patch moves the FilterBlockReader out of the cache
altogether, and decouples the filter reader object from the filter block.
In particular, instead of the TableReader owning, or caching/pinning the
FilterBlockReader (based on the customer's settings), with the change the
TableReader unconditionally owns the FilterBlockReader, which in turn
owns/caches/pins the filter block. This change also enables us to reuse the code
paths historically used for data blocks for filters as well.
Note:
Eviction statistics for filter blocks are temporarily broken. We plan to fix this in a
separate phase.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/5504
Test Plan: make asan_check
Differential Revision: D16036974
Pulled By: ltamasi
fbshipit-source-id: 770f543c5fb4ed126fd1e04bfd3809cf4ff9c091
2019-07-16 22:11:23 +02:00
|
|
|
table/block_based/filter_block_reader_common.cc
|
2019-10-25 00:43:27 +02:00
|
|
|
table/block_based/filter_policy.cc
|
2019-05-30 23:47:29 +02:00
|
|
|
table/block_based/flush_block_policy.cc
|
|
|
|
table/block_based/full_filter_block.cc
|
2020-03-13 05:39:36 +01:00
|
|
|
table/block_based/hash_index_reader.cc
|
2019-05-30 23:47:29 +02:00
|
|
|
table/block_based/index_builder.cc
|
2020-03-13 05:39:36 +01:00
|
|
|
table/block_based/index_reader_common.cc
|
2019-10-19 04:30:47 +02:00
|
|
|
table/block_based/parsed_full_filter_block.cc
|
2019-05-30 23:47:29 +02:00
|
|
|
table/block_based/partitioned_filter_block.cc
|
De-template block based table iterator (#6531)
Summary:
Right now block based table iterator is used as both of iterating data for block based table, and for the index iterator for partitioend index. This was initially convenient for introducing a new iterator and block type for new index format, while reducing code change. However, these two usage doesn't go with each other very well. For example, Prev() is never called for partitioned index iterator, and some other complexity is maintained in block based iterators, which is not needed for index iterator but maintainers will always need to reason about it. Furthermore, the template usage is not following Google C++ Style which we are following, and makes a large chunk of code tangled together. This commit separate the two iterators. Right now, here is what it is done:
1. Copy the block based iterator code into partitioned index iterator, and de-template them.
2. Remove some code not needed for partitioned index. The upper bound check and tricks are removed. We never tested performance for those tricks when partitioned index is enabled in the first place. It's unlikelyl to generate performance regression, as creating new partitioned index block is much rarer than data blocks.
3. Separate out the prefetch logic to a helper class and both classes call them.
This commit will enable future follow-ups. One direction is that we might separate index iterator interface for data blocks and index blocks, as they are quite different.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6531
Test Plan: build using make and cmake. And build release
Differential Revision: D20473108
fbshipit-source-id: e48011783b339a4257c204cc07507b171b834b0f
2020-03-16 20:17:34 +01:00
|
|
|
table/block_based/partitioned_index_iterator.cc
|
2020-03-13 05:39:36 +01:00
|
|
|
table/block_based/partitioned_index_reader.cc
|
|
|
|
table/block_based/reader_common.cc
|
2019-07-24 00:57:43 +02:00
|
|
|
table/block_based/uncompression_dict_reader.cc
|
2017-12-12 00:16:37 +01:00
|
|
|
table/block_fetcher.cc
|
2019-05-30 23:47:29 +02:00
|
|
|
table/cuckoo/cuckoo_table_builder.cc
|
|
|
|
table/cuckoo/cuckoo_table_factory.cc
|
|
|
|
table/cuckoo/cuckoo_table_reader.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
table/format.cc
|
|
|
|
table/get_context.cc
|
|
|
|
table/iterator.cc
|
2017-02-03 01:38:40 +01:00
|
|
|
table/merging_iterator.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
table/meta_blocks.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
table/persistent_cache_helper.cc
|
2019-09-05 19:03:42 +02:00
|
|
|
table/plain/plain_table_bloom.cc
|
2019-05-30 23:47:29 +02:00
|
|
|
table/plain/plain_table_builder.cc
|
|
|
|
table/plain/plain_table_factory.cc
|
|
|
|
table/plain/plain_table_index.cc
|
|
|
|
table/plain/plain_table_key_coding.cc
|
|
|
|
table/plain/plain_table_reader.cc
|
2020-06-25 04:30:15 +02:00
|
|
|
table/sst_file_dumper.cc
|
2018-11-27 21:59:27 +01:00
|
|
|
table/sst_file_reader.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
table/sst_file_writer.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
table/table_properties.cc
|
|
|
|
table/two_level_iterator.cc
|
2019-05-30 20:21:38 +02:00
|
|
|
test_util/sync_point.cc
|
|
|
|
test_util/sync_point_impl.cc
|
|
|
|
test_util/testutil.cc
|
|
|
|
test_util/transaction_test_util.cc
|
Block cache simulator: Add pysim to simulate caches using reinforcement learning. (#5610)
Summary:
This PR implements cache eviction using reinforcement learning. It includes two implementations:
1. An implementation of Thompson Sampling for the Bernoulli Bandit [1].
2. An implementation of LinUCB with disjoint linear models [2].
The idea is that a cache uses multiple eviction policies, e.g., MRU, LRU, and LFU. The cache learns which eviction policy is the best and uses it upon a cache miss.
Thompson Sampling is contextless and does not include any features.
LinUCB includes features such as level, block type, caller, column family id to decide which eviction policy to use.
[1] Daniel J. Russo, Benjamin Van Roy, Abbas Kazerouni, Ian Osband, and Zheng Wen. 2018. A Tutorial on Thompson Sampling. Found. Trends Mach. Learn. 11, 1 (July 2018), 1-96. DOI: https://doi.org/10.1561/2200000070
[2] Lihong Li, Wei Chu, John Langford, and Robert E. Schapire. 2010. A contextual-bandit approach to personalized news article recommendation. In Proceedings of the 19th international conference on World wide web (WWW '10). ACM, New York, NY, USA, 661-670. DOI=http://dx.doi.org/10.1145/1772690.1772758
Pull Request resolved: https://github.com/facebook/rocksdb/pull/5610
Differential Revision: D16435067
Pulled By: HaoyuHuang
fbshipit-source-id: 6549239ae14115c01cb1e70548af9e46d8dc21bb
2019-07-26 23:36:16 +02:00
|
|
|
tools/block_cache_analyzer/block_cache_trace_analyzer.cc
|
2015-10-07 00:52:09 +02:00
|
|
|
tools/dump/db_dump_tool.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
tools/ldb_cmd.cc
|
|
|
|
tools/ldb_tool.cc
|
|
|
|
tools/sst_dump_tool.cc
|
RocksDB Trace Analyzer (#4091)
Summary:
A framework of trace analyzing for RocksDB
After collecting the trace by using the tool of [PR #3837](https://github.com/facebook/rocksdb/pull/3837). User can use the Trace Analyzer to interpret, analyze, and characterize the collected workload.
**Input:**
1. trace file
2. Whole keys space file
**Statistics:**
1. Access count of each operation (Get, Put, Delete, SingleDelete, DeleteRange, Merge) in each column family.
2. Key hotness (access count) of each one
3. Key space separation based on given prefix
4. Key size distribution
5. Value size distribution if appliable
6. Top K accessed keys
7. QPS statistics including the average QPS and peak QPS
8. Top K accessed prefix
9. The query correlation analyzing, output the number of X after Y and the corresponding average time
intervals
**Output:**
1. key access heat map (either in the accessed key space or whole key space)
2. trace sequence file (interpret the raw trace file to line base text file for future use)
3. Time serial (The key space ID and its access time)
4. Key access count distritbution
5. Key size distribution
6. Value size distribution (in each intervals)
7. whole key space separation by the prefix
8. Accessed key space separation by the prefix
9. QPS of each operation and each column family
10. Top K QPS and their accessed prefix range
**Test:**
1. Added the unit test of analyzing Get, Put, Delete, SingleDelete, DeleteRange, Merge
2. Generated the trace and analyze the trace
**Implemented but not tested (due to the limitation of trace_replay):**
1. Analyzing Iterator, supporting Seek() and SeekForPrev() analyzing
2. Analyzing the number of Key found by Get
**Future Work:**
1. Support execution time analyzing of each requests
2. Support cache hit situation and block read situation of Get
Pull Request resolved: https://github.com/facebook/rocksdb/pull/4091
Differential Revision: D9256157
Pulled By: zhichao-cao
fbshipit-source-id: f0ceacb7eedbc43a3eee6e85b76087d7832a8fe6
2018-08-13 20:32:04 +02:00
|
|
|
tools/trace_analyzer_tool.cc
|
2019-06-03 22:21:02 +02:00
|
|
|
trace_replay/trace_replay.cc
|
2019-06-06 20:21:11 +02:00
|
|
|
trace_replay/block_cache_tracer.cc
|
2020-08-05 03:40:19 +02:00
|
|
|
trace_replay/io_tracer.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
util/coding.cc
|
|
|
|
util/compaction_job_stats_impl.cc
|
|
|
|
util/comparator.cc
|
2018-06-04 21:04:52 +02:00
|
|
|
util/compression_context_cache.cc
|
Concurrent task limiter for compaction thread control (#4332)
Summary:
The PR is targeting to resolve the issue of:
https://github.com/facebook/rocksdb/issues/3972#issue-330771918
We have a rocksdb created with leveled-compaction with multiple column families (CFs), some of CFs are using HDD to store big and less frequently accessed data and others are using SSD.
When there are continuously write traffics going on to all CFs, the compaction thread pool is mostly occupied by those slow HDD compactions, which blocks fully utilize SSD bandwidth.
Since atomic write and transaction is needed across CFs, so splitting it to multiple rocksdb instance is not an option for us.
With the compaction thread control, we got 30%+ HDD write throughput gain, and also a lot smooth SSD write since less write stall happening.
ConcurrentTaskLimiter can be shared with multi-CFs across rocksdb instances, so the feature does not only work for multi-CFs scenarios, but also for multi-rocksdbs scenarios, who need disk IO resource control per tenant.
The usage is straight forward:
e.g.:
//
// Enable compaction thread limiter thru ColumnFamilyOptions
//
std::shared_ptr<ConcurrentTaskLimiter> ctl(NewConcurrentTaskLimiter("foo_limiter", 4));
Options options;
ColumnFamilyOptions cf_opt(options);
cf_opt.compaction_thread_limiter = ctl;
...
//
// Compaction thread limiter can be tuned or disabled on-the-fly
//
ctl->SetMaxOutstandingTask(12); // enlarge to 12 tasks
...
ctl->ResetMaxOutstandingTask(); // disable (bypass) thread limiter
ctl->SetMaxOutstandingTask(-1); // Same as above
...
ctl->SetMaxOutstandingTask(0); // full throttle (0 task)
//
// Sharing compaction thread limiter among CFs (to resolve multiple storage perf issue)
//
std::shared_ptr<ConcurrentTaskLimiter> ctl_ssd(NewConcurrentTaskLimiter("ssd_limiter", 8));
std::shared_ptr<ConcurrentTaskLimiter> ctl_hdd(NewConcurrentTaskLimiter("hdd_limiter", 4));
Options options;
ColumnFamilyOptions cf_opt_ssd1(options);
ColumnFamilyOptions cf_opt_ssd2(options);
ColumnFamilyOptions cf_opt_hdd1(options);
ColumnFamilyOptions cf_opt_hdd2(options);
ColumnFamilyOptions cf_opt_hdd3(options);
// SSD CFs
cf_opt_ssd1.compaction_thread_limiter = ctl_ssd;
cf_opt_ssd2.compaction_thread_limiter = ctl_ssd;
// HDD CFs
cf_opt_hdd1.compaction_thread_limiter = ctl_hdd;
cf_opt_hdd2.compaction_thread_limiter = ctl_hdd;
cf_opt_hdd3.compaction_thread_limiter = ctl_hdd;
...
//
// The limiter is disabled by default (or set to nullptr explicitly)
//
Options options;
ColumnFamilyOptions cf_opt(options);
cf_opt.compaction_thread_limiter = nullptr;
Pull Request resolved: https://github.com/facebook/rocksdb/pull/4332
Differential Revision: D13226590
Pulled By: siying
fbshipit-source-id: 14307aec55b8bd59c8223d04aa6db3c03d1b0c1d
2018-12-13 22:16:04 +01:00
|
|
|
util/concurrent_task_limiter_impl.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
util/crc32c.cc
|
|
|
|
util/dynamic_bloom.cc
|
|
|
|
util/hash.cc
|
|
|
|
util/murmurhash.cc
|
2015-11-06 17:07:08 +01:00
|
|
|
util/random.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
util/rate_limiter.cc
|
|
|
|
util/slice.cc
|
2020-02-11 00:42:46 +01:00
|
|
|
util/file_checksum_helper.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
util/status.cc
|
|
|
|
util/string_util.cc
|
|
|
|
util/thread_local.cc
|
2016-08-26 19:41:35 +02:00
|
|
|
util/threadpool_imp.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
util/xxhash.cc
|
|
|
|
utilities/backupable/backupable_db.cc
|
2018-03-06 20:46:20 +01:00
|
|
|
utilities/blob_db/blob_compaction_filter.cc
|
2016-08-09 19:16:32 +02:00
|
|
|
utilities/blob_db/blob_db.cc
|
2017-05-10 23:54:35 +02:00
|
|
|
utilities/blob_db/blob_db_impl.cc
|
2018-08-27 19:56:28 +02:00
|
|
|
utilities/blob_db/blob_db_impl_filesnapshot.cc
|
2017-05-31 07:16:32 +02:00
|
|
|
utilities/blob_db/blob_dump_tool.cc
|
2017-05-11 18:43:59 +02:00
|
|
|
utilities/blob_db/blob_file.cc
|
2017-07-21 23:42:32 +02:00
|
|
|
utilities/cassandra/cassandra_compaction_filter.cc
|
|
|
|
utilities/cassandra/format.cc
|
|
|
|
utilities/cassandra/merge_operator.cc
|
2017-04-24 23:57:27 +02:00
|
|
|
utilities/checkpoint/checkpoint_impl.cc
|
2016-01-28 15:44:31 +01:00
|
|
|
utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc
|
2017-05-12 23:59:57 +02:00
|
|
|
utilities/debug.cc
|
2015-11-19 20:47:12 +01:00
|
|
|
utilities/env_mirror.cc
|
2017-04-04 20:12:47 +02:00
|
|
|
utilities/env_timed.cc
|
2020-07-09 23:33:42 +02:00
|
|
|
utilities/fault_injection_env.cc
|
|
|
|
utilities/fault_injection_fs.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
utilities/leveldb_options/leveldb_options.cc
|
2015-11-04 02:52:17 +01:00
|
|
|
utilities/memory/memory_util.cc
|
2018-03-06 19:20:52 +01:00
|
|
|
utilities/merge_operators/bytesxor.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
utilities/merge_operators/max.cc
|
|
|
|
utilities/merge_operators/put.cc
|
New API to get all merge operands for a Key (#5604)
Summary:
This is a new API added to db.h to allow for fetching all merge operands associated with a Key. The main motivation for this API is to support use cases where doing a full online merge is not necessary as it is performance sensitive. Example use-cases:
1. Update subset of columns and read subset of columns -
Imagine a SQL Table, a row is encoded as a K/V pair (as it is done in MyRocks). If there are many columns and users only updated one of them, we can use merge operator to reduce write amplification. While users only read one or two columns in the read query, this feature can avoid a full merging of the whole row, and save some CPU.
2. Updating very few attributes in a value which is a JSON-like document -
Updating one attribute can be done efficiently using merge operator, while reading back one attribute can be done more efficiently if we don't need to do a full merge.
----------------------------------------------------------------------------------------------------
API :
Status GetMergeOperands(
const ReadOptions& options, ColumnFamilyHandle* column_family,
const Slice& key, PinnableSlice* merge_operands,
GetMergeOperandsOptions* get_merge_operands_options,
int* number_of_operands)
Example usage :
int size = 100;
int number_of_operands = 0;
std::vector<PinnableSlice> values(size);
GetMergeOperandsOptions merge_operands_info;
db_->GetMergeOperands(ReadOptions(), db_->DefaultColumnFamily(), "k1", values.data(), merge_operands_info, &number_of_operands);
Description :
Returns all the merge operands corresponding to the key. If the number of merge operands in DB is greater than merge_operands_options.expected_max_number_of_operands no merge operands are returned and status is Incomplete. Merge operands returned are in the order of insertion.
merge_operands-> Points to an array of at-least merge_operands_options.expected_max_number_of_operands and the caller is responsible for allocating it. If the status returned is Incomplete then number_of_operands will contain the total number of merge operands found in DB for key.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/5604
Test Plan:
Added unit test and perf test in db_bench that can be run using the command:
./db_bench -benchmarks=getmergeoperands --merge_operator=sortlist
Differential Revision: D16657366
Pulled By: vjnadimpalli
fbshipit-source-id: 0faadd752351745224ee12d4ae9ef3cb529951bf
2019-08-06 23:22:34 +02:00
|
|
|
utilities/merge_operators/sortlist.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
utilities/merge_operators/string_append/stringappend.cc
|
|
|
|
utilities/merge_operators/string_append/stringappend2.cc
|
|
|
|
utilities/merge_operators/uint64add.cc
|
2019-07-24 02:08:26 +02:00
|
|
|
utilities/object_registry.cc
|
2016-07-14 06:08:15 +02:00
|
|
|
utilities/option_change_migration/option_change_migration.cc
|
Add OptionsUtil::LoadOptionsFromFile() API
Summary:
This patch adds OptionsUtil::LoadOptionsFromFile() and
OptionsUtil::LoadLatestOptionsFromDB(), which allow developers
to construct DBOptions and ColumnFamilyOptions from a RocksDB
options file. Note that most pointer-typed options such as
merge_operator will not be constructed.
With this API, developers no longer need to remember all the
options in order to reopen an existing rocksdb instance like
the following:
DBOptions db_options;
std::vector<std::string> cf_names;
std::vector<ColumnFamilyOptions> cf_opts;
// Load primitive-typed options from an existing DB
OptionsUtil::LoadLatestOptionsFromDB(
dbname, &db_options, &cf_names, &cf_opts);
// Initialize necessary pointer-typed options
cf_opts[0].merge_operator.reset(new MyMergeOperator());
...
// Construct the vector of ColumnFamilyDescriptor
std::vector<ColumnFamilyDescriptor> cf_descs;
for (size_t i = 0; i < cf_opts.size(); ++i) {
cf_descs.emplace_back(cf_names[i], cf_opts[i]);
}
// Open the DB
DB* db = nullptr;
std::vector<ColumnFamilyHandle*> cf_handles;
auto s = DB::Open(db_options, dbname, cf_descs,
&handles, &db);
Test Plan:
Augment existing tests in column_family_test
options_test
db_test
Reviewers: igor, IslamAbdelRahman, sdong, anthony
Reviewed By: anthony
Subscribers: dhruba, leveldb
Differential Revision: https://reviews.facebook.net/D49095
2015-11-12 15:52:43 +01:00
|
|
|
utilities/options/options_util.cc
|
2016-08-03 02:15:18 +02:00
|
|
|
utilities/persistent_cache/block_cache_tier.cc
|
|
|
|
utilities/persistent_cache/block_cache_tier_file.cc
|
|
|
|
utilities/persistent_cache/block_cache_tier_metadata.cc
|
2016-04-21 21:20:05 +02:00
|
|
|
utilities/persistent_cache/persistent_cache_tier.cc
|
2016-06-08 01:07:30 +02:00
|
|
|
utilities/persistent_cache/volatile_tier_impl.cc
|
2019-07-01 21:43:14 +02:00
|
|
|
utilities/simulator_cache/cache_simulator.cc
|
2016-06-30 03:44:22 +02:00
|
|
|
utilities/simulator_cache/sim_cache.cc
|
2015-08-04 05:42:55 +02:00
|
|
|
utilities/table_properties_collectors/compact_on_deletion_collector.cc
|
2018-08-01 09:14:43 +02:00
|
|
|
utilities/trace/file_trace_reader_writer.cc
|
Replace tracked_keys with a new LockTracker interface in TransactionDB (#7013)
Summary:
We're going to support more locking protocols such as range lock in transaction.
However, in current design, `TransactionBase` has a member `tracked_keys` which assumes that point lock (lock a single key) is used, and is used in snapshot checking (isolation protocol). When using range lock, we may use read committed instead of snapshot checking as the isolation protocol.
The most significant usage scenarios of `tracked_keys` are:
1. pessimistic transaction uses it to track the locked keys, and unlock these keys when commit or rollback.
2. optimistic transaction does not lock keys upfront, it only tracks the lock intentions in tracked_keys, and do write conflict checking when commit.
3. each `SavePoint` tracks the keys that are locked since the `SavePoint`, `RollbackToSavePoint` or `PopSavePoint` relies on both the tracked keys in `SavePoint`s and `tracked_keys`.
Based on these scenarios, if we can abstract out a `LockTracker` interface to hold a set of tracked locks (can be keys or key ranges), and have methods that can be composed together to implement the scenarios, then `tracked_keys` can be an internal data structure of one implementation of `LockTracker`. See `utilities/transactions/lock/lock_tracker.h` for the detailed interface design, and `utilities/transactions/lock/point_lock_tracker.cc` for the implementation.
In the future, a `RangeLockTracker` can be implemented to track range locks without affecting other components.
After this PR, a clean interface for lock manager should be possible, and then ideally, we can have pluggable locking protocols.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/7013
Test Plan: Run `transaction_test` and `optimistic_transaction_test`.
Reviewed By: ajkr
Differential Revision: D22163706
Pulled By: cheng-chang
fbshipit-source-id: f2860577b5334e31dd2994f5bc6d7c40d502b1b4
2020-08-06 21:36:48 +02:00
|
|
|
utilities/transactions/lock/lock_tracker.cc
|
|
|
|
utilities/transactions/lock/point_lock_tracker.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
utilities/transactions/optimistic_transaction_db_impl.cc
|
2017-08-08 01:07:40 +02:00
|
|
|
utilities/transactions/optimistic_transaction.cc
|
2017-10-06 19:26:38 +02:00
|
|
|
utilities/transactions/pessimistic_transaction.cc
|
2017-08-06 02:17:48 +02:00
|
|
|
utilities/transactions/pessimistic_transaction_db.cc
|
2017-10-06 19:26:38 +02:00
|
|
|
utilities/transactions/snapshot_checker.cc
|
|
|
|
utilities/transactions/transaction_base.cc
|
2015-09-08 21:36:48 +02:00
|
|
|
utilities/transactions/transaction_db_mutex_impl.cc
|
Pessimistic Transactions
Summary:
Initial implementation of Pessimistic Transactions. This diff contains the api changes discussed in D38913. This diff is pretty large, so let me know if people would prefer to meet up to discuss it.
MyRocks folks: please take a look at the API in include/rocksdb/utilities/transaction[_db].h and let me know if you have any issues.
Also, you'll notice a couple of TODOs in the implementation of RollbackToSavePoint(). After chatting with Siying, I'm going to send out a separate diff for an alternate implementation of this feature that implements the rollback inside of WriteBatch/WriteBatchWithIndex. We can then decide which route is preferable.
Next, I'm planning on doing some perf testing and then integrating this diff into MongoRocks for further testing.
Test Plan: Unit tests, db_bench parallel testing.
Reviewers: igor, rven, sdong, yhchiang, yoshinorim
Reviewed By: sdong
Subscribers: hermanlee4, maykov, spetrunia, leveldb, dhruba
Differential Revision: https://reviews.facebook.net/D40869
2015-05-26 02:37:33 +02:00
|
|
|
utilities/transactions/transaction_lock_mgr.cc
|
|
|
|
utilities/transactions/transaction_util.cc
|
2017-08-08 01:07:40 +02:00
|
|
|
utilities/transactions/write_prepared_txn.cc
|
2017-11-02 19:05:55 +01:00
|
|
|
utilities/transactions/write_prepared_txn_db.cc
|
2018-05-31 19:42:44 +02:00
|
|
|
utilities/transactions/write_unprepared_txn.cc
|
|
|
|
utilities/transactions/write_unprepared_txn_db.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
utilities/ttl/db_ttl_impl.cc
|
|
|
|
utilities/write_batch_with_index/write_batch_with_index.cc
|
|
|
|
utilities/write_batch_with_index/write_batch_with_index_internal.cc
|
2016-09-28 20:53:15 +02:00
|
|
|
$<TARGET_OBJECTS:build_version>)
|
|
|
|
|
2018-10-18 20:19:51 +02:00
|
|
|
if(HAVE_SSE42 AND NOT MSVC)
|
|
|
|
set_source_files_properties(
|
|
|
|
util/crc32c.cc
|
|
|
|
PROPERTIES COMPILE_FLAGS "-msse4.2 -mpclmul")
|
2017-10-11 21:14:53 +02:00
|
|
|
endif()
|
|
|
|
|
2020-03-11 20:31:06 +01:00
|
|
|
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
|
2018-01-24 01:44:09 +01:00
|
|
|
list(APPEND SOURCES
|
|
|
|
util/crc32c_ppc.c
|
|
|
|
util/crc32c_ppc_asm.S)
|
2020-03-11 20:31:06 +01:00
|
|
|
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
|
2018-01-24 01:44:09 +01:00
|
|
|
|
2019-05-15 22:24:36 +02:00
|
|
|
if(HAS_ARMV8_CRC)
|
|
|
|
list(APPEND SOURCES
|
|
|
|
util/crc32c_arm64.cc)
|
|
|
|
endif(HAS_ARMV8_CRC)
|
|
|
|
|
2016-09-28 20:53:15 +02:00
|
|
|
if(WIN32)
|
|
|
|
list(APPEND SOURCES
|
|
|
|
port/win/io_win.cc
|
|
|
|
port/win/env_win.cc
|
|
|
|
port/win/env_default.cc
|
|
|
|
port/win/port_win.cc
|
2020-06-03 20:59:37 +02:00
|
|
|
port/win/win_logger.cc)
|
|
|
|
if(NOT MINGW)
|
|
|
|
# Mingw only supports std::thread when using
|
|
|
|
# posix threads.
|
|
|
|
list(APPEND SOURCES
|
|
|
|
port/win/win_thread.cc)
|
|
|
|
endif()
|
2018-05-01 22:38:36 +02:00
|
|
|
if(WITH_XPRESS)
|
|
|
|
list(APPEND SOURCES
|
2016-09-28 20:53:15 +02:00
|
|
|
port/win/xpress_win.cc)
|
2018-05-01 22:38:36 +02:00
|
|
|
endif()
|
2017-11-02 19:05:55 +01:00
|
|
|
|
2017-10-27 22:14:07 +02:00
|
|
|
if(WITH_JEMALLOC)
|
|
|
|
list(APPEND SOURCES
|
|
|
|
port/win/win_jemalloc.cc)
|
|
|
|
endif()
|
2017-11-02 19:05:55 +01:00
|
|
|
|
2016-09-28 20:53:15 +02:00
|
|
|
else()
|
|
|
|
list(APPEND SOURCES
|
|
|
|
port/port_posix.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
env/env_posix.cc
|
Introduce a new storage specific Env API (#5761)
Summary:
The current Env API encompasses both storage/file operations, as well as OS related operations. Most of the APIs return a Status, which does not have enough metadata about an error, such as whether its retry-able or not, scope (i.e fault domain) of the error etc., that may be required in order to properly handle a storage error. The file APIs also do not provide enough control over the IO SLA, such as timeout, prioritization, hinting about placement and redundancy etc.
This PR separates out the file/storage APIs from Env into a new FileSystem class. The APIs are updated to return an IOStatus with metadata about the error, as well as to take an IOOptions structure as input in order to allow more control over the IO.
The user can set both ```options.env``` and ```options.file_system``` to specify that RocksDB should use the former for OS related operations and the latter for storage operations. Internally, a ```CompositeEnvWrapper``` has been introduced that inherits from ```Env``` and redirects individual methods to either an ```Env``` implementation or the ```FileSystem``` as appropriate. When options are sanitized during ```DB::Open```, ```options.env``` is replaced with a newly allocated ```CompositeEnvWrapper``` instance if both env and file_system have been specified. This way, the rest of the RocksDB code can continue to function as before.
This PR also ports PosixEnv to the new API by splitting it into two - PosixEnv and PosixFileSystem. PosixEnv is defined as a sub-class of CompositeEnvWrapper, and threading/time functions are overridden with Posix specific implementations in order to avoid an extra level of indirection.
The ```CompositeEnvWrapper``` translates ```IOStatus``` return code to ```Status```, and sets the severity to ```kSoftError``` if the io_status is retryable. The error handling code in RocksDB can then recover the DB automatically.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/5761
Differential Revision: D18868376
Pulled By: anand1976
fbshipit-source-id: 39efe18a162ea746fabac6360ff529baba48486f
2019-12-13 23:47:08 +01:00
|
|
|
env/fs_posix.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
env/io_posix.cc)
|
2016-09-28 20:53:15 +02:00
|
|
|
endif()
|
2015-07-02 01:13:49 +02:00
|
|
|
|
2019-08-07 23:29:35 +02:00
|
|
|
if(WITH_FOLLY_DISTRIBUTED_MUTEX)
|
|
|
|
list(APPEND SOURCES
|
|
|
|
third-party/folly/folly/detail/Futex.cpp
|
|
|
|
third-party/folly/folly/synchronization/AtomicNotification.cpp
|
|
|
|
third-party/folly/folly/synchronization/DistributedMutex.cpp
|
|
|
|
third-party/folly/folly/synchronization/ParkingLot.cpp
|
|
|
|
third-party/folly/folly/synchronization/WaitOptions.cpp)
|
|
|
|
endif()
|
|
|
|
|
2017-05-06 01:09:24 +02:00
|
|
|
set(ROCKSDB_STATIC_LIB rocksdb${ARTIFACT_SUFFIX})
|
|
|
|
set(ROCKSDB_SHARED_LIB rocksdb-shared${ARTIFACT_SUFFIX})
|
2019-12-11 00:19:24 +01:00
|
|
|
|
|
|
|
option(ROCKSDB_BUILD_SHARED "Build shared versions of the RocksDB libraries" ON)
|
2018-04-15 22:14:26 +02:00
|
|
|
|
|
|
|
option(WITH_LIBRADOS "Build with librados" OFF)
|
|
|
|
if(WITH_LIBRADOS)
|
|
|
|
list(APPEND SOURCES
|
|
|
|
utilities/env_librados.cc)
|
|
|
|
list(APPEND THIRDPARTY_LIBS rados)
|
|
|
|
endif()
|
|
|
|
|
2017-01-20 22:16:22 +01:00
|
|
|
if(WIN32)
|
2019-11-26 19:57:29 +01:00
|
|
|
set(SYSTEM_LIBS ${SYSTEM_LIBS} shlwapi.lib rpcrt4.lib)
|
2017-01-20 22:16:22 +01:00
|
|
|
else()
|
cross-platform compatibility improvements
Summary:
We've had a couple CockroachDB users fail to build RocksDB on exotic platforms, so I figured I'd try my hand at solving these issues upstream. The problems stem from a) `USE_SSE=1` being too aggressive about turning on SSE4.2, even on toolchains that don't support SSE4.2 and b) RocksDB attempting to detect support for thread-local storage based on OS, even though it can vary by compiler on the same OS.
See the individual commit messages for details. Regarding SSE support, this PR should change virtually nothing for non-CMake based builds. `make`, `PORTABLE=1 make`, `USE_SSE=1 make`, and `PORTABLE=1 USE_SSE=1 make` function exactly as before, except that SSE support will be automatically disabled when a simple SSE4.2-using test program fails to compile, as it does on OpenBSD. (OpenBSD's ports GCC supports SSE4.2, but its binutils do not, so `__SSE_4_2__` is defined but an SSE4.2-using program will fail to assemble.) A warning is emitted in this case. The CMake build is modified to support the same set of options, except that `USE_SSE` is spelled `FORCE_SSE42` because `USE_SSE` is rather useless now that we can automatically detect SSE support, and I figure changing options in the CMake build is less disruptive than changing the non-CMake build.
I've tested these changes on all the platforms I can get my hands on (macOS, Windows MSVC, Windows MinGW, and OpenBSD) and it all works splendidly. Let me know if there's anything you object to—I obviously don't mean to break any of your build pipelines in the process of fixing ours downstream.
Closes https://github.com/facebook/rocksdb/pull/2199
Differential Revision: D5054042
Pulled By: yiwu-arbug
fbshipit-source-id: 938e1fc665c049c02ae15698e1409155b8e72171
2017-05-15 23:42:32 +02:00
|
|
|
set(SYSTEM_LIBS ${CMAKE_THREAD_LIBS_INIT})
|
2017-01-20 22:16:22 +01:00
|
|
|
endif()
|
|
|
|
|
|
|
|
add_library(${ROCKSDB_STATIC_LIB} STATIC ${SOURCES})
|
2020-05-13 06:05:50 +02:00
|
|
|
target_link_libraries(${ROCKSDB_STATIC_LIB} PRIVATE
|
2016-09-28 20:53:15 +02:00
|
|
|
${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
|
|
|
|
|
2019-12-11 00:19:24 +01:00
|
|
|
if(ROCKSDB_BUILD_SHARED)
|
|
|
|
add_library(${ROCKSDB_SHARED_LIB} SHARED ${SOURCES})
|
2020-05-13 06:05:50 +02:00
|
|
|
target_link_libraries(${ROCKSDB_SHARED_LIB} PRIVATE
|
2017-01-20 22:16:22 +01:00
|
|
|
${THIRDPARTY_LIBS} ${SYSTEM_LIBS})
|
2019-12-11 00:19:24 +01:00
|
|
|
|
|
|
|
if(WIN32)
|
|
|
|
set_target_properties(${ROCKSDB_SHARED_LIB} PROPERTIES
|
|
|
|
COMPILE_DEFINITIONS "ROCKSDB_DLL;ROCKSDB_LIBRARY_EXPORTS")
|
|
|
|
if(MSVC)
|
|
|
|
set_target_properties(${ROCKSDB_STATIC_LIB} PROPERTIES
|
|
|
|
COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/${ROCKSDB_STATIC_LIB}.pdb")
|
|
|
|
set_target_properties(${ROCKSDB_SHARED_LIB} PROPERTIES
|
|
|
|
COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/${ROCKSDB_SHARED_LIB}.pdb")
|
|
|
|
endif()
|
|
|
|
else()
|
|
|
|
set_target_properties(${ROCKSDB_SHARED_LIB} PROPERTIES
|
|
|
|
LINKER_LANGUAGE CXX
|
|
|
|
VERSION ${rocksdb_VERSION}
|
|
|
|
SOVERSION ${rocksdb_VERSION_MAJOR}
|
|
|
|
OUTPUT_NAME "rocksdb")
|
2017-03-31 01:47:19 +02:00
|
|
|
endif()
|
2016-09-28 20:53:15 +02:00
|
|
|
endif()
|
|
|
|
|
2019-12-11 00:19:24 +01:00
|
|
|
if(ROCKSDB_BUILD_SHARED AND NOT WIN32)
|
|
|
|
set(ROCKSDB_LIB ${ROCKSDB_SHARED_LIB})
|
|
|
|
else()
|
|
|
|
set(ROCKSDB_LIB ${ROCKSDB_STATIC_LIB})
|
|
|
|
endif()
|
|
|
|
|
2016-09-28 20:53:15 +02:00
|
|
|
option(WITH_JNI "build with JNI" OFF)
|
2020-06-04 03:18:38 +02:00
|
|
|
# Tests are excluded from Release builds
|
|
|
|
CMAKE_DEPENDENT_OPTION(WITH_TESTS "build with tests" ON
|
|
|
|
"CMAKE_BUILD_TYPE STREQUAL Debug" OFF)
|
|
|
|
option(WITH_BENCHMARK_TOOLS "build with benchmarks" ON)
|
|
|
|
option(WITH_CORE_TOOLS "build with ldb and sst_dump" ON)
|
|
|
|
option(WITH_TOOLS "build with tools" ON)
|
|
|
|
|
|
|
|
if(WITH_TESTS OR WITH_BENCHMARK_TOOLS OR WITH_TOOLS OR WITH_JNI OR JNI)
|
|
|
|
include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/third-party/gtest-1.8.1/fused-src)
|
|
|
|
endif()
|
2016-09-28 20:53:15 +02:00
|
|
|
if(WITH_JNI OR JNI)
|
|
|
|
message(STATUS "JNI library is enabled")
|
|
|
|
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/java)
|
2016-01-28 15:44:31 +01:00
|
|
|
else()
|
|
|
|
message(STATUS "JNI library is disabled")
|
|
|
|
endif()
|
|
|
|
|
2017-08-21 23:41:11 +02:00
|
|
|
# Installation and packaging
|
|
|
|
if(WIN32)
|
|
|
|
option(ROCKSDB_INSTALL_ON_WINDOWS "Enable install target on Windows" OFF)
|
|
|
|
endif()
|
|
|
|
if(NOT WIN32 OR ROCKSDB_INSTALL_ON_WINDOWS)
|
|
|
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
|
|
|
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
|
|
|
# Change default installation prefix on Linux to /usr
|
|
|
|
set(CMAKE_INSTALL_PREFIX /usr CACHE PATH "Install path prefix, prepended onto install directories." FORCE)
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
|
|
|
include(GNUInstallDirs)
|
2017-08-29 01:56:49 +02:00
|
|
|
include(CMakePackageConfigHelpers)
|
|
|
|
|
|
|
|
set(package_config_destination ${CMAKE_INSTALL_LIBDIR}/cmake/rocksdb)
|
|
|
|
|
|
|
|
configure_package_config_file(
|
2018-01-16 23:13:38 +01:00
|
|
|
${CMAKE_CURRENT_LIST_DIR}/cmake/RocksDBConfig.cmake.in RocksDBConfig.cmake
|
2017-08-29 01:56:49 +02:00
|
|
|
INSTALL_DESTINATION ${package_config_destination}
|
|
|
|
)
|
|
|
|
|
|
|
|
write_basic_package_version_file(
|
|
|
|
RocksDBConfigVersion.cmake
|
2019-08-06 04:47:33 +02:00
|
|
|
VERSION ${rocksdb_VERSION}
|
2017-08-29 01:56:49 +02:00
|
|
|
COMPATIBILITY SameMajorVersion
|
|
|
|
)
|
|
|
|
|
|
|
|
install(DIRECTORY include/rocksdb COMPONENT devel DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
|
|
|
|
|
2020-05-13 06:16:50 +02:00
|
|
|
install(DIRECTORY "${PROJECT_SOURCE_DIR}/cmake/modules" COMPONENT devel DESTINATION ${package_config_destination})
|
|
|
|
|
2017-08-29 01:56:49 +02:00
|
|
|
install(
|
|
|
|
TARGETS ${ROCKSDB_STATIC_LIB}
|
|
|
|
EXPORT RocksDBTargets
|
|
|
|
COMPONENT devel
|
|
|
|
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
|
|
|
INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
|
|
|
|
)
|
|
|
|
|
2019-12-11 00:19:24 +01:00
|
|
|
if(ROCKSDB_BUILD_SHARED)
|
|
|
|
install(
|
|
|
|
TARGETS ${ROCKSDB_SHARED_LIB}
|
|
|
|
EXPORT RocksDBTargets
|
|
|
|
COMPONENT runtime
|
|
|
|
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
|
|
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
|
|
|
|
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
|
|
|
INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
|
|
|
|
)
|
|
|
|
endif()
|
2017-08-29 01:56:49 +02:00
|
|
|
|
|
|
|
install(
|
|
|
|
EXPORT RocksDBTargets
|
|
|
|
COMPONENT devel
|
|
|
|
DESTINATION ${package_config_destination}
|
|
|
|
NAMESPACE RocksDB::
|
|
|
|
)
|
|
|
|
|
|
|
|
install(
|
|
|
|
FILES
|
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/RocksDBConfig.cmake
|
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/RocksDBConfigVersion.cmake
|
|
|
|
COMPONENT devel
|
|
|
|
DESTINATION ${package_config_destination}
|
|
|
|
)
|
2017-08-21 23:41:11 +02:00
|
|
|
endif()
|
|
|
|
|
2020-06-13 02:04:35 +02:00
|
|
|
option(WITH_ALL_TESTS "Build all test, rather than a small subset" ON)
|
|
|
|
|
2020-07-09 03:50:58 +02:00
|
|
|
if(WITH_TESTS OR WITH_BENCHMARK_TOOLS)
|
2020-06-04 00:53:09 +02:00
|
|
|
add_subdirectory(third-party/gtest-1.8.1/fused-src/gtest)
|
2020-02-08 02:06:43 +01:00
|
|
|
add_library(testharness STATIC
|
|
|
|
test_util/testharness.cc)
|
|
|
|
target_link_libraries(testharness gtest)
|
2020-07-09 03:50:58 +02:00
|
|
|
endif()
|
2020-08-05 03:40:19 +02:00
|
|
|
|
2020-07-09 03:50:58 +02:00
|
|
|
if(WITH_TESTS)
|
2017-08-29 03:36:35 +02:00
|
|
|
set(TESTS
|
2020-06-13 02:04:35 +02:00
|
|
|
db/db_basic_test.cc
|
|
|
|
env/env_basic_test.cc
|
|
|
|
)
|
|
|
|
if(WITH_ALL_TESTS)
|
|
|
|
list(APPEND TESTS
|
2017-04-06 04:02:00 +02:00
|
|
|
cache/cache_test.cc
|
|
|
|
cache/lru_cache_test.cc
|
2020-03-12 18:58:27 +01:00
|
|
|
db/blob/blob_file_addition_test.cc
|
2020-08-27 20:54:43 +02:00
|
|
|
db/blob/blob_file_builder_test.cc
|
2020-03-12 18:58:27 +01:00
|
|
|
db/blob/blob_file_garbage_test.cc
|
|
|
|
db/blob/db_blob_index_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/column_family_test.cc
|
|
|
|
db/compact_files_test.cc
|
2019-05-31 20:52:59 +02:00
|
|
|
db/compaction/compaction_job_stats_test.cc
|
|
|
|
db/compaction/compaction_job_test.cc
|
|
|
|
db/compaction/compaction_iterator_test.cc
|
|
|
|
db/compaction/compaction_picker_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/comparator_db_test.cc
|
|
|
|
db/corruption_test.cc
|
|
|
|
db/cuckoo_table_db_test.cc
|
2020-03-13 19:33:04 +01:00
|
|
|
db/db_with_timestamp_basic_test.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
db/db_block_cache_test.cc
|
|
|
|
db/db_bloom_filter_test.cc
|
2015-07-15 01:03:47 +02:00
|
|
|
db/db_compaction_filter_test.cc
|
2015-07-21 12:05:57 +02:00
|
|
|
db/db_compaction_test.cc
|
2015-07-15 01:03:47 +02:00
|
|
|
db/db_dynamic_level_test.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
db/db_flush_test.cc
|
2015-07-21 01:05:28 +02:00
|
|
|
db/db_inplace_update_test.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
db/db_io_failure_test.cc
|
2016-01-21 00:17:52 +01:00
|
|
|
db/db_iter_test.cc
|
Change and clarify the relationship between Valid(), status() and Seek*() for all iterators. Also fix some bugs
Summary:
Before this PR, Iterator/InternalIterator may simultaneously have non-ok status() and Valid() = true. That state means that the last operation failed, but the iterator is nevertheless positioned on some unspecified record. Likely intended uses of that are:
* If some sst files are corrupted, a normal iterator can be used to read the data from files that are not corrupted.
* When using read_tier = kBlockCacheTier, read the data that's in block cache, skipping over the data that is not.
However, this behavior wasn't documented well (and until recently the wiki on github had misleading incorrect information). In the code there's a lot of confusion about the relationship between status() and Valid(), and about whether Seek()/SeekToLast()/etc reset the status or not. There were a number of bugs caused by this confusion, both inside rocksdb and in the code that uses rocksdb (including ours).
This PR changes the convention to:
* If status() is not ok, Valid() always returns false.
* Any seek operation resets status. (Before the PR, it depended on iterator type and on particular error.)
This does sacrifice the two use cases listed above, but siying said it's ok.
Overview of the changes:
* A commit that adds missing status checks in MergingIterator. This fixes a bug that actually affects us, and we need it fixed. `DBIteratorTest.NonBlockingIterationBugRepro` explains the scenario.
* Changes to lots of iterator types to make all of them conform to the new convention. Some bug fixes along the way. By far the biggest changes are in DBIter, which is a big messy piece of code; I tried to make it less big and messy but mostly failed.
* A stress-test for DBIter, to gain some confidence that I didn't break it. It does a few million random operations on the iterator, while occasionally modifying the underlying data (like ForwardIterator does) and occasionally returning non-ok status from internal iterator.
To find the iterator types that needed changes I searched for "public .*Iterator" in the code. Here's an overview of all 27 iterator types:
Iterators that didn't need changes:
* status() is always ok(), or Valid() is always false: MemTableIterator, ModelIter, TestIterator, KVIter (2 classes with this name anonymous namespaces), LoggingForwardVectorIterator, VectorIterator, MockTableIterator, EmptyIterator, EmptyInternalIterator.
* Thin wrappers that always pass through Valid() and status(): ArenaWrappedDBIter, TtlIterator, InternalIteratorFromIterator.
Iterators with changes (see inline comments for details):
* DBIter - an overhaul:
- It used to silently skip corrupted keys (`FindParseableKey()`), which seems dangerous. This PR makes it just stop immediately after encountering a corrupted key, just like it would for other kinds of corruption. Let me know if there was actually some deeper meaning in this behavior and I should put it back.
- It had a few code paths silently discarding subiterator's status. The stress test caught a few.
- The backwards iteration code path was expecting the internal iterator's set of keys to be immutable. It's probably always true in practice at the moment, since ForwardIterator doesn't support backwards iteration, but this PR fixes it anyway. See added DBIteratorTest.ReverseToForwardBug for an example.
- Some parts of backwards iteration code path even did things like `assert(iter_->Valid())` after a seek, which is never a safe assumption.
- It used to not reset status on seek for some types of errors.
- Some simplifications and better comments.
- Some things got more complicated from the added error handling. I'm open to ideas for how to make it nicer.
* MergingIterator - check status after every operation on every subiterator, and in some places assert that valid subiterators have ok status.
* ForwardIterator - changed to the new convention, also slightly simplified.
* ForwardLevelIterator - fixed some bugs and simplified.
* LevelIterator - simplified.
* TwoLevelIterator - changed to the new convention. Also fixed a bug that would make SeekForPrev() sometimes silently ignore errors from first_level_iter_.
* BlockBasedTableIterator - minor changes.
* BlockIter - replaced `SetStatus()` with `Invalidate()` to make sure non-ok BlockIter is always invalid.
* PlainTableIterator - some seeks used to not reset status.
* CuckooTableIterator - tiny code cleanup.
* ManagedIterator - fixed some bugs.
* BaseDeltaIterator - changed to the new convention and fixed a bug.
* BlobDBIterator - seeks used to not reset status.
* KeyConvertingIterator - some small change.
Closes https://github.com/facebook/rocksdb/pull/3810
Differential Revision: D7888019
Pulled By: al13n321
fbshipit-source-id: 4aaf6d3421c545d16722a815b2fa2e7912bc851d
2018-05-17 11:44:14 +02:00
|
|
|
db/db_iter_stress_test.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
db/db_iterator_test.cc
|
2015-07-21 00:51:33 +02:00
|
|
|
db/db_log_iter_test.cc
|
2016-11-14 03:58:17 +01:00
|
|
|
db/db_memtable_test.cc
|
2016-12-16 20:00:03 +01:00
|
|
|
db/db_merge_operator_test.cc
|
New API to get all merge operands for a Key (#5604)
Summary:
This is a new API added to db.h to allow for fetching all merge operands associated with a Key. The main motivation for this API is to support use cases where doing a full online merge is not necessary as it is performance sensitive. Example use-cases:
1. Update subset of columns and read subset of columns -
Imagine a SQL Table, a row is encoded as a K/V pair (as it is done in MyRocks). If there are many columns and users only updated one of them, we can use merge operator to reduce write amplification. While users only read one or two columns in the read query, this feature can avoid a full merging of the whole row, and save some CPU.
2. Updating very few attributes in a value which is a JSON-like document -
Updating one attribute can be done efficiently using merge operator, while reading back one attribute can be done more efficiently if we don't need to do a full merge.
----------------------------------------------------------------------------------------------------
API :
Status GetMergeOperands(
const ReadOptions& options, ColumnFamilyHandle* column_family,
const Slice& key, PinnableSlice* merge_operands,
GetMergeOperandsOptions* get_merge_operands_options,
int* number_of_operands)
Example usage :
int size = 100;
int number_of_operands = 0;
std::vector<PinnableSlice> values(size);
GetMergeOperandsOptions merge_operands_info;
db_->GetMergeOperands(ReadOptions(), db_->DefaultColumnFamily(), "k1", values.data(), merge_operands_info, &number_of_operands);
Description :
Returns all the merge operands corresponding to the key. If the number of merge operands in DB is greater than merge_operands_options.expected_max_number_of_operands no merge operands are returned and status is Incomplete. Merge operands returned are in the order of insertion.
merge_operands-> Points to an array of at-least merge_operands_options.expected_max_number_of_operands and the caller is responsible for allocating it. If the status returned is Incomplete then number_of_operands will contain the total number of merge operands found in DB for key.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/5604
Test Plan:
Added unit test and perf test in db_bench that can be run using the command:
./db_bench -benchmarks=getmergeoperands --merge_operator=sortlist
Differential Revision: D16657366
Pulled By: vjnadimpalli
fbshipit-source-id: 0faadd752351745224ee12d4ae9ef3cb529951bf
2019-08-06 23:22:34 +02:00
|
|
|
db/db_merge_operand_test.cc
|
2016-07-13 00:30:38 +02:00
|
|
|
db/db_options_test.cc
|
2016-01-21 00:17:52 +01:00
|
|
|
db/db_properties_test.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
db/db_range_del_test.cc
|
2019-05-31 20:52:59 +02:00
|
|
|
db/db_impl/db_secondary_test.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
db/db_sst_test.cc
|
2017-04-26 23:18:58 +02:00
|
|
|
db/db_statistics_test.cc
|
2016-01-21 00:17:52 +01:00
|
|
|
db/db_table_properties_test.cc
|
|
|
|
db/db_tailing_iter_test.cc
|
|
|
|
db/db_test.cc
|
2016-03-01 03:38:03 +01:00
|
|
|
db/db_test2.cc
|
2020-03-12 02:36:43 +01:00
|
|
|
db/db_logical_block_size_cache_test.cc
|
2015-07-15 03:24:45 +02:00
|
|
|
db/db_universal_compaction_test.cc
|
2015-08-05 20:56:19 +02:00
|
|
|
db/db_wal_test.cc
|
2020-04-11 01:03:33 +02:00
|
|
|
db/db_with_timestamp_compaction_test.cc
|
2017-05-31 19:45:47 +02:00
|
|
|
db/db_write_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/dbformat_test.cc
|
|
|
|
db/deletefile_test.cc
|
2020-03-04 21:30:34 +01:00
|
|
|
db/error_handler_fs_test.cc
|
2018-03-28 19:23:31 +02:00
|
|
|
db/obsolete_files_test.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
db/external_sst_file_basic_test.cc
|
|
|
|
db/external_sst_file_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/fault_injection_test.cc
|
|
|
|
db/file_indexer_test.cc
|
|
|
|
db/filename_test.cc
|
|
|
|
db/flush_job_test.cc
|
|
|
|
db/listener_test.cc
|
|
|
|
db/log_test.cc
|
2015-10-14 20:06:27 +02:00
|
|
|
db/manual_compaction_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/memtable_list_test.cc
|
2015-07-22 03:04:28 +02:00
|
|
|
db/merge_helper_test.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
db/merge_test.cc
|
2015-11-11 07:58:01 +01:00
|
|
|
db/options_file_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/perf_context_test.cc
|
|
|
|
db/plain_table_db_test.cc
|
|
|
|
db/prefix_test.cc
|
Use only "local" range tombstones during Get (#4449)
Summary:
Previously, range tombstones were accumulated from every level, which
was necessary if a range tombstone in a higher level covered a key in a lower
level. However, RangeDelAggregator::AddTombstones's complexity is based on
the number of tombstones that are currently stored in it, which is wasteful in
the Get case, where we only need to know the highest sequence number of range
tombstones that cover the key from higher levels, and compute the highest covering
sequence number at the current level. This change introduces this optimization, and
removes the use of RangeDelAggregator from the Get path.
In the benchmark results, the following command was used to initialize the database:
```
./db_bench -db=/dev/shm/5k-rts -use_existing_db=false -benchmarks=filluniquerandom -write_buffer_size=1048576 -compression_type=lz4 -target_file_size_base=1048576 -max_bytes_for_level_base=4194304 -value_size=112 -key_size=16 -block_size=4096 -level_compaction_dynamic_level_bytes=true -num=5000000 -max_background_jobs=12 -benchmark_write_rate_limit=20971520 -range_tombstone_width=100 -writes_per_range_tombstone=100 -max_num_range_tombstones=50000 -bloom_bits=8
```
...and the following command was used to measure read throughput:
```
./db_bench -db=/dev/shm/5k-rts/ -use_existing_db=true -benchmarks=readrandom -disable_auto_compactions=true -num=5000000 -reads=100000 -threads=32
```
The filluniquerandom command was only run once, and the resulting database was used
to measure read performance before and after the PR. Both binaries were compiled with
`DEBUG_LEVEL=0`.
Readrandom results before PR:
```
readrandom : 4.544 micros/op 220090 ops/sec; 16.9 MB/s (63103 of 100000 found)
```
Readrandom results after PR:
```
readrandom : 11.147 micros/op 89707 ops/sec; 6.9 MB/s (63103 of 100000 found)
```
So it's actually slower right now, but this PR paves the way for future optimizations (see #4493).
----
Pull Request resolved: https://github.com/facebook/rocksdb/pull/4449
Differential Revision: D10370575
Pulled By: abhimadan
fbshipit-source-id: 9a2e152be1ef36969055c0e9eb4beb0d96c11f4d
2018-10-24 21:29:29 +02:00
|
|
|
db/range_del_aggregator_test.cc
|
|
|
|
db/range_tombstone_fragmenter_test.cc
|
2016-03-18 23:18:42 +01:00
|
|
|
db/repair_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/table_properties_collector_test.cc
|
|
|
|
db/version_builder_test.cc
|
|
|
|
db/version_edit_test.cc
|
|
|
|
db/version_set_test.cc
|
|
|
|
db/wal_manager_test.cc
|
Define WAL related classes to be used in VersionEdit and VersionSet (#7164)
Summary:
`WalAddition`, `WalDeletion` are defined in `wal_version.h` and used in `VersionEdit`.
`WalAddition` is used to represent events of creating a new WAL (no size, just log number), or closing a WAL (with size).
`WalDeletion` is used to represent events of deleting or archiving a WAL, it means the WAL is no longer alive (won't be replayed during recovery).
`WalSet` is the set of alive WALs kept in `VersionSet`.
1. Why use `WalDeletion` instead of relying on `MinLogNumber` to identify outdated WALs
On recovery, we can compute `MinLogNumber()` based on the log numbers kept in MANIFEST, any log with number < MinLogNumber can be ignored. So it seems that we don't need to persist `WalDeletion` to MANIFEST, since we can ignore the WALs based on MinLogNumber.
But the `MinLogNumber()` is actually a lower bound, it does not exactly mean that logs starting from MinLogNumber must exist. This is because in a corner case, when a column family is empty and never flushed, its log number is set to the largest log number, but not persisted in MANIFEST. So let's say there are 2 column families, when creating the DB, the first WAL has log number 1, so it's persisted to MANIFEST for both column families. Then CF 0 is empty and never flushed, CF 1 is updated and flushed, so a new WAL with log number 2 is created and persisted to MANIFEST for CF 1. But CF 0's log number in MANIFEST is still 1. So on recovery, MinLogNumber is 1, but since log 1 only contains data for CF 1, and CF 1 is flushed, log 1 might have already been deleted from disk.
We can make `MinLogNumber()` be the exactly minimum log number that must exist, by persisting the most recent log number for empty column families that are not flushed. But if there are N such column families, then every time a new WAL is created, we need to add N records to MANIFEST.
In current design, a record is persisted to MANIFEST only when WAL is created, closed, or deleted/archived, so the number of WAL related records are bounded to 3x number of WALs.
2. Why keep `WalSet` in `VersionSet` instead of applying the `VersionEdit`s to `VersionStorageInfo`
`VersionEdit`s are originally designed to track the addition and deletion of SST files. The SST files are related to column families, each column family has a list of `Version`s, and each `Version` keeps the set of active SST files in `VersionStorageInfo`.
But WALs are a concept of DB, they are not bounded to specific column families. So logically it does not make sense to store WALs in a column family's `Version`s.
Also, `Version`'s purpose is to keep reference to SST / blob files, so that they are not deleted until there is no version referencing them. But a WAL is deleted regardless of version references.
So we keep the WALs in `VersionSet` for the purpose of writing out the DB state's snapshot when creating new MANIFESTs.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/7164
Test Plan:
make version_edit_test && ./version_edit_test
make wal_edit_test && ./wal_edit_test
Reviewed By: ltamasi
Differential Revision: D22677936
Pulled By: cheng-chang
fbshipit-source-id: 5a3b6890140e572ffd79eb37e6e4c3c32361a859
2020-08-06 01:32:26 +02:00
|
|
|
db/wal_edit_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
db/write_batch_test.cc
|
|
|
|
db/write_callback_test.cc
|
|
|
|
db/write_controller_test.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
env/env_test.cc
|
2020-03-12 02:36:43 +01:00
|
|
|
env/io_posix_test.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
env/mock_env_test.cc
|
2019-05-30 05:44:08 +02:00
|
|
|
file/delete_scheduler_test.cc
|
2020-08-28 03:15:11 +02:00
|
|
|
file/prefetch_test.cc
|
Support direct IO in RandomAccessFileReader::MultiRead (#6446)
Summary:
By supporting direct IO in RandomAccessFileReader::MultiRead, the benefits of parallel IO (IO uring) and direct IO can be combined.
In direct IO mode, read requests are aligned and merged together before being issued to RandomAccessFile::MultiRead, so blocks in the original requests might share the same underlying buffer, the shared buffers are returned in `aligned_bufs`, which is a new parameter of the `MultiRead` API.
For example, suppose alignment requirement for direct IO is 4KB, one request is (offset: 1KB, len: 1KB), another request is (offset: 3KB, len: 1KB), then since they all belong to page (offset: 0, len: 4KB), `MultiRead` only reads the page with direct IO into a buffer on heap, and returns 2 Slices referencing regions in that same buffer. See `random_access_file_reader_test.cc` for more examples.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6446
Test Plan: Added a new test `random_access_file_reader_test.cc`.
Reviewed By: anand1976
Differential Revision: D20097518
Pulled By: cheng-chang
fbshipit-source-id: ca48a8faf9c3af146465c102ef6b266a363e78d1
2020-03-21 00:15:40 +01:00
|
|
|
file/random_access_file_reader_test.cc
|
2019-06-01 02:19:43 +02:00
|
|
|
logging/auto_roll_logger_test.cc
|
2019-07-09 23:48:07 +02:00
|
|
|
logging/env_logger_test.cc
|
2019-06-01 02:19:43 +02:00
|
|
|
logging/event_logger_test.cc
|
2019-05-31 02:39:43 +02:00
|
|
|
memory/arena_test.cc
|
Provide an allocator for new memory type to be used with RocksDB block cache (#6214)
Summary:
New memory technologies are being developed by various hardware vendors (Intel DCPMM is one such technology currently available). These new memory types require different libraries for allocation and management (such as PMDK and memkind). The high capacities available make it possible to provision large caches (up to several TBs in size), beyond what is achievable with DRAM.
The new allocator provided in this PR uses the memkind library to allocate memory on different media.
**Performance**
We tested the new allocator using db_bench.
- For each test, we vary the size of the block cache (relative to the size of the uncompressed data in the database).
- The database is filled sequentially. Throughput is then measured with a readrandom benchmark.
- We use a uniform distribution as a worst-case scenario.
The plot shows throughput (ops/s) relative to a configuration with no block cache and default allocator.
For all tests, p99 latency is below 500 us.
![image](https://user-images.githubusercontent.com/26400080/71108594-42479100-2178-11ea-8231-8a775bbc92db.png)
**Changes**
- Add MemkindKmemAllocator
- Add --use_cache_memkind_kmem_allocator db_bench option (to create an LRU block cache with the new allocator)
- Add detection of memkind library with KMEM DAX support
- Add test for MemkindKmemAllocator
**Minimum Requirements**
- kernel 5.3.12
- ndctl v67 - https://github.com/pmem/ndctl
- memkind v1.10.0 - https://github.com/memkind/memkind
**Memory Configuration**
The allocator uses the MEMKIND_DAX_KMEM memory kind. Follow the instructions on[ memkind’s GitHub page](https://github.com/memkind/memkind) to set up NVDIMM memory accordingly.
Note on memory allocation with NVDIMM memory exposed as system memory.
- The MemkindKmemAllocator will only allocate from NVDIMM memory (using memkind_malloc with MEMKIND_DAX_KMEM kind).
- The default allocator is not restricted to RAM by default. Based on NUMA node latency, the kernel should allocate from local RAM preferentially, but it’s a kernel decision. numactl --preferred/--membind can be used to allocate preferentially/exclusively from the local RAM node.
**Usage**
When creating an LRU cache, pass a MemkindKmemAllocator object as argument.
For example (replace capacity with the desired value in bytes):
```
#include "rocksdb/cache.h"
#include "memory/memkind_kmem_allocator.h"
NewLRUCache(
capacity /*size_t*/,
6 /*cache_numshardbits*/,
false /*strict_capacity_limit*/,
false /*cache_high_pri_pool_ratio*/,
std::make_shared<MemkindKmemAllocator>());
```
Refer to [RocksDB’s block cache documentation](https://github.com/facebook/rocksdb/wiki/Block-Cache) to assign the LRU cache as block cache for a database.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6214
Reviewed By: cheng-chang
Differential Revision: D19292435
fbshipit-source-id: 7202f47b769e7722b539c86c2ffd669f64d7b4e1
2020-04-10 05:45:17 +02:00
|
|
|
memory/memkind_kmem_allocator_test.cc
|
2017-04-06 22:59:31 +02:00
|
|
|
memtable/inlineskiplist_test.cc
|
|
|
|
memtable/skiplist_test.cc
|
2017-06-02 23:13:59 +02:00
|
|
|
memtable/write_buffer_manager_test.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
monitoring/histogram_test.cc
|
|
|
|
monitoring/iostats_context_test.cc
|
|
|
|
monitoring/statistics_test.cc
|
2020-08-15 05:11:35 +02:00
|
|
|
monitoring/stats_dump_scheduler_test.cc
|
2019-06-18 00:17:43 +02:00
|
|
|
monitoring/stats_history_test.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
options/options_settable_test.cc
|
|
|
|
options/options_test.cc
|
2019-05-30 23:47:29 +02:00
|
|
|
table/block_based/block_based_filter_block_test.cc
|
2020-05-15 08:23:32 +02:00
|
|
|
table/block_based/block_based_table_reader_test.cc
|
2019-05-30 23:47:29 +02:00
|
|
|
table/block_based/block_test.cc
|
|
|
|
table/block_based/data_block_hash_index_test.cc
|
|
|
|
table/block_based/full_filter_block_test.cc
|
2019-05-31 06:30:41 +02:00
|
|
|
table/block_based/partitioned_filter_block_test.cc
|
2017-10-13 03:19:10 +02:00
|
|
|
table/cleanable_test.cc
|
2019-05-30 23:47:29 +02:00
|
|
|
table/cuckoo/cuckoo_table_builder_test.cc
|
|
|
|
table/cuckoo/cuckoo_table_reader_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
table/merger_test.cc
|
2018-11-27 21:59:27 +01:00
|
|
|
table/sst_file_reader_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
table/table_test.cc
|
2020-04-25 00:30:12 +02:00
|
|
|
table/block_fetcher_test.cc
|
2020-06-05 19:53:08 +02:00
|
|
|
test_util/testutil_test.cc
|
2020-08-13 02:28:10 +02:00
|
|
|
trace_replay/io_tracer_test.cc
|
Block cache simulator: Add pysim to simulate caches using reinforcement learning. (#5610)
Summary:
This PR implements cache eviction using reinforcement learning. It includes two implementations:
1. An implementation of Thompson Sampling for the Bernoulli Bandit [1].
2. An implementation of LinUCB with disjoint linear models [2].
The idea is that a cache uses multiple eviction policies, e.g., MRU, LRU, and LFU. The cache learns which eviction policy is the best and uses it upon a cache miss.
Thompson Sampling is contextless and does not include any features.
LinUCB includes features such as level, block type, caller, column family id to decide which eviction policy to use.
[1] Daniel J. Russo, Benjamin Van Roy, Abbas Kazerouni, Ian Osband, and Zheng Wen. 2018. A Tutorial on Thompson Sampling. Found. Trends Mach. Learn. 11, 1 (July 2018), 1-96. DOI: https://doi.org/10.1561/2200000070
[2] Lihong Li, Wei Chu, John Langford, and Robert E. Schapire. 2010. A contextual-bandit approach to personalized news article recommendation. In Proceedings of the 19th international conference on World wide web (WWW '10). ACM, New York, NY, USA, 661-670. DOI=http://dx.doi.org/10.1145/1772690.1772758
Pull Request resolved: https://github.com/facebook/rocksdb/pull/5610
Differential Revision: D16435067
Pulled By: HaoyuHuang
fbshipit-source-id: 6549239ae14115c01cb1e70548af9e46d8dc21bb
2019-07-26 23:36:16 +02:00
|
|
|
tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc
|
2015-10-15 02:08:28 +02:00
|
|
|
tools/ldb_cmd_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
tools/reduce_levels_test.cc
|
2015-10-15 02:08:28 +02:00
|
|
|
tools/sst_dump_test.cc
|
RocksDB Trace Analyzer (#4091)
Summary:
A framework of trace analyzing for RocksDB
After collecting the trace by using the tool of [PR #3837](https://github.com/facebook/rocksdb/pull/3837). User can use the Trace Analyzer to interpret, analyze, and characterize the collected workload.
**Input:**
1. trace file
2. Whole keys space file
**Statistics:**
1. Access count of each operation (Get, Put, Delete, SingleDelete, DeleteRange, Merge) in each column family.
2. Key hotness (access count) of each one
3. Key space separation based on given prefix
4. Key size distribution
5. Value size distribution if appliable
6. Top K accessed keys
7. QPS statistics including the average QPS and peak QPS
8. Top K accessed prefix
9. The query correlation analyzing, output the number of X after Y and the corresponding average time
intervals
**Output:**
1. key access heat map (either in the accessed key space or whole key space)
2. trace sequence file (interpret the raw trace file to line base text file for future use)
3. Time serial (The key space ID and its access time)
4. Key access count distritbution
5. Key size distribution
6. Value size distribution (in each intervals)
7. whole key space separation by the prefix
8. Accessed key space separation by the prefix
9. QPS of each operation and each column family
10. Top K QPS and their accessed prefix range
**Test:**
1. Added the unit test of analyzing Get, Put, Delete, SingleDelete, DeleteRange, Merge
2. Generated the trace and analyze the trace
**Implemented but not tested (due to the limitation of trace_replay):**
1. Analyzing Iterator, supporting Seek() and SeekForPrev() analyzing
2. Analyzing the number of Key found by Get
**Future Work:**
1. Support execution time analyzing of each requests
2. Support cache hit situation and block read situation of Get
Pull Request resolved: https://github.com/facebook/rocksdb/pull/4091
Differential Revision: D9256157
Pulled By: zhichao-cao
fbshipit-source-id: f0ceacb7eedbc43a3eee6e85b76087d7832a8fe6
2018-08-13 20:32:04 +02:00
|
|
|
tools/trace_analyzer_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
util/autovector_test.cc
|
|
|
|
util/bloom_test.cc
|
|
|
|
util/coding_test.cc
|
|
|
|
util/crc32c_test.cc
|
2020-02-11 02:58:03 +01:00
|
|
|
util/defer_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
util/dynamic_bloom_test.cc
|
RangeSync not to sync last 1MB of the file
Summary:
From other ones' investigation:
"sync_file_range() behavior highly depends on kernel version and filesystem.
xfs does neighbor page flushing outside of the specified ranges. For example, sync_file_range(fd, 8192, 16384) does not only trigger flushing page #3 to #4, but also flushing many more dirty pages (i.e. up to page#16)... Ranges of the sync_file_range() should be far enough from write() offset (at least 1MB)."
Test Plan: make all check
Reviewers: igor, rven, kradhakrishnan, yhchiang, IslamAbdelRahman, anthony
Reviewed By: anthony
Subscribers: yoshinorim, MarkCallaghan, sumeet, domas, dhruba, leveldb, ljin
Differential Revision: https://reviews.facebook.net/D15807
2015-07-20 23:46:15 +02:00
|
|
|
util/file_reader_writer_test.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
util/filelock_test.cc
|
2017-07-10 21:22:26 +02:00
|
|
|
util/hash_test.cc
|
2015-07-22 03:04:28 +02:00
|
|
|
util/heap_test.cc
|
2019-12-13 22:25:14 +01:00
|
|
|
util/random_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
util/rate_limiter_test.cc
|
2018-09-28 00:25:47 +02:00
|
|
|
util/repeatable_thread_test.cc
|
2020-02-07 23:24:41 +01:00
|
|
|
util/slice_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
util/slice_transform_test.cc
|
2017-05-10 23:54:35 +02:00
|
|
|
util/timer_queue_test.cc
|
2020-04-07 20:53:00 +02:00
|
|
|
util/timer_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
util/thread_list_test.cc
|
|
|
|
util/thread_local_test.cc
|
2020-04-02 01:37:54 +02:00
|
|
|
util/work_queue_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
utilities/backupable/backupable_db_test.cc
|
2017-05-31 07:16:32 +02:00
|
|
|
utilities/blob_db/blob_db_test.cc
|
2017-07-21 23:42:32 +02:00
|
|
|
utilities/cassandra/cassandra_functional_test.cc
|
|
|
|
utilities/cassandra/cassandra_format_test.cc
|
|
|
|
utilities/cassandra/cassandra_row_merge_test.cc
|
|
|
|
utilities/cassandra/cassandra_serialize_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
utilities/checkpoint/checkpoint_test.cc
|
2015-11-04 02:52:17 +01:00
|
|
|
utilities/memory/memory_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
utilities/merge_operators/string_append/stringappend_test.cc
|
2017-04-06 04:02:00 +02:00
|
|
|
utilities/object_registry_test.cc
|
2016-07-14 06:08:15 +02:00
|
|
|
utilities/option_change_migration/option_change_migration_test.cc
|
2015-11-12 23:53:19 +01:00
|
|
|
utilities/options/options_util_test.cc
|
2016-06-02 22:42:41 +02:00
|
|
|
utilities/persistent_cache/hash_table_test.cc
|
2016-06-08 01:07:30 +02:00
|
|
|
utilities/persistent_cache/persistent_cache_test.cc
|
2019-07-11 21:40:08 +02:00
|
|
|
utilities/simulator_cache/cache_simulator_test.cc
|
2017-07-28 21:18:09 +02:00
|
|
|
utilities/simulator_cache/sim_cache_test.cc
|
2015-08-04 05:42:55 +02:00
|
|
|
utilities/table_properties_collectors/compact_on_deletion_collector_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
utilities/transactions/optimistic_transaction_test.cc
|
Pessimistic Transactions
Summary:
Initial implementation of Pessimistic Transactions. This diff contains the api changes discussed in D38913. This diff is pretty large, so let me know if people would prefer to meet up to discuss it.
MyRocks folks: please take a look at the API in include/rocksdb/utilities/transaction[_db].h and let me know if you have any issues.
Also, you'll notice a couple of TODOs in the implementation of RollbackToSavePoint(). After chatting with Siying, I'm going to send out a separate diff for an alternate implementation of this feature that implements the rollback inside of WriteBatch/WriteBatchWithIndex. We can then decide which route is preferable.
Next, I'm planning on doing some perf testing and then integrating this diff into MongoRocks for further testing.
Test Plan: Unit tests, db_bench parallel testing.
Reviewers: igor, rven, sdong, yhchiang, yoshinorim
Reviewed By: sdong
Subscribers: hermanlee4, maykov, spetrunia, leveldb, dhruba
Differential Revision: https://reviews.facebook.net/D40869
2015-05-26 02:37:33 +02:00
|
|
|
utilities/transactions/transaction_test.cc
|
2020-04-08 22:49:17 +02:00
|
|
|
utilities/transactions/transaction_lock_mgr_test.cc
|
2017-08-31 18:27:14 +02:00
|
|
|
utilities/transactions/write_prepared_transaction_test.cc
|
2018-06-01 23:57:55 +02:00
|
|
|
utilities/transactions/write_unprepared_transaction_test.cc
|
2015-07-02 01:13:49 +02:00
|
|
|
utilities/ttl/ttl_test.cc
|
|
|
|
utilities/write_batch_with_index/write_batch_with_index_test.cc
|
2020-06-13 02:04:35 +02:00
|
|
|
)
|
|
|
|
endif()
|
2017-08-29 03:36:35 +02:00
|
|
|
if(WITH_LIBRADOS)
|
|
|
|
list(APPEND TESTS utilities/env_librados_test.cc)
|
|
|
|
endif()
|
2015-10-20 22:35:08 +02:00
|
|
|
|
2019-08-07 23:29:35 +02:00
|
|
|
if(WITH_FOLLY_DISTRIBUTED_MUTEX)
|
|
|
|
list(APPEND TESTS third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp)
|
|
|
|
endif()
|
|
|
|
|
2017-08-29 03:36:35 +02:00
|
|
|
set(TESTUTIL_SOURCE
|
|
|
|
db/db_test_util.cc
|
|
|
|
monitoring/thread_status_updater_debug.cc
|
|
|
|
table/mock_table.cc
|
|
|
|
utilities/cassandra/test_utils.cc
|
|
|
|
)
|
|
|
|
enable_testing()
|
|
|
|
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
|
|
|
|
set(TESTUTILLIB testutillib${ARTIFACT_SUFFIX})
|
|
|
|
add_library(${TESTUTILLIB} STATIC ${TESTUTIL_SOURCE})
|
2019-12-11 00:19:24 +01:00
|
|
|
target_link_libraries(${TESTUTILLIB} ${ROCKSDB_LIB})
|
2017-08-29 03:36:35 +02:00
|
|
|
if(MSVC)
|
|
|
|
set_target_properties(${TESTUTILLIB} PROPERTIES COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/testutillib${ARTIFACT_SUFFIX}.pdb")
|
|
|
|
endif()
|
|
|
|
set_target_properties(${TESTUTILLIB}
|
|
|
|
PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
|
|
|
|
EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
|
|
|
|
EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
|
2020-04-20 22:21:34 +02:00
|
|
|
)
|
2017-08-29 03:36:35 +02:00
|
|
|
|
2019-12-13 20:33:59 +01:00
|
|
|
foreach(sourcefile ${TESTS})
|
2017-08-29 03:36:35 +02:00
|
|
|
get_filename_component(exename ${sourcefile} NAME_WE)
|
2019-12-13 20:33:59 +01:00
|
|
|
add_executable(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} ${sourcefile})
|
2018-01-16 23:13:38 +01:00
|
|
|
set_target_properties(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX}
|
2017-08-29 03:36:35 +02:00
|
|
|
PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_RELEASE 1
|
|
|
|
EXCLUDE_FROM_DEFAULT_BUILD_MINRELEASE 1
|
|
|
|
EXCLUDE_FROM_DEFAULT_BUILD_RELWITHDEBINFO 1
|
2018-01-16 23:13:38 +01:00
|
|
|
OUTPUT_NAME ${exename}${ARTIFACT_SUFFIX}
|
2020-04-20 22:21:34 +02:00
|
|
|
)
|
2020-06-26 02:21:27 +02:00
|
|
|
target_link_libraries(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} testutillib${ARTIFACT_SUFFIX} testharness gtest ${GFLAGS_LIB} ${ROCKSDB_LIB})
|
2017-08-29 03:36:35 +02:00
|
|
|
if(NOT "${exename}" MATCHES "db_sanity_test")
|
|
|
|
add_test(NAME ${exename} COMMAND ${exename}${ARTIFACT_SUFFIX})
|
2018-01-16 23:13:38 +01:00
|
|
|
add_dependencies(check ${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX})
|
2017-08-29 03:36:35 +02:00
|
|
|
endif()
|
2020-05-26 07:50:17 +02:00
|
|
|
if("${exename}" MATCHES "env_librados_test")
|
|
|
|
# env_librados_test.cc uses librados directly
|
|
|
|
target_link_libraries(${CMAKE_PROJECT_NAME}_${exename}${ARTIFACT_SUFFIX} rados)
|
|
|
|
endif()
|
2019-12-13 20:33:59 +01:00
|
|
|
endforeach(sourcefile ${TESTS})
|
2017-08-29 03:36:35 +02:00
|
|
|
|
2019-12-11 00:19:24 +01:00
|
|
|
if(WIN32)
|
|
|
|
# C executables must link to a shared object
|
|
|
|
if(ROCKSDB_BUILD_SHARED)
|
|
|
|
set(ROCKSDB_LIB_FOR_C ${ROCKSDB_SHARED_LIB})
|
|
|
|
else()
|
|
|
|
set(ROCKSDB_LIB_FOR_C OFF)
|
|
|
|
endif()
|
|
|
|
else()
|
|
|
|
set(ROCKSDB_LIB_FOR_C ${ROCKSDB_LIB})
|
|
|
|
endif()
|
2017-08-29 03:36:35 +02:00
|
|
|
|
2019-12-11 00:19:24 +01:00
|
|
|
if(ROCKSDB_LIB_FOR_C)
|
|
|
|
set(C_TESTS db/c_test.c)
|
2019-12-13 20:33:59 +01:00
|
|
|
add_executable(c_test db/c_test.c)
|
2020-08-10 19:46:14 +02:00
|
|
|
target_link_libraries(c_test ${ROCKSDB_LIB_FOR_C} testharness)
|
2019-12-13 20:33:59 +01:00
|
|
|
add_test(NAME c_test COMMAND c_test${ARTIFACT_SUFFIX})
|
|
|
|
add_dependencies(check c_test)
|
2019-12-11 00:19:24 +01:00
|
|
|
endif()
|
2017-08-21 23:41:11 +02:00
|
|
|
endif()
|
2017-01-24 19:48:55 +01:00
|
|
|
|
2019-12-09 06:33:23 +01:00
|
|
|
if(WITH_BENCHMARK_TOOLS)
|
2019-12-13 20:33:59 +01:00
|
|
|
add_executable(db_bench
|
2019-12-09 08:49:32 +01:00
|
|
|
tools/db_bench.cc
|
2019-12-13 20:33:59 +01:00
|
|
|
tools/db_bench_tool.cc)
|
|
|
|
target_link_libraries(db_bench
|
2020-08-18 03:52:39 +02:00
|
|
|
${ROCKSDB_LIB} ${THIRDPARTY_LIBS})
|
2019-12-13 20:33:59 +01:00
|
|
|
|
|
|
|
add_executable(cache_bench
|
|
|
|
cache/cache_bench.cc)
|
|
|
|
target_link_libraries(cache_bench
|
2020-06-26 02:21:27 +02:00
|
|
|
${ROCKSDB_LIB} ${GFLAGS_LIB})
|
2019-12-13 20:33:59 +01:00
|
|
|
|
|
|
|
add_executable(memtablerep_bench
|
|
|
|
memtable/memtablerep_bench.cc)
|
|
|
|
target_link_libraries(memtablerep_bench
|
2020-06-26 02:21:27 +02:00
|
|
|
${ROCKSDB_LIB} ${GFLAGS_LIB})
|
2019-12-13 20:33:59 +01:00
|
|
|
|
|
|
|
add_executable(range_del_aggregator_bench
|
|
|
|
db/range_del_aggregator_bench.cc)
|
|
|
|
target_link_libraries(range_del_aggregator_bench
|
2020-06-26 02:21:27 +02:00
|
|
|
${ROCKSDB_LIB} ${GFLAGS_LIB})
|
2019-12-13 20:33:59 +01:00
|
|
|
|
|
|
|
add_executable(table_reader_bench
|
|
|
|
table/table_reader_bench.cc)
|
|
|
|
target_link_libraries(table_reader_bench
|
2020-06-26 02:21:27 +02:00
|
|
|
${ROCKSDB_LIB} testharness ${GFLAGS_LIB})
|
2019-12-13 20:33:59 +01:00
|
|
|
|
|
|
|
add_executable(filter_bench
|
|
|
|
util/filter_bench.cc)
|
|
|
|
target_link_libraries(filter_bench
|
2020-06-26 02:21:27 +02:00
|
|
|
${ROCKSDB_LIB} ${GFLAGS_LIB})
|
2019-12-13 20:33:59 +01:00
|
|
|
|
|
|
|
add_executable(hash_table_bench
|
|
|
|
utilities/persistent_cache/hash_table_bench.cc)
|
|
|
|
target_link_libraries(hash_table_bench
|
2020-06-26 02:21:27 +02:00
|
|
|
${ROCKSDB_LIB} ${GFLAGS_LIB})
|
2019-12-09 06:33:23 +01:00
|
|
|
endif()
|
|
|
|
|
2020-03-18 18:57:46 +01:00
|
|
|
if(WITH_CORE_TOOLS OR WITH_TOOLS)
|
2017-08-21 23:41:11 +02:00
|
|
|
add_subdirectory(tools)
|
2020-03-18 18:57:46 +01:00
|
|
|
add_custom_target(core_tools
|
|
|
|
DEPENDS ${core_tool_deps})
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(WITH_TOOLS)
|
2019-12-09 08:49:32 +01:00
|
|
|
add_subdirectory(db_stress_tool)
|
|
|
|
add_custom_target(tools
|
|
|
|
DEPENDS ${tool_deps})
|
2017-01-24 19:48:55 +01:00
|
|
|
endif()
|
2020-06-19 02:58:24 +02:00
|
|
|
|
|
|
|
option(WITH_EXAMPLES "build with examples" OFF)
|
|
|
|
if(WITH_EXAMPLES)
|
|
|
|
add_subdirectory(examples)
|
|
|
|
endif()
|