Skip to content

Commit a6be68a

Browse files
Merged PR 675033: Fix HasMachineIdCore for state change machine list
Fix HasMachineIdCore for state change machine list Related work items: #1979440
1 parent 9ad8a18 commit a6be68a

File tree

4 files changed

+83
-16
lines changed

4 files changed

+83
-16
lines changed

Public/Src/Cache/ContentStore/Distributed/NuCache/MachineIdSets/LocationChangeMachineIdSet.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,8 @@ internal static bool HasMachineIdCore(ReadOnlySpan<byte> data, int index)
219219

220220
for (int i = 0; i < count; i++)
221221
{
222-
var machineId = (ushort)reader.ReadInt32Compact();
223-
if (machineId == index)
222+
var locationChange = new LocationChange(reader.ReadUInt16());
223+
if (locationChange.IsAdd && locationChange.Index == index)
224224
{
225225
return true;
226226
}

Public/Src/Cache/ContentStore/Distributed/NuCache/MachineIdSets/MachineIdSet.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ public static MachineIdSet Deserialize(ref SpanReader reader)
231231
/// <summary>
232232
/// Format of a machine id set.
233233
/// </summary>
234-
protected enum SetFormat
234+
public enum SetFormat
235235
{
236236
/// <summary>
237237
/// Based on a bit vector.

Public/Src/Cache/ContentStore/DistributedTest/ContentLocation/NuCache/MachineIdSetTests.cs

+80-13
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,76 @@ namespace ContentStoreTest.Distributed.ContentLocation.NuCache
1414
{
1515
public class MachineIdSetTests
1616
{
17-
[Fact]
18-
public void MachineIdIndexShouldBePresent()
17+
[Theory]
18+
[InlineData(MachineIdSet.SetFormat.Array)]
19+
[InlineData(MachineIdSet.SetFormat.Bits)]
20+
[InlineData(MachineIdSet.SetFormat.LocationChange)]
21+
public void MachineIdIndexShouldBePresent(MachineIdSet.SetFormat format)
1922
{
20-
var set1 = MachineIdSet.Empty;
23+
var set1 = CreateMachineIdSet(format);
2124

2225
set1 = set1.Add(MachineId.FromIndex(1));
2326
set1.GetMachineIdIndex(MachineId.FromIndex(1)).Should().Be(0);
2427
set1.GetMachineIdIndex(MachineId.FromIndex(2)).Should().Be(-1);
2528
}
2629

27-
[Fact]
28-
public void BitMachineIdSet_SetExistenceForEmptyTests()
30+
[Theory]
31+
[InlineData(MachineIdSet.SetFormat.Array)]
32+
[InlineData(MachineIdSet.SetFormat.Bits)]
33+
[InlineData(MachineIdSet.SetFormat.LocationChange)]
34+
public void BitMachineIdSet_SetExistenceForEmptyTests(MachineIdSet.SetFormat format)
2935
{
3036
var set1 = MachineIdSet.Empty;
3137

3238
set1 = set1.Add(MachineId.FromIndex(1));
3339
set1[1].Should().BeTrue();
3440
}
3541

36-
[Fact]
37-
public void BitMachineIdSet_ExhaustiveTests()
42+
[Theory]
43+
[InlineData(MachineIdSet.SetFormat.Array)]
44+
[InlineData(MachineIdSet.SetFormat.Bits)]
45+
[InlineData(MachineIdSet.SetFormat.LocationChange)]
46+
public void TestSetMachineId(MachineIdSet.SetFormat format)
47+
{
48+
var set1 = CreateMachineIdSet(format);
49+
set1 = set1.SetExistence(1.AsMachineId(), exists: true);
50+
set1 = set1.SetExistence(2.AsMachineId(), exists: true);
51+
set1 = set1.SetExistence(3.AsMachineId(), exists: true);
52+
53+
var span = SerializeToByteArray(set1).AsSpan();
54+
MachineIdSet.HasMachineId(span, 1).Should().BeTrue();
55+
MachineIdSet.HasMachineId(span, 2).Should().BeTrue();
56+
MachineIdSet.HasMachineId(span, 3).Should().BeTrue();
57+
58+
set1 = set1.SetExistence(2.AsMachineId(), exists: false);
59+
span = SerializeToByteArray(set1).AsSpan();
60+
61+
MachineIdSet.HasMachineId(span, 2).Should().BeFalse();
62+
63+
set1 = set1.SetExistence(MachineIdCollection.Create(Enumerable.Range(1, 100).Select(n => n.AsMachineId()).ToArray()), exists: true);
64+
set1 = set1.SetExistence(MachineIdCollection.Create(Enumerable.Range(101, 100).Select(n => n.AsMachineId()).ToArray()), exists: false);
65+
span = SerializeToByteArray(set1).AsSpan();
66+
67+
MachineIdSet.HasMachineId(span, 99).Should().BeTrue();
68+
MachineIdSet.HasMachineId(span, 105).Should().BeFalse();
69+
}
70+
71+
private static MachineIdSet CreateMachineIdSet(MachineIdSet.SetFormat format)
72+
{
73+
return format switch
74+
{
75+
MachineIdSet.SetFormat.Bits => BitMachineIdSet.EmptyInstance,
76+
MachineIdSet.SetFormat.Array => ArrayMachineIdSet.EmptyInstance,
77+
MachineIdSet.SetFormat.LocationChange => LocationChangeMachineIdSet.EmptyInstance,
78+
_ => throw new ArgumentOutOfRangeException(nameof(format), format, null)
79+
};
80+
}
81+
82+
[Theory]
83+
[InlineData(MachineIdSet.SetFormat.Array)]
84+
[InlineData(MachineIdSet.SetFormat.Bits)]
85+
[InlineData(MachineIdSet.SetFormat.LocationChange)]
86+
public void BitMachineIdSet_ExhaustiveTests(MachineIdSet.SetFormat format)
3887
{
3988
for (int length = 0; length < 15; length++)
4089
{
@@ -56,8 +105,11 @@ public void BitMachineIdSet_ExhaustiveTests()
56105
}
57106
}
58107

59-
[Fact]
60-
public void MachineIdSets_Are_TheSame_ExhaustiveTests()
108+
[Theory]
109+
[InlineData(MachineIdSet.SetFormat.Array)]
110+
[InlineData(MachineIdSet.SetFormat.Bits)]
111+
[InlineData(MachineIdSet.SetFormat.LocationChange)]
112+
public void MachineIdSets_Are_TheSame_ExhaustiveTests(MachineIdSet.SetFormat format)
61113
{
62114
// This test makes sure that the main functionality provides the same results for both BitMachineIdSet and ArrayMachineIdSet
63115
for (int length = 0; length < 15; length++)
@@ -78,14 +130,15 @@ public void MachineIdSets_Are_TheSame_ExhaustiveTests()
78130

79131
var index2 = arrayIdSet.GetMachineIdIndex(new MachineId(machineId));
80132
index2.Should().Be(index);
81-
82-
83133
}
84134
}
85135
}
86136

87-
[Fact]
88-
public void ArrayMachineIdSet_ExhaustiveTests()
137+
[Theory]
138+
[InlineData(MachineIdSet.SetFormat.Array)]
139+
[InlineData(MachineIdSet.SetFormat.Bits)]
140+
[InlineData(MachineIdSet.SetFormat.LocationChange)]
141+
public void MachineIdSet_ExhaustiveTests(MachineIdSet.SetFormat format)
89142
{
90143
for (int length = 0; length < 15; length++)
91144
{
@@ -146,6 +199,20 @@ private static MachineIdSet Copy(MachineIdSet source)
146199
}
147200
}
148201

202+
private static byte[] SerializeToByteArray(MachineIdSet source)
203+
{
204+
using (var memoryStream = new MemoryStream())
205+
{
206+
using (var writer = BuildXLWriter.Create(memoryStream, leaveOpen: true))
207+
{
208+
source.Serialize(writer);
209+
}
210+
211+
memoryStream.Position = 0;
212+
return memoryStream.ToArray();
213+
}
214+
}
215+
149216
[Fact]
150217
public void SetExistenceTests()
151218
{

0 commit comments

Comments
 (0)