Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1// Copyright (c) 2011 The LevelDB Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file. See the AUTHORS file for names of contributors.5#include "db/version_set.h"6#include "util/logging.h"7#include "util/testharness.h"8#include "util/testutil.h"10namespace leveldb {12class FindFileTest {13public:14FindFileTest() : disjoint_sorted_files_(true) {}16~FindFileTest() {17for (int i = 0; i < files_.size(); i++) {18delete files_[i];19}20}22void Add(const char* smallest, const char* largest,23SequenceNumber smallest_seq = 100,24SequenceNumber largest_seq = 100) {25FileMetaData* f = new FileMetaData;26f->number = files_.size() + 1;27f->smallest = InternalKey(smallest, smallest_seq, kTypeValue);28f->largest = InternalKey(largest, largest_seq, kTypeValue);29files_.push_back(f);30}32int Find(const char* key) {33InternalKey target(key, 100, kTypeValue);34InternalKeyComparator cmp(BytewiseComparator());35return FindFile(cmp, files_, target.Encode());36}38bool Overlaps(const char* smallest, const char* largest) {39InternalKeyComparator cmp(BytewiseComparator());40Slice s(smallest != nullptr ? smallest : "");41Slice l(largest != nullptr ? largest : "");42return SomeFileOverlapsRange(cmp, disjoint_sorted_files_, files_,43(smallest != nullptr ? &s : nullptr),44(largest != nullptr ? &l : nullptr));45}47bool disjoint_sorted_files_;49private:50std::vector<FileMetaData*> files_;51};53TEST(FindFileTest, Empty) {54ASSERT_EQ(0, Find("foo"));55ASSERT_TRUE(!Overlaps("a", "z"));56ASSERT_TRUE(!Overlaps(nullptr, "z"));57ASSERT_TRUE(!Overlaps("a", nullptr));58ASSERT_TRUE(!Overlaps(nullptr, nullptr));59}61TEST(FindFileTest, Single) {62Add("p", "q");63ASSERT_EQ(0, Find("a"));64ASSERT_EQ(0, Find("p"));65ASSERT_EQ(0, Find("p1"));66ASSERT_EQ(0, Find("q"));67ASSERT_EQ(1, Find("q1"));68ASSERT_EQ(1, Find("z"));70ASSERT_TRUE(!Overlaps("a", "b"));71ASSERT_TRUE(!Overlaps("z1", "z2"));72ASSERT_TRUE(Overlaps("a", "p"));73ASSERT_TRUE(Overlaps("a", "q"));74ASSERT_TRUE(Overlaps("a", "z"));75ASSERT_TRUE(Overlaps("p", "p1"));76ASSERT_TRUE(Overlaps("p", "q"));77ASSERT_TRUE(Overlaps("p", "z"));78ASSERT_TRUE(Overlaps("p1", "p2"));79ASSERT_TRUE(Overlaps("p1", "z"));80ASSERT_TRUE(Overlaps("q", "q"));81ASSERT_TRUE(Overlaps("q", "q1"));83ASSERT_TRUE(!Overlaps(nullptr, "j"));84ASSERT_TRUE(!Overlaps("r", nullptr));85ASSERT_TRUE(Overlaps(nullptr, "p"));86ASSERT_TRUE(Overlaps(nullptr, "p1"));87ASSERT_TRUE(Overlaps("q", nullptr));88ASSERT_TRUE(Overlaps(nullptr, nullptr));89}91TEST(FindFileTest, Multiple) {92Add("150", "200");93Add("200", "250");94Add("300", "350");95Add("400", "450");96ASSERT_EQ(0, Find("100"));97ASSERT_EQ(0, Find("150"));98ASSERT_EQ(0, Find("151"));99ASSERT_EQ(0, Find("199"));100ASSERT_EQ(0, Find("200"));101ASSERT_EQ(1, Find("201"));102ASSERT_EQ(1, Find("249"));103ASSERT_EQ(1, Find("250"));104ASSERT_EQ(2, Find("251"));105ASSERT_EQ(2, Find("299"));106ASSERT_EQ(2, Find("300"));107ASSERT_EQ(2, Find("349"));108ASSERT_EQ(2, Find("350"));109ASSERT_EQ(3, Find("351"));110ASSERT_EQ(3, Find("400"));111ASSERT_EQ(3, Find("450"));112ASSERT_EQ(4, Find("451"));114ASSERT_TRUE(!Overlaps("100", "149"));115ASSERT_TRUE(!Overlaps("251", "299"));116ASSERT_TRUE(!Overlaps("451", "500"));117ASSERT_TRUE(!Overlaps("351", "399"));119ASSERT_TRUE(Overlaps("100", "150"));120ASSERT_TRUE(Overlaps("100", "200"));121ASSERT_TRUE(Overlaps("100", "300"));122ASSERT_TRUE(Overlaps("100", "400"));123ASSERT_TRUE(Overlaps("100", "500"));124ASSERT_TRUE(Overlaps("375", "400"));125ASSERT_TRUE(Overlaps("450", "450"));126ASSERT_TRUE(Overlaps("450", "500"));127}129TEST(FindFileTest, MultipleNullBoundaries) {130Add("150", "200");131Add("200", "250");132Add("300", "350");133Add("400", "450");134ASSERT_TRUE(!Overlaps(nullptr, "149"));135ASSERT_TRUE(!Overlaps("451", nullptr));136ASSERT_TRUE(Overlaps(nullptr, nullptr));137ASSERT_TRUE(Overlaps(nullptr, "150"));138ASSERT_TRUE(Overlaps(nullptr, "199"));139ASSERT_TRUE(Overlaps(nullptr, "200"));140ASSERT_TRUE(Overlaps(nullptr, "201"));141ASSERT_TRUE(Overlaps(nullptr, "400"));142ASSERT_TRUE(Overlaps(nullptr, "800"));143ASSERT_TRUE(Overlaps("100", nullptr));144ASSERT_TRUE(Overlaps("200", nullptr));145ASSERT_TRUE(Overlaps("449", nullptr));146ASSERT_TRUE(Overlaps("450", nullptr));147}149TEST(FindFileTest, OverlapSequenceChecks) {150Add("200", "200", 5000, 3000);151ASSERT_TRUE(!Overlaps("199", "199"));152ASSERT_TRUE(!Overlaps("201", "300"));153ASSERT_TRUE(Overlaps("200", "200"));154ASSERT_TRUE(Overlaps("190", "200"));155ASSERT_TRUE(Overlaps("200", "210"));156}158TEST(FindFileTest, OverlappingFiles) {159Add("150", "600");160Add("400", "500");161disjoint_sorted_files_ = false;162ASSERT_TRUE(!Overlaps("100", "149"));163ASSERT_TRUE(!Overlaps("601", "700"));164ASSERT_TRUE(Overlaps("100", "150"));165ASSERT_TRUE(Overlaps("100", "200"));166ASSERT_TRUE(Overlaps("100", "300"));167ASSERT_TRUE(Overlaps("100", "400"));168ASSERT_TRUE(Overlaps("100", "500"));169ASSERT_TRUE(Overlaps("375", "400"));170ASSERT_TRUE(Overlaps("450", "450"));171ASSERT_TRUE(Overlaps("450", "500"));172ASSERT_TRUE(Overlaps("450", "700"));173ASSERT_TRUE(Overlaps("600", "700"));174}176void AddBoundaryInputs(const InternalKeyComparator& icmp,177const std::vector<FileMetaData*>& level_files,178std::vector<FileMetaData*>* compaction_files);180class AddBoundaryInputsTest {181public:182std::vector<FileMetaData*> level_files_;183std::vector<FileMetaData*> compaction_files_;184std::vector<FileMetaData*> all_files_;185InternalKeyComparator icmp_;187AddBoundaryInputsTest() : icmp_(BytewiseComparator()) {}189~AddBoundaryInputsTest() {190for (size_t i = 0; i < all_files_.size(); ++i) {191delete all_files_[i];192}193all_files_.clear();194}196FileMetaData* CreateFileMetaData(uint64_t number, InternalKey smallest,197InternalKey largest) {198FileMetaData* f = new FileMetaData();199f->number = number;200f->smallest = smallest;201f->largest = largest;202all_files_.push_back(f);203return f;204}205};207TEST(AddBoundaryInputsTest, TestEmptyFileSets) {208AddBoundaryInputs(icmp_, level_files_, &compaction_files_);209ASSERT_TRUE(compaction_files_.empty());210ASSERT_TRUE(level_files_.empty());211}213TEST(AddBoundaryInputsTest, TestEmptyLevelFiles) {214FileMetaData* f1 =215CreateFileMetaData(1, InternalKey("100", 2, kTypeValue),216InternalKey(InternalKey("100", 1, kTypeValue)));217compaction_files_.push_back(f1);219AddBoundaryInputs(icmp_, level_files_, &compaction_files_);220ASSERT_EQ(1, compaction_files_.size());221ASSERT_EQ(f1, compaction_files_[0]);222ASSERT_TRUE(level_files_.empty());223}225TEST(AddBoundaryInputsTest, TestEmptyCompactionFiles) {226FileMetaData* f1 =227CreateFileMetaData(1, InternalKey("100", 2, kTypeValue),228InternalKey(InternalKey("100", 1, kTypeValue)));229level_files_.push_back(f1);231AddBoundaryInputs(icmp_, level_files_, &compaction_files_);232ASSERT_TRUE(compaction_files_.empty());233ASSERT_EQ(1, level_files_.size());234ASSERT_EQ(f1, level_files_[0]);235}237TEST(AddBoundaryInputsTest, TestNoBoundaryFiles) {238FileMetaData* f1 =239CreateFileMetaData(1, InternalKey("100", 2, kTypeValue),240InternalKey(InternalKey("100", 1, kTypeValue)));241FileMetaData* f2 =242CreateFileMetaData(1, InternalKey("200", 2, kTypeValue),243InternalKey(InternalKey("200", 1, kTypeValue)));244FileMetaData* f3 =245CreateFileMetaData(1, InternalKey("300", 2, kTypeValue),246InternalKey(InternalKey("300", 1, kTypeValue)));248level_files_.push_back(f3);249level_files_.push_back(f2);250level_files_.push_back(f1);
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.