mirror of https://github.com/facebook/rocksdb.git
Add an option to wait for purge in WaitForCompact (#12520)
Summary: Adding an option to wait for purge to complete in `WaitForCompact` API. Internally, RocksDB has a way to wait for purge to complete (e.g. TEST_WaitForPurge() in db_impl_debug.cc), but there's no public API available for gracefully wait for purge to complete. Pull Request resolved: https://github.com/facebook/rocksdb/pull/12520 Test Plan: Unit Test Added - `WaitForCompactWithWaitForPurgeOptionTest` ``` ./deletefile_test -- --gtest_filter="*WaitForCompactWithWaitForPurgeOptionTest*" ``` Existing Tests ``` ./db_compaction_test -- --gtest_filter="*WaitForCompactWithOption*" ``` Reviewed By: ajkr Differential Revision: D55888283 Pulled By: jaykorean fbshipit-source-id: cfc6d6e8657deaefab8961890b36e390095c9f65
This commit is contained in:
parent
7027265417
commit
4f584652ab
|
@ -1854,6 +1854,7 @@ void DBImpl::SchedulePurge() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DBImpl::BackgroundCallPurge() {
|
void DBImpl::BackgroundCallPurge() {
|
||||||
|
TEST_SYNC_POINT("DBImpl::BackgroundCallPurge:beforeMutexLock");
|
||||||
mutex_.Lock();
|
mutex_.Lock();
|
||||||
|
|
||||||
while (!logs_to_free_queue_.empty()) {
|
while (!logs_to_free_queue_.empty()) {
|
||||||
|
|
|
@ -4356,6 +4356,7 @@ Status DBImpl::WaitForCompact(
|
||||||
}
|
}
|
||||||
if ((bg_bottom_compaction_scheduled_ || bg_compaction_scheduled_ ||
|
if ((bg_bottom_compaction_scheduled_ || bg_compaction_scheduled_ ||
|
||||||
bg_flush_scheduled_ || unscheduled_compactions_ ||
|
bg_flush_scheduled_ || unscheduled_compactions_ ||
|
||||||
|
(wait_for_compact_options.wait_for_purge && bg_purge_scheduled_) ||
|
||||||
unscheduled_flushes_ || error_handler_.IsRecoveryInProgress()) &&
|
unscheduled_flushes_ || error_handler_.IsRecoveryInProgress()) &&
|
||||||
(error_handler_.GetBGError().ok())) {
|
(error_handler_.GetBGError().ok())) {
|
||||||
if (wait_for_compact_options.timeout.count()) {
|
if (wait_for_compact_options.timeout.count()) {
|
||||||
|
@ -4363,6 +4364,7 @@ Status DBImpl::WaitForCompact(
|
||||||
return Status::TimedOut();
|
return Status::TimedOut();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
TEST_SYNC_POINT("DBImpl::WaitForCompact:InsideLoop");
|
||||||
bg_cv_.Wait();
|
bg_cv_.Wait();
|
||||||
}
|
}
|
||||||
} else if (wait_for_compact_options.close_db) {
|
} else if (wait_for_compact_options.close_db) {
|
||||||
|
|
|
@ -223,6 +223,49 @@ TEST_F(DeleteFileTest, PurgeObsoleteFilesTest) {
|
||||||
CheckFileTypeCounts(dbname_, 0, 1, 1);
|
CheckFileTypeCounts(dbname_, 0, 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(DeleteFileTest, WaitForCompactWithWaitForPurgeOptionTest) {
|
||||||
|
Options options = CurrentOptions();
|
||||||
|
SetOptions(&options);
|
||||||
|
Destroy(options);
|
||||||
|
options.create_if_missing = true;
|
||||||
|
Reopen(options);
|
||||||
|
|
||||||
|
std::string first("0"), last("999999");
|
||||||
|
CompactRangeOptions compact_options;
|
||||||
|
compact_options.change_level = true;
|
||||||
|
compact_options.target_level = 2;
|
||||||
|
Slice first_slice(first), last_slice(last);
|
||||||
|
|
||||||
|
CreateTwoLevels();
|
||||||
|
Iterator* itr = nullptr;
|
||||||
|
ReadOptions read_options;
|
||||||
|
read_options.background_purge_on_iterator_cleanup = true;
|
||||||
|
itr = db_->NewIterator(read_options);
|
||||||
|
ASSERT_OK(itr->status());
|
||||||
|
ASSERT_OK(db_->CompactRange(compact_options, &first_slice, &last_slice));
|
||||||
|
SyncPoint::GetInstance()->LoadDependency(
|
||||||
|
{{"DBImpl::BGWorkPurge:start", "DeleteFileTest::WaitForPurgeTest"},
|
||||||
|
{"DBImpl::WaitForCompact:InsideLoop",
|
||||||
|
"DBImpl::BackgroundCallPurge:beforeMutexLock"}});
|
||||||
|
SyncPoint::GetInstance()->EnableProcessing();
|
||||||
|
|
||||||
|
delete itr;
|
||||||
|
|
||||||
|
TEST_SYNC_POINT("DeleteFileTest::WaitForPurgeTest");
|
||||||
|
// At this point, purge got started, but can't finish due to sync points
|
||||||
|
// not purged yet
|
||||||
|
CheckFileTypeCounts(dbname_, 0, 3, 1);
|
||||||
|
|
||||||
|
// The sync point in WaitForCompact should unblock the purge
|
||||||
|
WaitForCompactOptions wait_for_compact_options;
|
||||||
|
wait_for_compact_options.wait_for_purge = true;
|
||||||
|
Status s = dbfull()->WaitForCompact(wait_for_compact_options);
|
||||||
|
ASSERT_OK(s);
|
||||||
|
|
||||||
|
// Now files should be purged
|
||||||
|
CheckFileTypeCounts(dbname_, 0, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(DeleteFileTest, BackgroundPurgeIteratorTest) {
|
TEST_F(DeleteFileTest, BackgroundPurgeIteratorTest) {
|
||||||
Options options = CurrentOptions();
|
Options options = CurrentOptions();
|
||||||
SetOptions(&options);
|
SetOptions(&options);
|
||||||
|
@ -600,4 +643,3 @@ int main(int argc, char** argv) {
|
||||||
RegisterCustomObjects(argc, argv);
|
RegisterCustomObjects(argc, argv);
|
||||||
return RUN_ALL_TESTS();
|
return RUN_ALL_TESTS();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2212,6 +2212,9 @@ struct WaitForCompactOptions {
|
||||||
// A boolean to flush all column families before starting to wait.
|
// A boolean to flush all column families before starting to wait.
|
||||||
bool flush = false;
|
bool flush = false;
|
||||||
|
|
||||||
|
// A boolean to wait for purge to complete
|
||||||
|
bool wait_for_purge = false;
|
||||||
|
|
||||||
// A boolean to call Close() after waiting is done. By the time Close() is
|
// A boolean to call Close() after waiting is done. By the time Close() is
|
||||||
// called here, there should be no background jobs in progress and no new
|
// called here, there should be no background jobs in progress and no new
|
||||||
// background jobs should be added. DB may not have been closed if Close()
|
// background jobs should be added. DB may not have been closed if Close()
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Add an option to `WaitForCompactOptions` - `wait_for_purge` to make `WaitForCompact()` API wait for background purge to complete
|
||||||
|
|
Loading…
Reference in New Issue