Save the current state in *v.
| 671 | |
| 672 | // Save the current state in *v. |
| 673 | void SaveTo(Version* v) { |
| 674 | BySmallestKey cmp; |
| 675 | cmp.internal_comparator = &vset_->icmp_; |
| 676 | for (int level = 0; level < config::kNumLevels; level++) { |
| 677 | // Merge the set of added files with the set of pre-existing files. |
| 678 | // Drop any deleted files. Store the result in *v. |
| 679 | const std::vector<FileMetaData*>& base_files = base_->files_[level]; |
| 680 | std::vector<FileMetaData*>::const_iterator base_iter = base_files.begin(); |
| 681 | std::vector<FileMetaData*>::const_iterator base_end = base_files.end(); |
| 682 | const FileSet* added_files = levels_[level].added_files; |
| 683 | v->files_[level].reserve(base_files.size() + added_files->size()); |
| 684 | for (const auto& added_file : *added_files) { |
| 685 | // Add all smaller files listed in base_ |
| 686 | for (std::vector<FileMetaData*>::const_iterator bpos = |
| 687 | std::upper_bound(base_iter, base_end, added_file, cmp); |
| 688 | base_iter != bpos; ++base_iter) { |
| 689 | MaybeAddFile(v, level, *base_iter); |
| 690 | } |
| 691 | |
| 692 | MaybeAddFile(v, level, added_file); |
| 693 | } |
| 694 | |
| 695 | // Add remaining base files |
| 696 | for (; base_iter != base_end; ++base_iter) { |
| 697 | MaybeAddFile(v, level, *base_iter); |
| 698 | } |
| 699 | |
| 700 | #ifndef NDEBUG |
| 701 | // Make sure there is no overlap in levels > 0 |
| 702 | if (level > 0) { |
| 703 | for (uint32_t i = 1; i < v->files_[level].size(); i++) { |
| 704 | const InternalKey& prev_end = v->files_[level][i - 1]->largest; |
| 705 | const InternalKey& this_begin = v->files_[level][i]->smallest; |
| 706 | if (vset_->icmp_.Compare(prev_end, this_begin) >= 0) { |
| 707 | fprintf(stderr, "overlapping ranges in same level %s vs. %s\n", |
| 708 | prev_end.DebugString().c_str(), |
| 709 | this_begin.DebugString().c_str()); |
| 710 | abort(); |
| 711 | } |
| 712 | } |
| 713 | } |
| 714 | #endif |
| 715 | } |
| 716 | } |
| 717 | |
| 718 | void MaybeAddFile(Version* v, int level, FileMetaData* f) { |
| 719 | if (levels_[level].deleted_files.count(f->number) > 0) { |