@@ -483,6 +483,17 @@ bool BySmallestKey(FileMetaData* a, FileMetaData* b,
483
483
Version::Version (ColumnFamilyData* cfd, VersionSet* vset,
484
484
uint64_t version_number)
485
485
: cfd_(cfd),
486
+ internal_comparator_((cfd == nullptr ) ? nullptr
487
+ : &cfd->internal_comparator()),
488
+ user_comparator_((cfd == nullptr )
489
+ ? nullptr
490
+ : internal_comparator_->user_comparator()),
491
+ table_cache_((cfd == nullptr ) ? nullptr : cfd->table_cache()),
492
+ merge_operator_((cfd == nullptr ) ? nullptr
493
+ : cfd->options()->merge_operator.get()),
494
+ info_log_((cfd == nullptr ) ? nullptr : cfd->options()->info_log.get()),
495
+ db_statistics_((cfd == nullptr ) ? nullptr
496
+ : cfd->options()->statistics.get()),
486
497
vset_(vset),
487
498
next_(this ),
488
499
prev_(this ),
@@ -504,27 +515,22 @@ void Version::Get(const ReadOptions& options,
504
515
Status* status,
505
516
MergeContext* merge_context,
506
517
GetStats* stats,
507
- const Options& db_options,
508
518
bool * value_found) {
509
519
Slice ikey = k.internal_key ();
510
520
Slice user_key = k.user_key ();
511
- const Comparator* ucmp = cfd_->internal_comparator ().user_comparator ();
512
-
513
- auto merge_operator = db_options.merge_operator .get ();
514
- auto logger = db_options.info_log .get ();
515
521
516
522
assert (status->ok () || status->IsMergeInProgress ());
517
523
Saver saver;
518
524
saver.state = status->ok ()? kNotFound : kMerge ;
519
- saver.ucmp = ucmp ;
525
+ saver.ucmp = user_comparator_ ;
520
526
saver.user_key = user_key;
521
527
saver.value_found = value_found;
522
528
saver.value = value;
523
- saver.merge_operator = merge_operator ;
529
+ saver.merge_operator = merge_operator_ ;
524
530
saver.merge_context = merge_context;
525
- saver.logger = logger ;
531
+ saver.logger = info_log_ ;
526
532
saver.didIO = false ;
527
- saver.statistics = db_options. statistics . get () ;
533
+ saver.statistics = db_statistics_ ;
528
534
529
535
stats->seek_file = nullptr ;
530
536
stats->seek_file_level = -1 ;
@@ -555,7 +561,7 @@ void Version::Get(const ReadOptions& options,
555
561
// On Level-n (n>=1), files are sorted.
556
562
// Binary search to find earliest index whose largest key >= ikey.
557
563
// We will also stop when the file no longer overlaps ikey
558
- start_index = FindFile (cfd_-> internal_comparator () , files_[level], ikey);
564
+ start_index = FindFile (*internal_comparator_ , files_[level], ikey);
559
565
}
560
566
561
567
// Traverse each relevant file to find the desired key
@@ -564,8 +570,10 @@ void Version::Get(const ReadOptions& options,
564
570
#endif
565
571
for (uint32_t i = start_index; i < num_files; ++i) {
566
572
FileMetaData* f = files[i];
567
- if (ucmp->Compare (user_key, f->smallest .user_key ()) < 0 ||
568
- ucmp->Compare (user_key, f->largest .user_key ()) > 0 ) {
573
+ // Skip key range filtering for levle 0 if there are few level 0 files.
574
+ if ((level > 0 || num_files > 2 ) &&
575
+ (user_comparator_->Compare (user_key, f->smallest .user_key ()) < 0 ||
576
+ user_comparator_->Compare (user_key, f->largest .user_key ()) > 0 )) {
569
577
// Only process overlapping files.
570
578
if (level > 0 ) {
571
579
// If on Level-n (n>=1) then the files are sorted.
@@ -581,8 +589,8 @@ void Version::Get(const ReadOptions& options,
581
589
// Sanity check to make sure that the files are correctly sorted
582
590
if (prev_file) {
583
591
if (level != 0 ) {
584
- int comp_sign = cfd_-> internal_comparator (). Compare (
585
- prev_file->largest , f->smallest );
592
+ int comp_sign =
593
+ internal_comparator_-> Compare ( prev_file->largest , f->smallest );
586
594
assert (comp_sign < 0 );
587
595
} else {
588
596
// level == 0, the current file cannot be newer than the previous one.
@@ -596,9 +604,8 @@ void Version::Get(const ReadOptions& options,
596
604
prev_file = f;
597
605
#endif
598
606
bool tableIO = false ;
599
- *status = cfd_->table_cache ()->Get (options, cfd_->internal_comparator (),
600
- *f, ikey, &saver, SaveValue, &tableIO,
601
- MarkKeyMayExist);
607
+ *status = table_cache_->Get (options, *internal_comparator_, *f, ikey,
608
+ &saver, SaveValue, &tableIO, MarkKeyMayExist);
602
609
// TODO: examine the behavior for corrupted key
603
610
if (!status->ok ()) {
604
611
return ;
@@ -643,12 +650,12 @@ void Version::Get(const ReadOptions& options,
643
650
if (kMerge == saver.state ) {
644
651
// merge_operands are in saver and we hit the beginning of the key history
645
652
// do a final merge of nullptr and operands;
646
- if (merge_operator ->FullMerge (user_key, nullptr ,
647
- saver.merge_context ->GetOperands (),
648
- value, logger )) {
653
+ if (merge_operator_ ->FullMerge (user_key, nullptr ,
654
+ saver.merge_context ->GetOperands (), value ,
655
+ info_log_ )) {
649
656
*status = Status::OK ();
650
657
} else {
651
- RecordTick (db_options. statistics . get () , NUMBER_MERGE_FAILURES);
658
+ RecordTick (db_statistics_ , NUMBER_MERGE_FAILURES);
652
659
*status = Status::Corruption (" could not perform end-of-key merge for " ,
653
660
user_key);
654
661
}
@@ -1458,6 +1465,12 @@ class VersionSet::Builder {
1458
1465
base_->vset_ ->storage_options_ , cfd_->internal_comparator (),
1459
1466
file_meta->number , file_meta->file_size ,
1460
1467
&file_meta->table_reader_handle , &table_io, false );
1468
+ if (file_meta->table_reader_handle != nullptr ) {
1469
+ // Load table_reader
1470
+ file_meta->table_reader =
1471
+ cfd_->table_cache ()->GetTableReaderFromHandle (
1472
+ file_meta->table_reader_handle );
1473
+ }
1461
1474
}
1462
1475
}
1463
1476
}
0 commit comments