Configure direct I/O statically in db_stress

Summary:
Previously `db_stress` attempted to configure direct I/O dynamically in `SetOptions()` which had multiple problems (ummm must've never been tested):

- It's a DB option so SetDBOptions should've been called instead
- It's not a dynamic option so even SetDBOptions would fail
- It required enabling SyncPoint to mask O_DIRECT since it had no way to detect whether the DB directory was in tmpfs or not. This required locking that consumed ~80% of db_stress CPU.

In this PR I delete the broken dynamic config and instead configure it statically, only enabling it if the DB directory truly supports O_DIRECT.
Closes https://github.com/facebook/rocksdb/pull/3939

Differential Revision: D8238120

Pulled By: ajkr

fbshipit-source-id: 60bb2deebe6c9b54a3f788079261715b4a229279
main
Andrew Kryczka 7 years ago committed by Facebook Github Bot
parent 01e3c30def
commit 88c3ee2d31
  1. 17
      tools/db_crashtest.py
  2. 16
      tools/db_stress.cc

@ -43,6 +43,8 @@ default_params = {
"subcompactions": lambda: random.randint(1, 4), "subcompactions": lambda: random.randint(1, 4),
"target_file_size_base": 2097152, "target_file_size_base": 2097152,
"target_file_size_multiplier": 2, "target_file_size_multiplier": 2,
"use_direct_reads": lambda: random.randint(0, 1),
"use_direct_io_for_flush_and_compaction": lambda: random.randint(0, 1),
"use_full_merge_v1": lambda: random.randint(0, 1), "use_full_merge_v1": lambda: random.randint(0, 1),
"use_merge": lambda: random.randint(0, 1), "use_merge": lambda: random.randint(0, 1),
"verify_checksum": 1, "verify_checksum": 1,
@ -58,8 +60,19 @@ def get_dbname(test_name):
else: else:
dbname = test_tmpdir + "/rocksdb_crashtest_" + test_name dbname = test_tmpdir + "/rocksdb_crashtest_" + test_name
shutil.rmtree(dbname, True) shutil.rmtree(dbname, True)
os.mkdir(dbname)
return dbname return dbname
def is_direct_io_supported(dbname):
with tempfile.NamedTemporaryFile(dir=dbname) as f:
try:
os.open(f.name, os.O_DIRECT)
except:
return False
return True
blackbox_default_params = { blackbox_default_params = {
# total time for this script to test db_stress # total time for this script to test db_stress
"duration": 6000, "duration": 6000,
@ -107,6 +120,10 @@ def finalize_and_sanitize(src_params):
for (k, v) in src_params.items()]) for (k, v) in src_params.items()])
if dest_params.get("allow_concurrent_memtable_write", 1) == 1: if dest_params.get("allow_concurrent_memtable_write", 1) == 1:
dest_params["memtablerep"] = "skip_list" dest_params["memtablerep"] = "skip_list"
if dest_params["mmap_read"] == 1 or not is_direct_io_supported(
dest_params["db"]):
dest_params["use_direct_io_for_flush_and_compaction"] = 0
dest_params["use_direct_reads"] = 0
return dest_params return dest_params

@ -1397,8 +1397,6 @@ class StressTest {
ToString(options_.max_bytes_for_level_multiplier), "1", "2", ToString(options_.max_bytes_for_level_multiplier), "1", "2",
}}, }},
{"max_sequential_skip_in_iterations", {"4", "8", "12"}}, {"max_sequential_skip_in_iterations", {"4", "8", "12"}},
{"use_direct_reads", {"false", "true"}},
{"use_direct_io_for_flush_and_compaction", {"false", "true"}},
}; };
options_table_ = std::move(options_tbl); options_table_ = std::move(options_tbl);
@ -2837,20 +2835,6 @@ int main(int argc, char** argv) {
SetUsageMessage(std::string("\nUSAGE:\n") + std::string(argv[0]) + SetUsageMessage(std::string("\nUSAGE:\n") + std::string(argv[0]) +
" [OPTIONS]..."); " [OPTIONS]...");
ParseCommandLineFlags(&argc, &argv, true); ParseCommandLineFlags(&argc, &argv, true);
#if !defined(NDEBUG) && !defined(OS_MACOSX) && !defined(OS_WIN) && \
!defined(OS_SOLARIS) && !defined(OS_AIX)
rocksdb::SyncPoint::GetInstance()->SetCallBack(
"NewWritableFile:O_DIRECT", [&](void* arg) {
int* val = static_cast<int*>(arg);
*val &= ~O_DIRECT;
});
rocksdb::SyncPoint::GetInstance()->SetCallBack(
"NewRandomAccessFile:O_DIRECT", [&](void* arg) {
int* val = static_cast<int*>(arg);
*val &= ~O_DIRECT;
});
rocksdb::SyncPoint::GetInstance()->EnableProcessing();
#endif
if (FLAGS_statistics) { if (FLAGS_statistics) {
dbstats = rocksdb::CreateDBStatistics(); dbstats = rocksdb::CreateDBStatistics();

Loading…
Cancel
Save