Skip to content

Commit 048560a

Browse files
author
Lei Jin
committed
reduce references to cfd->options() in DBImpl
Summary: I found it is almost impossible to get rid of this function in a single batch. I will take a step by step approach Test Plan: make release Reviewers: sdong, yhchiang, igor Reviewed By: igor Subscribers: leveldb Differential Revision: https://reviews.facebook.net/D22995
1 parent 011241b commit 048560a

9 files changed

+257
-138
lines changed

db/compaction.cc

+5-5
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ void Compaction::AddInputDeletions(VersionEdit* edit) {
113113
}
114114

115115
bool Compaction::KeyNotExistsBeyondOutputLevel(const Slice& user_key) {
116-
assert(cfd_->options()->compaction_style != kCompactionStyleFIFO);
117-
if (cfd_->options()->compaction_style == kCompactionStyleUniversal) {
116+
assert(cfd_->ioptions()->compaction_style != kCompactionStyleFIFO);
117+
if (cfd_->ioptions()->compaction_style == kCompactionStyleUniversal) {
118118
return bottommost_level_;
119119
}
120120
// Maybe use binary search to find right entry instead of linear search?
@@ -177,8 +177,8 @@ void Compaction::MarkFilesBeingCompacted(bool mark_as_compacted) {
177177

178178
// Is this compaction producing files at the bottommost level?
179179
void Compaction::SetupBottomMostLevel(bool is_manual) {
180-
assert(cfd_->options()->compaction_style != kCompactionStyleFIFO);
181-
if (cfd_->options()->compaction_style == kCompactionStyleUniversal) {
180+
assert(cfd_->ioptions()->compaction_style != kCompactionStyleFIFO);
181+
if (cfd_->ioptions()->compaction_style == kCompactionStyleUniversal) {
182182
// If universal compaction style is used and manual
183183
// compaction is occuring, then we are guaranteed that
184184
// all files will be picked in a single compaction
@@ -270,7 +270,7 @@ void Compaction::Summary(char* output, int len) {
270270
uint64_t Compaction::OutputFilePreallocationSize() {
271271
uint64_t preallocation_size = 0;
272272

273-
if (cfd_->options()->compaction_style == kCompactionStyleLevel) {
273+
if (cfd_->ioptions()->compaction_style == kCompactionStyleLevel) {
274274
preallocation_size =
275275
cfd_->compaction_picker()->MaxFileSizeForLevel(output_level());
276276
} else {

db/db_impl.cc

+55-48
Original file line numberDiff line numberDiff line change
@@ -294,24 +294,24 @@ Status SanitizeDBOptionsByCFOptions(
294294
return Status::OK();
295295
}
296296

297-
CompressionType GetCompressionFlush(const Options& options) {
297+
CompressionType GetCompressionFlush(const ImmutableCFOptions& ioptions) {
298298
// Compressing memtable flushes might not help unless the sequential load
299299
// optimization is used for leveled compaction. Otherwise the CPU and
300300
// latency overhead is not offset by saving much space.
301301

302302
bool can_compress;
303303

304-
if (options.compaction_style == kCompactionStyleUniversal) {
304+
if (ioptions.compaction_style == kCompactionStyleUniversal) {
305305
can_compress =
306-
(options.compaction_options_universal.compression_size_percent < 0);
306+
(ioptions.compaction_options_universal.compression_size_percent < 0);
307307
} else {
308308
// For leveled compress when min_level_to_compress == 0.
309-
can_compress = options.compression_per_level.empty() ||
310-
options.compression_per_level[0] != kNoCompression;
309+
can_compress = ioptions.compression_per_level.empty() ||
310+
ioptions.compression_per_level[0] != kNoCompression;
311311
}
312312

313313
if (can_compress) {
314-
return options.compression;
314+
return ioptions.compression;
315315
} else {
316316
return kNoCompression;
317317
}
@@ -1424,8 +1424,8 @@ Status DBImpl::WriteLevel0TableForRecovery(ColumnFamilyData* cfd, MemTable* mem,
14241424
s = BuildTable(
14251425
dbname_, env_, *cfd->ioptions(), env_options_, cfd->table_cache(),
14261426
iter.get(), &meta, cfd->internal_comparator(), newest_snapshot,
1427-
earliest_seqno_in_memtable, GetCompressionFlush(*cfd->options()),
1428-
cfd->options()->compression_opts, Env::IO_HIGH);
1427+
earliest_seqno_in_memtable, GetCompressionFlush(*cfd->ioptions()),
1428+
cfd->ioptions()->compression_opts, Env::IO_HIGH);
14291429
LogFlush(db_options_.info_log);
14301430
mutex_.Lock();
14311431
}
@@ -1498,8 +1498,8 @@ Status DBImpl::WriteLevel0Table(ColumnFamilyData* cfd,
14981498
s = BuildTable(
14991499
dbname_, env_, *cfd->ioptions(), env_options_, cfd->table_cache(),
15001500
iter.get(), &meta, cfd->internal_comparator(), newest_snapshot,
1501-
earliest_seqno_in_memtable, GetCompressionFlush(*cfd->options()),
1502-
cfd->options()->compression_opts, Env::IO_HIGH);
1501+
earliest_seqno_in_memtable, GetCompressionFlush(*cfd->ioptions()),
1502+
cfd->ioptions()->compression_opts, Env::IO_HIGH);
15031503
LogFlush(db_options_.info_log);
15041504
}
15051505
Log(db_options_.info_log,
@@ -1537,7 +1537,7 @@ Status DBImpl::WriteLevel0Table(ColumnFamilyData* cfd,
15371537
// threads could be concurrently producing compacted files for
15381538
// that key range.
15391539
if (base != nullptr && db_options_.max_background_compactions <= 1 &&
1540-
cfd->options()->compaction_style == kCompactionStyleLevel) {
1540+
cfd->ioptions()->compaction_style == kCompactionStyleLevel) {
15411541
level = base->PickLevelForMemTableOutput(min_user_key, max_user_key);
15421542
}
15431543
edit->AddFile(level, meta.fd.GetNumber(), meta.fd.GetPathId(),
@@ -1666,8 +1666,8 @@ Status DBImpl::CompactRange(ColumnFamilyHandle* column_family,
16661666
// bottom-most level, the output level will be the same as input one.
16671667
// level 0 can never be the bottommost level (i.e. if all files are in level
16681668
// 0, we will compact to level 1)
1669-
if (cfd->options()->compaction_style == kCompactionStyleUniversal ||
1670-
cfd->options()->compaction_style == kCompactionStyleFIFO ||
1669+
if (cfd->ioptions()->compaction_style == kCompactionStyleUniversal ||
1670+
cfd->ioptions()->compaction_style == kCompactionStyleFIFO ||
16711671
(level == max_level_with_files && level > 0)) {
16721672
s = RunManualCompaction(cfd, level, level, target_path_id, begin, end);
16731673
} else {
@@ -1828,16 +1828,16 @@ Status DBImpl::RunManualCompaction(ColumnFamilyData* cfd, int input_level,
18281828
// For universal compaction, we enforce every manual compaction to compact
18291829
// all files.
18301830
if (begin == nullptr ||
1831-
cfd->options()->compaction_style == kCompactionStyleUniversal ||
1832-
cfd->options()->compaction_style == kCompactionStyleFIFO) {
1831+
cfd->ioptions()->compaction_style == kCompactionStyleUniversal ||
1832+
cfd->ioptions()->compaction_style == kCompactionStyleFIFO) {
18331833
manual.begin = nullptr;
18341834
} else {
18351835
begin_storage = InternalKey(*begin, kMaxSequenceNumber, kValueTypeForSeek);
18361836
manual.begin = &begin_storage;
18371837
}
18381838
if (end == nullptr ||
1839-
cfd->options()->compaction_style == kCompactionStyleUniversal ||
1840-
cfd->options()->compaction_style == kCompactionStyleFIFO) {
1839+
cfd->ioptions()->compaction_style == kCompactionStyleUniversal ||
1840+
cfd->ioptions()->compaction_style == kCompactionStyleFIFO) {
18411841
manual.end = nullptr;
18421842
} else {
18431843
end_storage = InternalKey(*end, 0, static_cast<ValueType>(0));
@@ -2288,7 +2288,7 @@ Status DBImpl::BackgroundCompaction(bool* madeProgress,
22882288
// file if there is alive snapshot pointing to it
22892289
assert(c->num_input_files(1) == 0);
22902290
assert(c->level() == 0);
2291-
assert(c->column_family_data()->options()->compaction_style ==
2291+
assert(c->column_family_data()->ioptions()->compaction_style ==
22922292
kCompactionStyleFIFO);
22932293
for (const auto& f : *c->inputs(0)) {
22942294
c->edit()->DeleteFile(c->level(), f->fd.GetNumber());
@@ -2371,8 +2371,8 @@ Status DBImpl::BackgroundCompaction(bool* madeProgress,
23712371
// We only compacted part of the requested range. Update *m
23722372
// to the range that is left to be compacted.
23732373
// Universal and FIFO compactions should always compact the whole range
2374-
assert(m->cfd->options()->compaction_style != kCompactionStyleUniversal);
2375-
assert(m->cfd->options()->compaction_style != kCompactionStyleFIFO);
2374+
assert(m->cfd->ioptions()->compaction_style != kCompactionStyleUniversal);
2375+
assert(m->cfd->ioptions()->compaction_style != kCompactionStyleFIFO);
23762376
m->tmp_storage = *manual_end;
23772377
m->begin = &m->tmp_storage;
23782378
}
@@ -2465,7 +2465,7 @@ Status DBImpl::OpenCompactionOutputFile(CompactionState* compact) {
24652465
compact->builder.reset(NewTableBuilder(
24662466
*cfd->ioptions(), cfd->internal_comparator(), compact->outfile.get(),
24672467
compact->compaction->OutputCompressionType(),
2468-
cfd->options()->compression_opts));
2468+
cfd->ioptions()->compression_opts));
24692469
}
24702470
LogFlush(db_options_.info_log);
24712471
return s;
@@ -2640,7 +2640,7 @@ Status DBImpl::ProcessKeyValueCompaction(
26402640
SequenceNumber visible_in_snapshot = kMaxSequenceNumber;
26412641
ColumnFamilyData* cfd = compact->compaction->column_family_data();
26422642
MergeHelper merge(
2643-
cfd->user_comparator(), cfd->options()->merge_operator.get(),
2643+
cfd->user_comparator(), cfd->ioptions()->merge_operator,
26442644
db_options_.info_log.get(), cfd->options()->min_partial_merge_operands,
26452645
false /* internal key corruption is expected */);
26462646
auto compaction_filter = cfd->options()->compaction_filter;
@@ -3673,30 +3673,31 @@ bool DBImpl::KeyMayExist(const ReadOptions& options,
36733673
return s.ok() || s.IsIncomplete();
36743674
}
36753675

3676-
Iterator* DBImpl::NewIterator(const ReadOptions& options,
3676+
Iterator* DBImpl::NewIterator(const ReadOptions& read_options,
36773677
ColumnFamilyHandle* column_family) {
36783678
auto cfh = reinterpret_cast<ColumnFamilyHandleImpl*>(column_family);
36793679
auto cfd = cfh->cfd();
36803680

3681-
if (options.tailing) {
3681+
if (read_options.tailing) {
36823682
#ifdef ROCKSDB_LITE
36833683
// not supported in lite version
36843684
return nullptr;
36853685
#else
3686-
// TODO(ljin): remove tailing iterator
3687-
auto iter = new ForwardIterator(this, options, cfd);
3688-
return NewDBIterator(env_, *cfd->options(), cfd->user_comparator(), iter,
3689-
kMaxSequenceNumber, options.iterate_upper_bound);
3690-
// return new TailingIterator(env_, this, options, cfd);
3686+
auto iter = new ForwardIterator(this, read_options, cfd);
3687+
return NewDBIterator(env_, *cfd->ioptions(), cfd->user_comparator(), iter,
3688+
kMaxSequenceNumber,
3689+
cfd->options()->max_sequential_skip_in_iterations,
3690+
read_options.iterate_upper_bound);
36913691
#endif
36923692
} else {
36933693
SequenceNumber latest_snapshot = versions_->LastSequence();
36943694
SuperVersion* sv = nullptr;
36953695
sv = cfd->GetReferencedSuperVersion(&mutex_);
36963696

36973697
auto snapshot =
3698-
options.snapshot != nullptr
3699-
? reinterpret_cast<const SnapshotImpl*>(options.snapshot)->number_
3698+
read_options.snapshot != nullptr
3699+
? reinterpret_cast<const SnapshotImpl*>(
3700+
read_options.snapshot)->number_
37003701
: latest_snapshot;
37013702

37023703
// Try to generate a DB iterator tree in continuous memory area to be
@@ -3742,19 +3743,22 @@ Iterator* DBImpl::NewIterator(const ReadOptions& options,
37423743
// likely that any iterator pointer is close to the iterator it points to so
37433744
// that they are likely to be in the same cache line and/or page.
37443745
ArenaWrappedDBIter* db_iter = NewArenaWrappedDbIterator(
3745-
env_, *cfd->options(), cfd->user_comparator(),
3746-
snapshot, options.iterate_upper_bound);
3746+
env_, *cfd->ioptions(), cfd->user_comparator(),
3747+
snapshot, cfd->options()->max_sequential_skip_in_iterations,
3748+
read_options.iterate_upper_bound);
37473749

37483750
Iterator* internal_iter =
3749-
NewInternalIterator(options, cfd, sv, db_iter->GetArena());
3751+
NewInternalIterator(read_options, cfd, sv, db_iter->GetArena());
37503752
db_iter->SetIterUnderDBIter(internal_iter);
37513753

37523754
return db_iter;
37533755
}
3756+
// To stop compiler from complaining
3757+
return nullptr;
37543758
}
37553759

37563760
Status DBImpl::NewIterators(
3757-
const ReadOptions& options,
3761+
const ReadOptions& read_options,
37583762
const std::vector<ColumnFamilyHandle*>& column_families,
37593763
std::vector<Iterator*>* iterators) {
37603764
iterators->clear();
@@ -3763,7 +3767,7 @@ Status DBImpl::NewIterators(
37633767
std::vector<SuperVersion*> super_versions;
37643768
super_versions.reserve(column_families.size());
37653769

3766-
if (!options.tailing) {
3770+
if (!read_options.tailing) {
37673771
mutex_.Lock();
37683772
latest_snapshot = versions_->LastSequence();
37693773
for (auto cfh : column_families) {
@@ -3773,17 +3777,18 @@ Status DBImpl::NewIterators(
37733777
mutex_.Unlock();
37743778
}
37753779

3776-
if (options.tailing) {
3780+
if (read_options.tailing) {
37773781
#ifdef ROCKSDB_LITE
37783782
return Status::InvalidArgument(
37793783
"Tailing interator not supported in RocksDB lite");
37803784
#else
37813785
for (auto cfh : column_families) {
37823786
auto cfd = reinterpret_cast<ColumnFamilyHandleImpl*>(cfh)->cfd();
3783-
auto iter = new ForwardIterator(this, options, cfd);
3787+
auto iter = new ForwardIterator(this, read_options, cfd);
37843788
iterators->push_back(
3785-
NewDBIterator(env_, *cfd->options(), cfd->user_comparator(), iter,
3786-
kMaxSequenceNumber));
3789+
NewDBIterator(env_, *cfd->ioptions(), cfd->user_comparator(), iter,
3790+
kMaxSequenceNumber,
3791+
cfd->options()->max_sequential_skip_in_iterations));
37873792
}
37883793
#endif
37893794
} else {
@@ -3792,14 +3797,16 @@ Status DBImpl::NewIterators(
37923797
auto cfd = cfh->cfd();
37933798

37943799
auto snapshot =
3795-
options.snapshot != nullptr
3796-
? reinterpret_cast<const SnapshotImpl*>(options.snapshot)->number_
3800+
read_options.snapshot != nullptr
3801+
? reinterpret_cast<const SnapshotImpl*>(
3802+
read_options.snapshot)->number_
37973803
: latest_snapshot;
37983804

37993805
ArenaWrappedDBIter* db_iter = NewArenaWrappedDbIterator(
3800-
env_, *cfd->options(), cfd->user_comparator(), snapshot);
3806+
env_, *cfd->ioptions(), cfd->user_comparator(), snapshot,
3807+
cfd->options()->max_sequential_skip_in_iterations);
38013808
Iterator* internal_iter = NewInternalIterator(
3802-
options, cfd, super_versions[i], db_iter->GetArena());
3809+
read_options, cfd, super_versions[i], db_iter->GetArena());
38033810
db_iter->SetIterUnderDBIter(internal_iter);
38043811
iterators->push_back(db_iter);
38053812
}
@@ -3838,7 +3845,7 @@ Status DBImpl::Put(const WriteOptions& o, ColumnFamilyHandle* column_family,
38383845
Status DBImpl::Merge(const WriteOptions& o, ColumnFamilyHandle* column_family,
38393846
const Slice& key, const Slice& val) {
38403847
auto cfh = reinterpret_cast<ColumnFamilyHandleImpl*>(column_family);
3841-
if (!cfh->cfd()->options()->merge_operator) {
3848+
if (!cfh->cfd()->ioptions()->merge_operator) {
38423849
return Status::NotSupported("Provide a merge_operator when opening DB");
38433850
} else {
38443851
return DB::Merge(o, column_family, key, val);
@@ -4814,8 +4821,8 @@ Status DB::Open(const DBOptions& db_options, const std::string& dbname,
48144821

48154822
if (s.ok()) {
48164823
for (auto cfd : *impl->versions_->GetColumnFamilySet()) {
4817-
if (cfd->options()->compaction_style == kCompactionStyleUniversal ||
4818-
cfd->options()->compaction_style == kCompactionStyleFIFO) {
4824+
if (cfd->ioptions()->compaction_style == kCompactionStyleUniversal ||
4825+
cfd->ioptions()->compaction_style == kCompactionStyleFIFO) {
48194826
Version* current = cfd->current();
48204827
for (int i = 1; i < current->NumberLevels(); ++i) {
48214828
int num_files = current->NumLevelFiles(i);
@@ -4827,7 +4834,7 @@ Status DB::Open(const DBOptions& db_options, const std::string& dbname,
48274834
}
48284835
}
48294836
}
4830-
if (cfd->options()->merge_operator != nullptr &&
4837+
if (cfd->ioptions()->merge_operator != nullptr &&
48314838
!cfd->mem()->IsMergeOperatorSupported()) {
48324839
s = Status::InvalidArgument(
48334840
"The memtable of column family %s does not support merge operator "

db/db_impl_readonly.cc

+17-13
Original file line numberDiff line numberDiff line change
@@ -69,25 +69,27 @@ Status DBImplReadOnly::Get(const ReadOptions& options,
6969
return s;
7070
}
7171

72-
Iterator* DBImplReadOnly::NewIterator(const ReadOptions& options,
72+
Iterator* DBImplReadOnly::NewIterator(const ReadOptions& read_options,
7373
ColumnFamilyHandle* column_family) {
7474
auto cfh = reinterpret_cast<ColumnFamilyHandleImpl*>(column_family);
7575
auto cfd = cfh->cfd();
7676
SuperVersion* super_version = cfd->GetSuperVersion()->Ref();
7777
SequenceNumber latest_snapshot = versions_->LastSequence();
7878
auto db_iter = NewArenaWrappedDbIterator(
79-
env_, *cfd->options(), cfd->user_comparator(),
80-
(options.snapshot != nullptr
81-
? reinterpret_cast<const SnapshotImpl*>(options.snapshot)->number_
82-
: latest_snapshot));
83-
auto internal_iter =
84-
NewInternalIterator(options, cfd, super_version, db_iter->GetArena());
79+
env_, *cfd->ioptions(), cfd->user_comparator(),
80+
(read_options.snapshot != nullptr
81+
? reinterpret_cast<const SnapshotImpl*>(
82+
read_options.snapshot)->number_
83+
: latest_snapshot),
84+
cfd->options()->max_sequential_skip_in_iterations);
85+
auto internal_iter = NewInternalIterator(
86+
read_options, cfd, super_version, db_iter->GetArena());
8587
db_iter->SetIterUnderDBIter(internal_iter);
8688
return db_iter;
8789
}
8890

8991
Status DBImplReadOnly::NewIterators(
90-
const ReadOptions& options,
92+
const ReadOptions& read_options,
9193
const std::vector<ColumnFamilyHandle*>& column_families,
9294
std::vector<Iterator*>* iterators) {
9395
if (iterators == nullptr) {
@@ -100,12 +102,14 @@ Status DBImplReadOnly::NewIterators(
100102
for (auto cfh : column_families) {
101103
auto cfd = reinterpret_cast<ColumnFamilyHandleImpl*>(cfh)->cfd();
102104
auto db_iter = NewArenaWrappedDbIterator(
103-
env_, *cfd->options(), cfd->user_comparator(),
104-
options.snapshot != nullptr
105-
? reinterpret_cast<const SnapshotImpl*>(options.snapshot)->number_
106-
: latest_snapshot);
105+
env_, *cfd->ioptions(), cfd->user_comparator(),
106+
(read_options.snapshot != nullptr
107+
? reinterpret_cast<const SnapshotImpl*>(
108+
read_options.snapshot)->number_
109+
: latest_snapshot),
110+
cfd->options()->max_sequential_skip_in_iterations);
107111
auto internal_iter = NewInternalIterator(
108-
options, cfd, cfd->GetSuperVersion()->Ref(), db_iter->GetArena());
112+
read_options, cfd, cfd->GetSuperVersion()->Ref(), db_iter->GetArena());
109113
db_iter->SetIterUnderDBIter(internal_iter);
110114
iterators->push_back(db_iter);
111115
}

0 commit comments

Comments
 (0)