Files
CBDD/tests/CBDD.Tests/Indexing/BTreeDeleteUnderflowTests.cs
Joseph Doherty a70d8befae
All checks were successful
NuGet Publish / build-and-pack (push) Successful in 46s
NuGet Publish / publish-to-gitea (push) Successful in 56s
Reformat / cleanup
2026-02-21 08:10:36 -05:00

51 lines
2.0 KiB
C#

using ZB.MOM.WW.CBDD.Core.Indexing;
using ZB.MOM.WW.CBDD.Core.Storage;
namespace ZB.MOM.WW.CBDD.Tests;
public class BTreeDeleteUnderflowTests
{
/// <summary>
/// Executes Delete_HeavyWorkload_Should_Remain_Queryable_After_Merges.
/// </summary>
[Fact]
public void Delete_HeavyWorkload_Should_Remain_Queryable_After_Merges()
{
string dbPath = Path.Combine(Path.GetTempPath(), $"btree_underflow_{Guid.NewGuid():N}.db");
try
{
using var storage = new StorageEngine(dbPath, PageFileConfig.Default);
var index = new BTreeIndex(storage, IndexOptions.CreateBTree("k"));
ulong insertTxn = storage.BeginTransaction().TransactionId;
for (var i = 1; i <= 240; i++)
index.Insert(IndexKey.Create(i), new DocumentLocation((uint)(1000 + i), 0), insertTxn);
storage.CommitTransaction(insertTxn);
ulong deleteTxn = storage.BeginTransaction().TransactionId;
for (var i = 1; i <= 190; i++)
index.Delete(IndexKey.Create(i), new DocumentLocation((uint)(1000 + i), 0), deleteTxn).ShouldBeTrue();
storage.CommitTransaction(deleteTxn);
for (var i = 1; i <= 190; i++) index.TryFind(IndexKey.Create(i), out _, 0).ShouldBeFalse();
for (var i = 191; i <= 240; i++)
{
index.TryFind(IndexKey.Create(i), out var location, 0).ShouldBeTrue();
location.PageId.ShouldBe((uint)(1000 + i));
}
var remaining = index.GreaterThan(IndexKey.Create(190), false, 0).ToList();
remaining.Count.ShouldBe(50);
remaining.First().Key.ShouldBe(IndexKey.Create(191));
remaining.Last().Key.ShouldBe(IndexKey.Create(240));
}
finally
{
if (File.Exists(dbPath)) File.Delete(dbPath);
string walPath = Path.ChangeExtension(dbPath, ".wal");
if (File.Exists(walPath)) File.Delete(walPath);
}
}
}