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
This commit is contained in:
parent
01e3c30def
commit
88c3ee2d31
@ -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…
Reference in New Issue
Block a user