summaryrefslogtreecommitdiff
path: root/options
diff options
context:
space:
mode:
authorMike Kolupaev <kolmike@fb.com>2019-04-01 17:07:38 -0700
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>2019-04-01 17:10:40 -0700
commit120bc4715b7e851b32f9b880f5ffac1d4f3a5d50 (patch)
tree4a6419ce5ed04b0543090b4ac986c57c35163892 /options
parent127a850beb866d43ac2d6ae0aa503c1f5453e7a4 (diff)
Add DBOptions. avoid_unnecessary_blocking_io to defer file deletions (#5043)
Summary: Just like ReadOptions::background_purge_on_iterator_cleanup but for ColumnFamilyHandle instead of Iterator. In our use case we sometimes call ColumnFamilyHandle's destructor from low-latency threads, and sometimes it blocks the thread for a few seconds deleting the files. To avoid that, we can either offload ColumnFamilyHandle's destruction to a background thread on our side, or add this option on rocksdb side. This PR does the latter, to be consistent with how we solve exactly the same problem for iterators using background_purge_on_iterator_cleanup option. (EDIT: It's avoid_unnecessary_blocking_io now, and affects both CF drops and iterator destructors.) I'm not quite comfortable with having two separate options (background_purge_on_iterator_cleanup and background_purge_on_cf_cleanup) for such a rarely used thing. Maybe we should merge them? Rename background_purge_on_cf_cleanup to something like delete_files_on_background_threads_only or avoid_blocking_io_in_unexpected_places, and make iterators use it instead of the one in ReadOptions? I can do that here if you guys think it's better. Pull Request resolved: https://github.com/facebook/rocksdb/pull/5043 Differential Revision: D14339233 Pulled By: al13n321 fbshipit-source-id: ccf7efa11c85c9a5b91d969bb55627d0fb01e7b8
Diffstat (limited to 'options')
-rw-r--r--options/db_options.cc7
-rw-r--r--options/db_options.h1
-rw-r--r--options/options_helper.cc9
-rw-r--r--options/options_settable_test.cc3
4 files changed, 17 insertions, 3 deletions
diff --git a/options/db_options.cc b/options/db_options.cc
index b90c27606..b9950e09e 100644
--- a/options/db_options.cc
+++ b/options/db_options.cc
@@ -86,7 +86,8 @@ ImmutableDBOptions::ImmutableDBOptions(const DBOptions& options)
preserve_deletes(options.preserve_deletes),
two_write_queues(options.two_write_queues),
manual_wal_flush(options.manual_wal_flush),
- atomic_flush(options.atomic_flush) {
+ atomic_flush(options.atomic_flush),
+ avoid_unnecessary_blocking_io(options.avoid_unnecessary_blocking_io) {
}
void ImmutableDBOptions::Dump(Logger* log) const {
@@ -217,6 +218,10 @@ void ImmutableDBOptions::Dump(Logger* log) const {
two_write_queues);
ROCKS_LOG_HEADER(log, " Options.manual_wal_flush: %d",
manual_wal_flush);
+ ROCKS_LOG_HEADER(log, " Options.atomic_flush: %d", atomic_flush);
+ ROCKS_LOG_HEADER(log,
+ " Options.avoid_unnecessary_blocking_io: %d",
+ avoid_unnecessary_blocking_io);
}
MutableDBOptions::MutableDBOptions()
diff --git a/options/db_options.h b/options/db_options.h
index 360848851..283cf7d35 100644
--- a/options/db_options.h
+++ b/options/db_options.h
@@ -79,6 +79,7 @@ struct ImmutableDBOptions {
bool two_write_queues;
bool manual_wal_flush;
bool atomic_flush;
+ bool avoid_unnecessary_blocking_io;
};
struct MutableDBOptions {
diff --git a/options/options_helper.cc b/options/options_helper.cc
index be8ec2e18..9facf6e94 100644
--- a/options/options_helper.cc
+++ b/options/options_helper.cc
@@ -132,6 +132,8 @@ DBOptions BuildDBOptions(const ImmutableDBOptions& immutable_db_options,
options.two_write_queues = immutable_db_options.two_write_queues;
options.manual_wal_flush = immutable_db_options.manual_wal_flush;
options.atomic_flush = immutable_db_options.atomic_flush;
+ options.avoid_unnecessary_blocking_io =
+ immutable_db_options.avoid_unnecessary_blocking_io;
return options;
}
@@ -1615,7 +1617,12 @@ std::unordered_map<std::string, OptionTypeInfo>
{"atomic_flush",
{offsetof(struct DBOptions, atomic_flush), OptionType::kBoolean,
OptionVerificationType::kNormal, false,
- offsetof(struct ImmutableDBOptions, atomic_flush)}}};
+ offsetof(struct ImmutableDBOptions, atomic_flush)}},
+ {"avoid_unnecessary_blocking_io",
+ {offsetof(struct DBOptions, avoid_unnecessary_blocking_io),
+ OptionType::kBoolean, OptionVerificationType::kNormal, false,
+ offsetof(struct ImmutableDBOptions, avoid_unnecessary_blocking_io)}}
+ };
std::unordered_map<std::string, BlockBasedTableOptions::IndexType>
OptionsHelper::block_base_table_index_type_string_map = {
diff --git a/options/options_settable_test.cc b/options/options_settable_test.cc
index cf1ce4e21..3a6bd6a88 100644
--- a/options/options_settable_test.cc
+++ b/options/options_settable_test.cc
@@ -294,7 +294,8 @@ TEST_F(OptionsSettableTest, DBOptionsAllFieldsSettable) {
"two_write_queues=false;"
"manual_wal_flush=false;"
"seq_per_batch=false;"
- "atomic_flush=false",
+ "atomic_flush=false;"
+ "avoid_unnecessary_blocking_io=false",
new_options));
ASSERT_EQ(unset_bytes_base, NumUnsetBytes(new_options_ptr, sizeof(DBOptions),