Fix first multipart merge disk segment detection

This commit is contained in:
Ahmed Yasin Koculu
2026-06-08 01:47:19 +02:00
parent ad29a73532
commit 041d4e22a3
2 changed files with 42 additions and 6 deletions
@@ -34,6 +34,38 @@ public sealed class FixedSizeKeyAndValueTests
data.Maintenance.Drop();
}
[Test]
public void FirstMultiPartMergeDoesNotTreatReadOnlySegmentAsDisk()
{
var dataPath = "data/FirstMultiPartMergeDoesNotTreatReadOnlySegmentAsDisk";
if (Directory.Exists(dataPath))
Directory.Delete(dataPath, true);
using var data = new ZoneTreeFactory<int, int>()
.DisableDeletion()
.SetMutableSegmentMaxItemCount(100)
.SetDataDirectory(dataPath)
.SetWriteAheadLogDirectory(dataPath)
.ConfigureDiskSegmentOptions(options =>
{
options.DiskSegmentMode = DiskSegmentMode.MultiPartDiskSegment;
options.MinimumRecordCount = 2;
options.MaximumRecordCount = 3;
})
.OpenOrCreate();
for (var i = 0; i < 4; ++i)
{
data.Upsert(i, i);
}
data.Maintenance.MoveMutableSegmentForward();
data.Maintenance.StartMergeOperation().Join();
Assert.That(data.Maintenance.DiskSegment.GetPartCount(), Is.EqualTo(2));
data.Maintenance.Drop();
}
[Test]
public void IntStringTreeTest()
{
@@ -357,4 +389,4 @@ public sealed class FixedSizeKeyAndValueTests
ReloadIntIntTreeTestHelper(dataPath, true);
}
}
}
+9 -5
View File
@@ -138,7 +138,8 @@ public sealed partial class ZoneTree<TKey, TValue> : IZoneTree<TKey, TValue>, IZ
var mergingSegments = new List<ISeekableIterator<TKey, TValue>>();
mergingSegments.AddRange(readOnlySegmentsArray);
if (oldDiskSegment is not NullDiskSegment<TKey, TValue>)
var hasDiskSegment = oldDiskSegment is not NullDiskSegment<TKey, TValue>;
if (hasDiskSegment)
mergingSegments.Add(oldDiskSegment.GetSeekableIterator());
if (IsCancelMergeRequested)
@@ -154,7 +155,7 @@ public sealed partial class ZoneTree<TKey, TValue> : IZoneTree<TKey, TValue>, IZ
Options.DiskSegmentOptions.DiskSegmentMode == DiskSegmentMode.MultiPartDiskSegment;
var len = mergingSegments.Count;
var diskSegmentIndex = len - 1;
var diskSegmentIndex = hasDiskSegment ? len - 1 : -1;
using IDiskSegmentCreator<TKey, TValue> diskSegmentCreator =
enableMultiPartDiskSegment ?
@@ -199,9 +200,12 @@ public sealed partial class ZoneTree<TKey, TValue> : IZoneTree<TKey, TValue>, IZ
var hasPrev = false;
TKey prevKey = default;
var firstKeysOfEveryPart = oldDiskSegment.GetFirstKeysOfEveryPart();
var lastKeysOfEveryPart = oldDiskSegment.GetLastKeysOfEveryPart();
var lastValuesOfEveryPart = oldDiskSegment.GetLastValuesOfEveryPart();
var lastKeysOfEveryPart = hasDiskSegment ?
oldDiskSegment.GetLastKeysOfEveryPart() :
Array.Empty<TKey>();
var lastValuesOfEveryPart = hasDiskSegment ?
oldDiskSegment.GetLastValuesOfEveryPart() :
Array.Empty<TValue>();
var diskSegmentMinimumRecordCount = Options.DiskSegmentOptions.MinimumRecordCount;
var dropCount = 0;