mirror of
https://github.com/ZoneTree/ZoneTree.git
synced 2026-10-29 13:37:47 +08:00
Fix first multipart merge disk segment detection
This commit is contained in:
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user