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.
751compaction_count++;752Put("a", "begin");753Put("z", "end");754dbfull()->TEST_CompactMemTable();755}757// Step 2: clear level 1 if necessary.758dbfull()->TEST_CompactRange(1, nullptr, nullptr);759ASSERT_EQ(NumTableFilesAtLevel(0), 1);760ASSERT_EQ(NumTableFilesAtLevel(1), 0);761ASSERT_EQ(NumTableFilesAtLevel(2), 1);763// Step 3: many read misses must not schedule any compaction.764for (int i = 0; i < 1000; i++) {765ASSERT_EQ("NOT_FOUND", Get("missing"));766}767DelayMilliseconds(1000);768ASSERT_EQ(NumTableFilesAtLevel(0), 1);769ASSERT_EQ(NumTableFilesAtLevel(1), 0);770ASSERT_EQ(NumTableFilesAtLevel(2), 1);772// Step 4: a manual compaction still moves the L0 file down.773dbfull()->TEST_CompactRange(0, nullptr, nullptr);774ASSERT_EQ(NumTableFilesAtLevel(0), 0);775} while (ChangeOptions());776}778TEST(DBTest, IterEmpty) {779Iterator* iter = db_->NewIterator(ReadOptions());781iter->SeekToFirst();782ASSERT_EQ(IterStatus(iter), "(invalid)");784iter->SeekToLast();785ASSERT_EQ(IterStatus(iter), "(invalid)");787iter->Seek("foo");788ASSERT_EQ(IterStatus(iter), "(invalid)");790delete iter;791}793TEST(DBTest, IterSingle) {794ASSERT_OK(Put("a", "va"));795Iterator* iter = db_->NewIterator(ReadOptions());797iter->SeekToFirst();798ASSERT_EQ(IterStatus(iter), "a->va");799iter->Next();800ASSERT_EQ(IterStatus(iter), "(invalid)");801iter->SeekToFirst();802ASSERT_EQ(IterStatus(iter), "a->va");803iter->Prev();804ASSERT_EQ(IterStatus(iter), "(invalid)");806iter->SeekToLast();807ASSERT_EQ(IterStatus(iter), "a->va");808iter->Next();809ASSERT_EQ(IterStatus(iter), "(invalid)");810iter->SeekToLast();811ASSERT_EQ(IterStatus(iter), "a->va");812iter->Prev();813ASSERT_EQ(IterStatus(iter), "(invalid)");815iter->Seek("");816ASSERT_EQ(IterStatus(iter), "a->va");817iter->Next();818ASSERT_EQ(IterStatus(iter), "(invalid)");820iter->Seek("a");821ASSERT_EQ(IterStatus(iter), "a->va");822iter->Next();823ASSERT_EQ(IterStatus(iter), "(invalid)");825iter->Seek("b");826ASSERT_EQ(IterStatus(iter), "(invalid)");828delete iter;829}831TEST(DBTest, IterMulti) {832ASSERT_OK(Put("a", "va"));833ASSERT_OK(Put("b", "vb"));834ASSERT_OK(Put("c", "vc"));835Iterator* iter = db_->NewIterator(ReadOptions());837iter->SeekToFirst();838ASSERT_EQ(IterStatus(iter), "a->va");839iter->Next();840ASSERT_EQ(IterStatus(iter), "b->vb");841iter->Next();842ASSERT_EQ(IterStatus(iter), "c->vc");843iter->Next();844ASSERT_EQ(IterStatus(iter), "(invalid)");845iter->SeekToFirst();846ASSERT_EQ(IterStatus(iter), "a->va");847iter->Prev();848ASSERT_EQ(IterStatus(iter), "(invalid)");850iter->SeekToLast();851ASSERT_EQ(IterStatus(iter), "c->vc");852iter->Prev();853ASSERT_EQ(IterStatus(iter), "b->vb");854iter->Prev();855ASSERT_EQ(IterStatus(iter), "a->va");856iter->Prev();857ASSERT_EQ(IterStatus(iter), "(invalid)");858iter->SeekToLast();859ASSERT_EQ(IterStatus(iter), "c->vc");860iter->Next();861ASSERT_EQ(IterStatus(iter), "(invalid)");863iter->Seek("");864ASSERT_EQ(IterStatus(iter), "a->va");865iter->Seek("a");866ASSERT_EQ(IterStatus(iter), "a->va");867iter->Seek("ax");868ASSERT_EQ(IterStatus(iter), "b->vb");869iter->Seek("b");870ASSERT_EQ(IterStatus(iter), "b->vb");871iter->Seek("z");872ASSERT_EQ(IterStatus(iter), "(invalid)");874// Switch from reverse to forward875iter->SeekToLast();876iter->Prev();877iter->Prev();878iter->Next();879ASSERT_EQ(IterStatus(iter), "b->vb");881// Switch from forward to reverse882iter->SeekToFirst();883iter->Next();884iter->Next();885iter->Prev();886ASSERT_EQ(IterStatus(iter), "b->vb");888// Make sure iter stays at snapshot889ASSERT_OK(Put("a", "va2"));890ASSERT_OK(Put("a2", "va3"));891ASSERT_OK(Put("b", "vb2"));892ASSERT_OK(Put("c", "vc2"));893ASSERT_OK(Delete("b"));894iter->SeekToFirst();895ASSERT_EQ(IterStatus(iter), "a->va");896iter->Next();897ASSERT_EQ(IterStatus(iter), "b->vb");898iter->Next();899ASSERT_EQ(IterStatus(iter), "c->vc");900iter->Next();901ASSERT_EQ(IterStatus(iter), "(invalid)");902iter->SeekToLast();903ASSERT_EQ(IterStatus(iter), "c->vc");904iter->Prev();905ASSERT_EQ(IterStatus(iter), "b->vb");906iter->Prev();907ASSERT_EQ(IterStatus(iter), "a->va");908iter->Prev();909ASSERT_EQ(IterStatus(iter), "(invalid)");911delete iter;912}914TEST(DBTest, IterSmallAndLargeMix) {915ASSERT_OK(Put("a", "va"));916ASSERT_OK(Put("b", std::string(100000, 'b')));917ASSERT_OK(Put("c", "vc"));918ASSERT_OK(Put("d", std::string(100000, 'd')));919ASSERT_OK(Put("e", std::string(100000, 'e')));921Iterator* iter = db_->NewIterator(ReadOptions());923iter->SeekToFirst();924ASSERT_EQ(IterStatus(iter), "a->va");925iter->Next();926ASSERT_EQ(IterStatus(iter), "b->" + std::string(100000, 'b'));927iter->Next();928ASSERT_EQ(IterStatus(iter), "c->vc");929iter->Next();930ASSERT_EQ(IterStatus(iter), "d->" + std::string(100000, 'd'));931iter->Next();932ASSERT_EQ(IterStatus(iter), "e->" + std::string(100000, 'e'));933iter->Next();934ASSERT_EQ(IterStatus(iter), "(invalid)");936iter->SeekToLast();937ASSERT_EQ(IterStatus(iter), "e->" + std::string(100000, 'e'));938iter->Prev();939ASSERT_EQ(IterStatus(iter), "d->" + std::string(100000, 'd'));940iter->Prev();941ASSERT_EQ(IterStatus(iter), "c->vc");942iter->Prev();943ASSERT_EQ(IterStatus(iter), "b->" + std::string(100000, 'b'));944iter->Prev();945ASSERT_EQ(IterStatus(iter), "a->va");946iter->Prev();947ASSERT_EQ(IterStatus(iter), "(invalid)");949delete iter;950}952TEST(DBTest, IterMultiWithDelete) {953do {954ASSERT_OK(Put("a", "va"));955ASSERT_OK(Put("b", "vb"));956ASSERT_OK(Put("c", "vc"));957ASSERT_OK(Delete("b"));958ASSERT_EQ("NOT_FOUND", Get("b"));960Iterator* iter = db_->NewIterator(ReadOptions());961iter->Seek("c");962ASSERT_EQ(IterStatus(iter), "c->vc");963iter->Prev();964ASSERT_EQ(IterStatus(iter), "a->va");965delete iter;966} while (ChangeOptions());967}969TEST(DBTest, Recover) {970do {971ASSERT_OK(Put("foo", "v1"));972ASSERT_OK(Put("baz", "v5"));974Reopen();975ASSERT_EQ("v1", Get("foo"));977ASSERT_EQ("v1", Get("foo"));978ASSERT_EQ("v5", Get("baz"));979ASSERT_OK(Put("bar", "v2"));980ASSERT_OK(Put("foo", "v3"));982Reopen();983ASSERT_EQ("v3", Get("foo"));984ASSERT_OK(Put("foo", "v4"));985ASSERT_EQ("v4", Get("foo"));986ASSERT_EQ("v2", Get("bar"));987ASSERT_EQ("v5", Get("baz"));988} while (ChangeOptions());989}991TEST(DBTest, RecoveryWithEmptyLog) {992do {993ASSERT_OK(Put("foo", "v1"));994ASSERT_OK(Put("foo", "v2"));995Reopen();996Reopen();997ASSERT_OK(Put("foo", "v3"));998Reopen();999ASSERT_EQ("v3", Get("foo"));1000} while (ChangeOptions());
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.