perf(net): borrow inbound packet storage

Decode headers, optional fields, fragments, and single-fragment messages directly over pooled datagrams. Copy only fragment state that crosses a datagram lifetime, preserve synchronous dispatch and ACK ordering, and lock the path to the owned decoder with differential and zero-allocation tests.
This commit is contained in:
Erik 2026-07-25 05:58:55 +02:00
parent 7211bb1bf7
commit e928c5dd02
18 changed files with 1329 additions and 66 deletions

View file

@ -124,4 +124,81 @@ public class FragmentAssemblerTests
assembler.DropAll();
Assert.Equal(0, assembler.PartialCount);
}
[Fact]
public void TryIngest_BorrowedSingleFragment_ReturnsOriginalMemory()
{
var assembler = new FragmentAssembler();
byte[] payload = [1, 2, 3];
var fragment = new BorrowedMessageFragment(
MakeFrag(10, 1, 0, payload, 11).Header,
payload);
bool complete = assembler.TryIngest(
fragment,
out ReadOnlyMemory<byte> message,
out ushort queue);
payload[1] = 0xAA;
Assert.True(complete);
Assert.Equal(11, queue);
Assert.Equal(0xAA, message.Span[1]);
Assert.Equal(0, assembler.PartialCount);
}
[Fact]
public void TryIngest_BorrowedMultiFragment_CopiesAcrossDatagrams()
{
var assembler = new FragmentAssembler();
byte[] firstPayload = [1, 2];
byte[] secondPayload = [3, 4];
var first = new BorrowedMessageFragment(
MakeFrag(20, 2, 0, firstPayload, 12).Header,
firstPayload);
var second = new BorrowedMessageFragment(
MakeFrag(20, 2, 1, secondPayload, 12).Header,
secondPayload);
Assert.False(assembler.TryIngest(
first,
out _,
out _));
firstPayload[0] = 0xFF;
Assert.True(assembler.TryIngest(
second,
out ReadOnlyMemory<byte> message,
out ushort queue));
secondPayload[0] = 0xEE;
Assert.Equal(12, queue);
Assert.Equal(new byte[] { 1, 2, 3, 4 }, message.ToArray());
Assert.Equal(0, assembler.PartialCount);
}
[Fact]
public void TryIngest_ConflictingBorrowedIdentity_PreservesOriginalPartial()
{
var assembler = new FragmentAssembler();
var first = new BorrowedMessageFragment(
MakeFrag(30, 2, 0, [1], 13).Header,
new byte[] { 1 });
var conflict = new BorrowedMessageFragment(
MakeFrag(30, 3, 1, [9], 14).Header,
new byte[] { 9 });
var completion = new BorrowedMessageFragment(
MakeFrag(30, 2, 1, [2], 13).Header,
new byte[] { 2 });
Assert.False(assembler.TryIngest(first, out _, out _));
Assert.False(assembler.TryIngest(conflict, out _, out _));
Assert.Equal(1, assembler.PartialCount);
Assert.True(assembler.TryIngest(
completion,
out ReadOnlyMemory<byte> message,
out ushort queue));
Assert.Equal(13, queue);
Assert.Equal(new byte[] { 1, 2 }, message.ToArray());
Assert.Equal(0, assembler.PartialCount);
}
}