Introduce IngestExternalFileOptions.verify_checksums_readahead_size (#5721)
Summary: Recently readahead is introduced for checksum verifying. However, users cannot override the setting for the checksum verifying before external SST file ingestion. Introduce a new option for the purpose. Pull Request resolved: https://github.com/facebook/rocksdb/pull/5721 Test Plan: Add a new unit test for it. Differential Revision: D16906896 fbshipit-source-id: 218ec37001ddcc05411cefddbe233d15ab308476
This commit is contained in:
parent
4c74dba5fa
commit
3552473668
@ -3,7 +3,7 @@
|
||||
### Bug Fixes
|
||||
* Fixed a number of data races in BlobDB.
|
||||
### New Features
|
||||
* VerifyChecksum() by default will issue readahead. Allow ReadOptions to be passed in to those functions to override the readhead size.
|
||||
* VerifyChecksum() by default will issue readahead. Allow ReadOptions to be passed in to those functions to override the readhead size. For checksum verifying before external SST file ingestion, a new option IngestExternalFileOptions.verify_checksums_readahead_size, is added for this readahead setting.
|
||||
|
||||
## 6.4.0 (7/30/2019)
|
||||
### Default Option Change
|
||||
|
@ -745,6 +745,57 @@ TEST_F(ExternalSSTFileBasicTest, SyncFailure) {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(ExternalSSTFileBasicTest, VerifyChecksumReadahead) {
|
||||
Options options;
|
||||
options.create_if_missing = true;
|
||||
SpecialEnv senv(Env::Default());
|
||||
options.env = &senv;
|
||||
DestroyAndReopen(options);
|
||||
|
||||
Options sst_file_writer_options;
|
||||
std::unique_ptr<SstFileWriter> sst_file_writer(
|
||||
new SstFileWriter(EnvOptions(), sst_file_writer_options));
|
||||
std::string file_name = sst_files_dir_ + "verify_checksum_readahead_test.sst";
|
||||
ASSERT_OK(sst_file_writer->Open(file_name));
|
||||
Random rnd(301);
|
||||
std::string value = DBTestBase::RandomString(&rnd, 4000);
|
||||
for (int i = 0; i < 5000; i++) {
|
||||
ASSERT_OK(sst_file_writer->Put(DBTestBase::Key(i), value));
|
||||
}
|
||||
ASSERT_OK(sst_file_writer->Finish());
|
||||
|
||||
// Ingest it once without verifying checksums to see the baseline
|
||||
// preads.
|
||||
IngestExternalFileOptions ingest_opt;
|
||||
ingest_opt.move_files = false;
|
||||
senv.count_random_reads_ = true;
|
||||
senv.random_read_bytes_counter_ = 0;
|
||||
ASSERT_OK(db_->IngestExternalFile({file_name}, ingest_opt));
|
||||
|
||||
auto base_num_reads = senv.random_read_counter_.Read();
|
||||
// Make sure the counter is enabled.
|
||||
ASSERT_GT(base_num_reads, 0);
|
||||
|
||||
// Ingest again and observe the reads made for for readahead.
|
||||
ingest_opt.move_files = false;
|
||||
ingest_opt.verify_checksums_before_ingest = true;
|
||||
ingest_opt.verify_checksums_readahead_size = size_t{2 * 1024 * 1024};
|
||||
|
||||
senv.count_random_reads_ = true;
|
||||
senv.random_read_bytes_counter_ = 0;
|
||||
ASSERT_OK(db_->IngestExternalFile({file_name}, ingest_opt));
|
||||
|
||||
// Make sure the counter is enabled.
|
||||
ASSERT_GT(senv.random_read_counter_.Read() - base_num_reads, 0);
|
||||
|
||||
// The SST file is about 20MB. Readahead size is 2MB.
|
||||
// Give a conservative 15 reads for metadata blocks, the number
|
||||
// of random reads should be within 20 MB / 2MB + 15 = 25.
|
||||
ASSERT_LE(senv.random_read_counter_.Read() - base_num_reads, 40);
|
||||
|
||||
Destroy(options);
|
||||
}
|
||||
|
||||
TEST_P(ExternalSSTFileBasicTest, IngestionWithRangeDeletions) {
|
||||
int kNumLevels = 7;
|
||||
Options options = CurrentOptions();
|
||||
|
@ -350,8 +350,10 @@ Status ExternalSstFileIngestionJob::GetIngestedFileInfo(
|
||||
// If customized readahead size is needed, we can pass a user option
|
||||
// all the way to here. Right now we just rely on the default readahead
|
||||
// to keep things simple.
|
||||
ReadOptions ro;
|
||||
ro.readahead_size = ingestion_options_.verify_checksums_readahead_size;
|
||||
status = table_reader->VerifyChecksum(
|
||||
ReadOptions(), TableReaderCaller::kExternalSSTIngestion);
|
||||
ro, TableReaderCaller::kExternalSSTIngestion);
|
||||
}
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
|
@ -1477,6 +1477,13 @@ struct IngestExternalFileOptions {
|
||||
// Warning: setting this to true causes slowdown in file ingestion because
|
||||
// the external SST file has to be read.
|
||||
bool verify_checksums_before_ingest = false;
|
||||
// When verify_checksums_before_ingest = true, RocksDB uses default
|
||||
// readahead setting to scan the file while verifying checksums before
|
||||
// ingestion.
|
||||
// Users can override the default value using this option.
|
||||
// Using a large readahead size (> 2MB) can typically improve the performance
|
||||
// of forward iteration on spinning disks.
|
||||
size_t verify_checksums_readahead_size = 0;
|
||||
};
|
||||
|
||||
enum TraceFilterType : uint64_t {
|
||||
|
Loading…
Reference in New Issue
Block a user