Go to file
Peter Dillinger f6fd4b9dbd Print stack traces more reliably with concurrency (#12086)
Summary:
It's been relatively easy to break our stack trace printer:
* If another thread reaches a signal condition such as a related SEGV or assertion failure while one is trying to print a stack trace from the signal handler, it seems to end the process abruptly without a stack trace.
* If the process exits normally in one thread (such as main finishing) while another is trying to print a stack trace from the signal handler, it seems the process will often end normally without a stack trace.

This change attempts to fix these issues, with
* Keep the custom signal handler installed as long as possible, so that other threads will most likely re-enter our custom handler. (We only switch back to default for triggering core dump or whatever after stack trace.)
* Use atomics and sleeps to implement a crude recursive mutex for ensuring all threads hitting the custom signal handler wait on the first that is trying to print a stack trace, while recursive signals in the same thread can still be handled cleanly.
* Use an atexit handler to hook into normal exit to (a) wait on a pending printing of stack trace when detectable and applicable, and (b) detect and warn when printing a stack trace might be interrupted by a process exit in progress. (I don't know how to pause that *after* our atexit handler has been called; the best I know how to do is warn, "In a race with process already exiting...".)

Pull Request resolved: https://github.com/facebook/rocksdb/pull/12086

Test Plan:
manual, including with TSAN. I added this code to the end of a unit test file:
```
  for (size_t i = 0; i < 3; ++i) {
    std::thread t([]() { assert(false); });
    t.detach();
  }
```
Followed by either `sleep(100)` or `usleep(100)` or usual process exit. And for recursive signal testing, inject `abort()` at various places in the handler.

Reviewed By: cbi42

Differential Revision: D51531882

Pulled By: pdillinger

fbshipit-source-id: 3473b863a43e61b722dfb7a2ed12a8120949b09c
2023-11-22 11:55:10 -08:00
.circleci Convert all but one windows job to nightly (#12089) 2023-11-22 10:40:52 -08:00
.github/workflows Fix failed CI job "Check buck targets and code format" (#11532) 2023-06-13 14:20:11 -07:00
buckifier Error out in case of std errors in blackbox test and export file in TARGETS 2023-10-24 11:46:18 -07:00
build_tools Update libs for RocksJava Static build (#9304) 2023-10-20 10:38:27 -07:00
cache Add some asserts in ~CacheWithSecondaryAdapter (#12082) 2023-11-20 17:48:17 -08:00
cmake gcc-11 and cmake related cleanup (#9286) 2021-12-17 17:04:35 -08:00
coverage Remove platform009 and default to platform010 (#11333) 2023-03-30 09:56:37 -07:00
db Fix rowcache get returning incorrect timestamp (#11952) 2023-11-21 20:39:33 -08:00
db_stress_tool Make CacheWithSecondaryAdapter reservation accounting more robust (#12059) 2023-11-14 16:25:52 -08:00
docs FIX new blog post (JNI performance) Locate images correctly (#12050) 2023-11-07 11:58:58 -08:00
env Fix build on FreeBSD (#11218) (#12078) 2023-11-20 10:11:16 -08:00
examples Fix compact_files_example (#12084) 2023-11-21 09:34:59 -08:00
file Add some stats to observe the usefulness of scan prefetching (#11981) 2023-10-23 14:42:44 -07:00
fuzz Block per key-value checksum (#11287) 2023-04-25 12:08:23 -07:00
include/rocksdb Update HISTORY.md and version.h for 8.9.fb release (#12074) 2023-11-21 18:07:19 -08:00
java Add missing copyright header (#12076) 2023-11-19 09:50:59 -08:00
logging Disabling some IO error assertion in EnvLogger (#11314) 2023-03-20 13:23:29 -07:00
memory cache_bench enhancements for jemalloc etc. (#11758) 2023-08-24 19:14:38 -07:00
memtable remove redundant move (#11418) 2023-05-03 09:37:21 -07:00
microbench Add `CompressionOptions::checksum` for enabling ZSTD checksum (#11666) 2023-08-18 15:01:59 -07:00
monitoring Add some stats to observe the usefulness of scan prefetching (#11981) 2023-10-23 14:42:44 -07:00
options Mark more files for periodic compaction during offpeak (#12031) 2023-11-06 11:43:59 -08:00
plugin Add initial CMake support to plugin (#9214) 2021-11-30 17:16:53 -08:00
port Print stack traces more reliably with concurrency (#12086) 2023-11-22 11:55:10 -08:00
table Fix rowcache get returning incorrect timestamp (#11952) 2023-11-21 20:39:33 -08:00
test_util Support compressed and local flash secondary cache stacking (#11812) 2023-09-21 20:30:53 -07:00
third-party fix optimization-disabled test builds with platform010 (#11361) 2023-04-10 13:59:44 -07:00
tools Update HISTORY.md and version.h for 8.9.fb release (#12074) 2023-11-21 18:07:19 -08:00
trace_replay Skip subsequent trace writes after encountering trace write failure (#11996) 2023-10-24 09:58:02 -07:00
unreleased_history Update HISTORY.md and version.h for 8.9.fb release (#12074) 2023-11-21 18:07:19 -08:00
util Safer wrapper for std::atomic, use in HCC (#12051) 2023-11-08 13:28:43 -08:00
utilities Add missing license to source files (#12083) 2023-11-21 08:36:30 -08:00
.clang-format A script that automatically reformat affected lines 2014-01-14 12:21:24 -08:00
.gitignore Add .arcconfig to .gitignore (fb internal use) (#11803) 2023-09-07 14:57:39 -07:00
.lgtm.yml Create lgtm.yml for LGTM.com C/C++ analysis (#4058) 2018-06-26 12:43:04 -07:00
.watchmanconfig Added .watchmanconfig file to rocksdb repo (#5593) 2019-07-19 15:00:33 -07:00
AUTHORS Update RocksDB Authors File 2017-10-18 14:42:10 -07:00
CMakeLists.txt Ensure `target_include_directories()` is called with correct target name (#12055) 2023-11-09 10:41:38 -08:00
CODE_OF_CONDUCT.md Adopt Contributor Covenant 2019-08-29 23:21:01 -07:00
CONTRIBUTING.md Add Code of Conduct 2017-12-05 18:42:35 -08:00
COPYING Add GPLv2 as an alternative license. 2017-04-27 18:06:12 -07:00
DEFAULT_OPTIONS_HISTORY.md Add Options::DisableExtraChecks, clarify force_consistency_checks (#9363) 2022-01-18 17:31:03 -08:00
DUMP_FORMAT.md First version of rocksdb_dump and rocksdb_undump. 2015-06-19 16:24:36 -07:00
HISTORY.md Update HISTORY.md and version.h for 8.9.fb release (#12074) 2023-11-21 18:07:19 -08:00
INSTALL.md RocksDB now requires gflags v2.2.0 (#10933) 2023-10-03 09:58:49 -07:00
LANGUAGE-BINDINGS.md Add grocksdb in Go language bindings (#10498) 2022-08-23 15:02:10 -07:00
LICENSE.Apache Change RocksDB License 2017-07-15 16:11:23 -07:00
LICENSE.leveldb Add back the LevelDB license file 2017-07-16 18:42:18 -07:00
Makefile Not to print unnecessary commands in Makefile (#11978) 2023-11-07 11:44:20 -08:00
PLUGINS.md Add encfs plugin link (#12070) 2023-11-14 07:33:21 -08:00
README.md Remove deprecated integration tests from README.md (#11354) 2023-04-07 16:52:50 -07:00
TARGETS Make OffpeakTimeInfo available in VersionSet (#12018) 2023-10-27 15:56:48 -07:00
USERS.md Add Qdrant to USERS.md (#12072) 2023-11-16 10:35:08 -08:00
Vagrantfile Adding CentOS 7 Vagrantfile & build script 2018-02-26 15:27:17 -08:00
WINDOWS_PORT.md Update branch name in WINDOWS_PORT.md (#8745) 2021-09-01 19:26:39 -07:00
common.mk Clean up variables for temporary directory (#9961) 2022-05-06 16:38:06 -07:00
crash_test.mk Stress/Crash Test for OptimisticTransactionDB (#11513) 2023-06-17 16:27:37 -07:00
issue_template.md Add Google Group to Issue Template 2020-01-28 14:40:37 -08:00
rocksdb.pc.in build: fix pkg-config file generation (#9953) 2022-05-30 12:46:40 -07:00
src.mk Add HyperClockCache Java API. (#12065) 2023-11-16 15:46:31 -08:00
thirdparty.inc Fix build jemalloc api (#5470) 2019-06-24 17:40:32 -07:00

README.md

RocksDB: A Persistent Key-Value Store for Flash and RAM Storage

CircleCI Status

RocksDB is developed and maintained by Facebook Database Engineering Team. It is built on earlier work on LevelDB by Sanjay Ghemawat (sanjay@google.com) and Jeff Dean (jeff@google.com)

This code is a library that forms the core building block for a fast key-value server, especially suited for storing data on flash drives. It has a Log-Structured-Merge-Database (LSM) design with flexible tradeoffs between Write-Amplification-Factor (WAF), Read-Amplification-Factor (RAF) and Space-Amplification-Factor (SAF). It has multi-threaded compactions, making it especially suitable for storing multiple terabytes of data in a single database.

Start with example usage here: https://github.com/facebook/rocksdb/tree/main/examples

See the github wiki for more explanation.

The public interface is in include/. Callers should not include or rely on the details of any other header files in this package. Those internal APIs may be changed without warning.

Questions and discussions are welcome on the RocksDB Developers Public Facebook group and email list on Google Groups.

License

RocksDB is dual-licensed under both the GPLv2 (found in the COPYING file in the root directory) and Apache 2.0 License (found in the LICENSE.Apache file in the root directory). You may select, at your option, one of the above-listed licenses.