Skip to content

Commit 5665e5e

Browse files
author
Lei Jin
committed
introduce ImmutableOptions
Summary: As a preparation to support updating some options dynamically, I'd like to first introduce ImmutableOptions, which is a subset of Options that cannot be changed during the course of a DB lifetime without restart. ColumnFamily will keep both Options and ImmutableOptions. Any component below ColumnFamily should only take ImmutableOptions in their constructor. Other options should be taken from APIs, which will be allowed to adjust dynamically. I am yet to make changes to memtable and other related classes to take ImmutableOptions in their ctor. That can be done in a seprate diff as this one is already pretty big. Test Plan: make all check Reviewers: yhchiang, igor, sdong Reviewed By: sdong Subscribers: leveldb, dhruba Differential Revision: https://reviews.facebook.net/D22545
1 parent e0b99d4 commit 5665e5e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+554
-368
lines changed

db/builder.cc

+22-18
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,24 @@ namespace rocksdb {
2626

2727
class TableFactory;
2828

29-
TableBuilder* NewTableBuilder(const Options& options,
29+
TableBuilder* NewTableBuilder(const ImmutableCFOptions& ioptions,
3030
const InternalKeyComparator& internal_comparator,
3131
WritableFile* file,
32-
CompressionType compression_type) {
33-
return options.table_factory->NewTableBuilder(options, internal_comparator,
34-
file, compression_type);
32+
const CompressionType compression_type,
33+
const CompressionOptions& compression_opts) {
34+
return ioptions.table_factory->NewTableBuilder(
35+
ioptions, internal_comparator, file, compression_type, compression_opts);
3536
}
3637

37-
Status BuildTable(const std::string& dbname, Env* env, const Options& options,
38-
const EnvOptions& soptions, TableCache* table_cache,
38+
Status BuildTable(const std::string& dbname, Env* env,
39+
const ImmutableCFOptions& ioptions,
40+
const EnvOptions& env_options, TableCache* table_cache,
3941
Iterator* iter, FileMetaData* meta,
4042
const InternalKeyComparator& internal_comparator,
4143
const SequenceNumber newest_snapshot,
4244
const SequenceNumber earliest_seqno_in_memtable,
4345
const CompressionType compression,
46+
const CompressionOptions& compression_opts,
4447
const Env::IOPriority io_priority) {
4548
Status s;
4649
meta->fd.file_size = 0;
@@ -50,23 +53,24 @@ Status BuildTable(const std::string& dbname, Env* env, const Options& options,
5053
// If the sequence number of the smallest entry in the memtable is
5154
// smaller than the most recent snapshot, then we do not trigger
5255
// removal of duplicate/deleted keys as part of this builder.
53-
bool purge = options.purge_redundant_kvs_while_flush;
56+
bool purge = ioptions.purge_redundant_kvs_while_flush;
5457
if (earliest_seqno_in_memtable <= newest_snapshot) {
5558
purge = false;
5659
}
5760

58-
std::string fname = TableFileName(options.db_paths, meta->fd.GetNumber(),
61+
std::string fname = TableFileName(ioptions.db_paths, meta->fd.GetNumber(),
5962
meta->fd.GetPathId());
6063
if (iter->Valid()) {
6164
unique_ptr<WritableFile> file;
62-
s = env->NewWritableFile(fname, &file, soptions);
65+
s = env->NewWritableFile(fname, &file, env_options);
6366
if (!s.ok()) {
6467
return s;
6568
}
6669
file->SetIOPriority(io_priority);
6770

68-
TableBuilder* builder =
69-
NewTableBuilder(options, internal_comparator, file.get(), compression);
71+
TableBuilder* builder = NewTableBuilder(
72+
ioptions, internal_comparator, file.get(),
73+
compression, compression_opts);
7074

7175
// the first key is the smallest key
7276
Slice key = iter->key();
@@ -75,8 +79,8 @@ Status BuildTable(const std::string& dbname, Env* env, const Options& options,
7579
meta->largest_seqno = meta->smallest_seqno;
7680

7781
MergeHelper merge(internal_comparator.user_comparator(),
78-
options.merge_operator.get(), options.info_log.get(),
79-
options.min_partial_merge_operands,
82+
ioptions.merge_operator, ioptions.info_log,
83+
ioptions.min_partial_merge_operands,
8084
true /* internal key corruption is not ok */);
8185

8286
if (purge) {
@@ -196,12 +200,12 @@ Status BuildTable(const std::string& dbname, Env* env, const Options& options,
196200
delete builder;
197201

198202
// Finish and check for file errors
199-
if (s.ok() && !options.disableDataSync) {
200-
if (options.use_fsync) {
201-
StopWatch sw(env, options.statistics.get(), TABLE_SYNC_MICROS);
203+
if (s.ok() && !ioptions.disable_data_sync) {
204+
if (ioptions.use_fsync) {
205+
StopWatch sw(env, ioptions.statistics, TABLE_SYNC_MICROS);
202206
s = file->Fsync();
203207
} else {
204-
StopWatch sw(env, options.statistics.get(), TABLE_SYNC_MICROS);
208+
StopWatch sw(env, ioptions.statistics, TABLE_SYNC_MICROS);
205209
s = file->Sync();
206210
}
207211
}
@@ -211,7 +215,7 @@ Status BuildTable(const std::string& dbname, Env* env, const Options& options,
211215

212216
if (s.ok()) {
213217
// Verify that the table is usable
214-
Iterator* it = table_cache->NewIterator(ReadOptions(), soptions,
218+
Iterator* it = table_cache->NewIterator(ReadOptions(), env_options,
215219
internal_comparator, meta->fd);
216220
s = it->status();
217221
delete it;

db/builder.h

+8-3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "rocksdb/status.h"
1212
#include "rocksdb/types.h"
1313
#include "rocksdb/options.h"
14+
#include "rocksdb/immutable_options.h"
1415

1516
namespace rocksdb {
1617

@@ -26,22 +27,26 @@ class TableBuilder;
2627
class WritableFile;
2728

2829
extern TableBuilder* NewTableBuilder(
29-
const Options& options, const InternalKeyComparator& internal_comparator,
30-
WritableFile* file, CompressionType compression_type);
30+
const ImmutableCFOptions& options,
31+
const InternalKeyComparator& internal_comparator,
32+
WritableFile* file, const CompressionType compression_type,
33+
const CompressionOptions& compression_opts);
3134

3235
// Build a Table file from the contents of *iter. The generated file
3336
// will be named according to number specified in meta. On success, the rest of
3437
// *meta will be filled with metadata about the generated table.
3538
// If no data is present in *iter, meta->file_size will be set to
3639
// zero, and no Table file will be produced.
3740
extern Status BuildTable(const std::string& dbname, Env* env,
38-
const Options& options, const EnvOptions& soptions,
41+
const ImmutableCFOptions& options,
42+
const EnvOptions& env_options,
3943
TableCache* table_cache, Iterator* iter,
4044
FileMetaData* meta,
4145
const InternalKeyComparator& internal_comparator,
4246
const SequenceNumber newest_snapshot,
4347
const SequenceNumber earliest_seqno_in_memtable,
4448
const CompressionType compression,
49+
const CompressionOptions& compression_opts,
4550
const Env::IOPriority io_priority = Env::IO_HIGH);
4651

4752
} // namespace rocksdb

db/column_family.cc

+8-7
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ ColumnFamilyData::ColumnFamilyData(uint32_t id, const std::string& name,
178178
Version* dummy_versions, Cache* table_cache,
179179
const ColumnFamilyOptions& options,
180180
const DBOptions* db_options,
181-
const EnvOptions& storage_options,
181+
const EnvOptions& env_options,
182182
ColumnFamilySet* column_family_set)
183183
: id_(id),
184184
name_(name),
@@ -188,6 +188,7 @@ ColumnFamilyData::ColumnFamilyData(uint32_t id, const std::string& name,
188188
dropped_(false),
189189
internal_comparator_(options.comparator),
190190
options_(*db_options, SanitizeOptions(&internal_comparator_, options)),
191+
ioptions_(options_),
191192
mem_(nullptr),
192193
imm_(options_.min_write_buffer_number_to_merge),
193194
super_version_(nullptr),
@@ -204,7 +205,7 @@ ColumnFamilyData::ColumnFamilyData(uint32_t id, const std::string& name,
204205
if (dummy_versions != nullptr) {
205206
internal_stats_.reset(
206207
new InternalStats(options_.num_levels, db_options->env, this));
207-
table_cache_.reset(new TableCache(&options_, storage_options, table_cache));
208+
table_cache_.reset(new TableCache(ioptions_, env_options, table_cache));
208209
if (options_.compaction_style == kCompactionStyleUniversal) {
209210
compaction_picker_.reset(
210211
new UniversalCompactionPicker(&options_, &internal_comparator_));
@@ -306,7 +307,7 @@ void ColumnFamilyData::RecalculateWriteStallRateLimitsConditions() {
306307
}
307308

308309
const EnvOptions* ColumnFamilyData::soptions() const {
309-
return &(column_family_set_->storage_options_);
310+
return &(column_family_set_->env_options_);
310311
}
311312

312313
void ColumnFamilyData::SetCurrent(Version* current) {
@@ -462,16 +463,16 @@ void ColumnFamilyData::ResetThreadLocalSuperVersions() {
462463

463464
ColumnFamilySet::ColumnFamilySet(const std::string& dbname,
464465
const DBOptions* db_options,
465-
const EnvOptions& storage_options,
466+
const EnvOptions& env_options,
466467
Cache* table_cache)
467468
: max_column_family_(0),
468469
dummy_cfd_(new ColumnFamilyData(0, "", nullptr, nullptr,
469470
ColumnFamilyOptions(), db_options,
470-
storage_options_, nullptr)),
471+
env_options_, nullptr)),
471472
default_cfd_cache_(nullptr),
472473
db_name_(dbname),
473474
db_options_(db_options),
474-
storage_options_(storage_options),
475+
env_options_(env_options),
475476
table_cache_(table_cache),
476477
spin_lock_(ATOMIC_FLAG_INIT) {
477478
// initialize linked list
@@ -537,7 +538,7 @@ ColumnFamilyData* ColumnFamilySet::CreateColumnFamily(
537538
assert(column_families_.find(name) == column_families_.end());
538539
ColumnFamilyData* new_cfd =
539540
new ColumnFamilyData(id, name, dummy_versions, table_cache_, options,
540-
db_options_, storage_options_, this);
541+
db_options_, env_options_, this);
541542
Lock();
542543
column_families_.insert({name, id});
543544
column_family_data_.insert({id, new_cfd});

db/column_family.h

+8-5
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,11 @@ class ColumnFamilyData {
165165
void SetLogNumber(uint64_t log_number) { log_number_ = log_number; }
166166
uint64_t GetLogNumber() const { return log_number_; }
167167

168-
// thread-safe
168+
// TODO(ljin): make this API thread-safe once we allow updating options_
169169
const Options* options() const { return &options_; }
170+
// thread-safe
170171
const EnvOptions* soptions() const;
172+
const ImmutableCFOptions* ioptions() const { return &ioptions_; }
171173

172174
InternalStats* internal_stats() { return internal_stats_.get(); }
173175

@@ -251,7 +253,7 @@ class ColumnFamilyData {
251253
Version* dummy_versions, Cache* table_cache,
252254
const ColumnFamilyOptions& options,
253255
const DBOptions* db_options,
254-
const EnvOptions& storage_options,
256+
const EnvOptions& env_options,
255257
ColumnFamilySet* column_family_set);
256258

257259
// Recalculate some small conditions, which are changed only during
@@ -272,7 +274,8 @@ class ColumnFamilyData {
272274

273275
const InternalKeyComparator internal_comparator_;
274276

275-
Options const options_;
277+
const Options options_;
278+
const ImmutableCFOptions ioptions_;
276279

277280
std::unique_ptr<TableCache> table_cache_;
278281

@@ -367,7 +370,7 @@ class ColumnFamilySet {
367370
};
368371

369372
ColumnFamilySet(const std::string& dbname, const DBOptions* db_options,
370-
const EnvOptions& storage_options, Cache* table_cache);
373+
const EnvOptions& env_options, Cache* table_cache);
371374
~ColumnFamilySet();
372375

373376
ColumnFamilyData* GetDefault() const;
@@ -420,7 +423,7 @@ class ColumnFamilySet {
420423

421424
const std::string db_name_;
422425
const DBOptions* const db_options_;
423-
const EnvOptions storage_options_;
426+
const EnvOptions env_options_;
424427
Cache* table_cache_;
425428
std::atomic_flag spin_lock_;
426429
};

db/db_impl.cc

+20-17
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ DBImpl::DBImpl(const DBOptions& options, const std::string& dbname)
356356
default_interval_to_delete_obsolete_WAL_(600),
357357
flush_on_destroy_(false),
358358
delayed_writes_(0),
359-
storage_options_(options),
359+
env_options_(options),
360360
bg_work_gate_closed_(false),
361361
refitting_level_(false),
362362
opened_successfully_(false) {
@@ -372,7 +372,7 @@ DBImpl::DBImpl(const DBOptions& options, const std::string& dbname)
372372
options_.table_cache_remove_scan_count_limit);
373373

374374
versions_.reset(
375-
new VersionSet(dbname_, &options_, storage_options_, table_cache_.get()));
375+
new VersionSet(dbname_, &options_, env_options_, table_cache_.get()));
376376
column_family_memtables_.reset(
377377
new ColumnFamilyMemTablesImpl(versions_->GetColumnFamilySet()));
378378

@@ -453,7 +453,7 @@ Status DBImpl::NewDB() {
453453
const std::string manifest = DescriptorFileName(dbname_, 1);
454454
unique_ptr<WritableFile> file;
455455
Status s = env_->NewWritableFile(
456-
manifest, &file, env_->OptimizeForManifestWrite(storage_options_));
456+
manifest, &file, env_->OptimizeForManifestWrite(env_options_));
457457
if (!s.ok()) {
458458
return s;
459459
}
@@ -1075,7 +1075,7 @@ Status DBImpl::ReadFirstLine(const std::string& fname,
10751075
};
10761076

10771077
unique_ptr<SequentialFile> file;
1078-
Status status = env_->NewSequentialFile(fname, &file, storage_options_);
1078+
Status status = env_->NewSequentialFile(fname, &file, env_options_);
10791079

10801080
if (!status.ok()) {
10811081
return status;
@@ -1275,7 +1275,7 @@ Status DBImpl::RecoverLogFile(uint64_t log_number, SequenceNumber* max_sequence,
12751275
// Open the log file
12761276
std::string fname = LogFileName(options_.wal_dir, log_number);
12771277
unique_ptr<SequentialFile> file;
1278-
Status status = env_->NewSequentialFile(fname, &file, storage_options_);
1278+
Status status = env_->NewSequentialFile(fname, &file, env_options_);
12791279
if (!status.ok()) {
12801280
MaybeIgnoreError(&status);
12811281
return status;
@@ -1425,10 +1425,11 @@ Status DBImpl::WriteLevel0TableForRecovery(ColumnFamilyData* cfd, MemTable* mem,
14251425
Status s;
14261426
{
14271427
mutex_.Unlock();
1428-
s = BuildTable(dbname_, env_, *cfd->options(), storage_options_,
1428+
s = BuildTable(dbname_, env_, *cfd->ioptions(), env_options_,
14291429
cfd->table_cache(), iter, &meta, cfd->internal_comparator(),
14301430
newest_snapshot, earliest_seqno_in_memtable,
1431-
GetCompressionFlush(*cfd->options()), Env::IO_HIGH);
1431+
GetCompressionFlush(*cfd->options()),
1432+
cfd->options()->compression_opts, Env::IO_HIGH);
14321433
LogFlush(options_.info_log);
14331434
mutex_.Lock();
14341435
}
@@ -1495,10 +1496,11 @@ Status DBImpl::WriteLevel0Table(ColumnFamilyData* cfd,
14951496
Log(options_.info_log, "[%s] Level-0 flush table #%" PRIu64 ": started",
14961497
cfd->GetName().c_str(), meta.fd.GetNumber());
14971498

1498-
s = BuildTable(dbname_, env_, *cfd->options(), storage_options_,
1499+
s = BuildTable(dbname_, env_, *cfd->ioptions(), env_options_,
14991500
cfd->table_cache(), iter, &meta, cfd->internal_comparator(),
15001501
newest_snapshot, earliest_seqno_in_memtable,
1501-
GetCompressionFlush(*cfd->options()), Env::IO_HIGH);
1502+
GetCompressionFlush(*cfd->options()),
1503+
cfd->options()->compression_opts, Env::IO_HIGH);
15021504
LogFlush(options_.info_log);
15031505
delete iter;
15041506
Log(options_.info_log,
@@ -2447,7 +2449,7 @@ Status DBImpl::OpenCompactionOutputFile(CompactionState* compact) {
24472449
// Make the output file
24482450
std::string fname = TableFileName(options_.db_paths, file_number,
24492451
compact->compaction->GetOutputPathId());
2450-
Status s = env_->NewWritableFile(fname, &compact->outfile, storage_options_);
2452+
Status s = env_->NewWritableFile(fname, &compact->outfile, env_options_);
24512453

24522454
if (s.ok()) {
24532455
compact->outfile->SetIOPriority(Env::IO_LOW);
@@ -2456,8 +2458,9 @@ Status DBImpl::OpenCompactionOutputFile(CompactionState* compact) {
24562458

24572459
ColumnFamilyData* cfd = compact->compaction->column_family_data();
24582460
compact->builder.reset(NewTableBuilder(
2459-
*cfd->options(), cfd->internal_comparator(), compact->outfile.get(),
2460-
compact->compaction->OutputCompressionType()));
2461+
*cfd->ioptions(), cfd->internal_comparator(), compact->outfile.get(),
2462+
compact->compaction->OutputCompressionType(),
2463+
cfd->options()->compression_opts));
24612464
}
24622465
LogFlush(options_.info_log);
24632466
return s;
@@ -2506,7 +2509,7 @@ Status DBImpl::FinishCompactionOutputFile(CompactionState* compact,
25062509
ColumnFamilyData* cfd = compact->compaction->column_family_data();
25072510
FileDescriptor fd(output_number, output_path_id, current_bytes);
25082511
Iterator* iter = cfd->table_cache()->NewIterator(
2509-
ReadOptions(), storage_options_, cfd->internal_comparator(), fd);
2512+
ReadOptions(), env_options_, cfd->internal_comparator(), fd);
25102513
s = iter->status();
25112514
delete iter;
25122515
if (s.ok()) {
@@ -3355,7 +3358,7 @@ Iterator* DBImpl::NewInternalIterator(const ReadOptions& options,
33553358
// Collect all needed child iterators for immutable memtables
33563359
super_version->imm->AddIterators(options, &merge_iter_builder);
33573360
// Collect iterators for files in L0 - Ln
3358-
super_version->current->AddIterators(options, storage_options_,
3361+
super_version->current->AddIterators(options, env_options_,
33593362
&merge_iter_builder);
33603363
internal_iter = merge_iter_builder.Finish();
33613364
} else {
@@ -3366,7 +3369,7 @@ Iterator* DBImpl::NewInternalIterator(const ReadOptions& options,
33663369
// Collect all needed child iterators for immutable memtables
33673370
super_version->imm->AddIterators(options, &iterator_list);
33683371
// Collect iterators for files in L0 - Ln
3369-
super_version->current->AddIterators(options, storage_options_,
3372+
super_version->current->AddIterators(options, env_options_,
33703373
&iterator_list);
33713374
internal_iter = NewMergingIterator(&cfd->internal_comparator(),
33723375
&iterator_list[0], iterator_list.size());
@@ -4377,7 +4380,7 @@ Status DBImpl::SetNewMemtableAndNewLogFile(ColumnFamilyData* cfd,
43774380
if (creating_new_log) {
43784381
s = env_->NewWritableFile(LogFileName(options_.wal_dir, new_log_number),
43794382
&lfile,
4380-
env_->OptimizeForLogWrite(storage_options_));
4383+
env_->OptimizeForLogWrite(env_options_));
43814384
if (s.ok()) {
43824385
// Our final size should be less than write_buffer_size
43834386
// (compression, etc) but err on the side of caution.
@@ -4615,7 +4618,7 @@ Status DBImpl::GetUpdatesSince(
46154618
return s;
46164619
}
46174620
iter->reset(new TransactionLogIteratorImpl(options_.wal_dir, &options_,
4618-
read_options, storage_options_,
4621+
read_options, env_options_,
46194622
seq, std::move(wal_files), this));
46204623
return (*iter)->status();
46214624
}

db/db_impl.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ class DBImpl : public DB {
607607
int delayed_writes_;
608608

609609
// The options to access storage files
610-
const EnvOptions storage_options_;
610+
const EnvOptions env_options_;
611611

612612
// A value of true temporarily disables scheduling of background work
613613
bool bg_work_gate_closed_;

0 commit comments

Comments
 (0)