From b369071b6ac51853f580021d4888bcaece869fb3 Mon Sep 17 00:00:00 2001 From: Yordis Prieto Date: Sat, 15 Aug 2026 03:03:30 -0400 Subject: [PATCH] fix(transaction-log): prevent retry format drift Signed-off-by: Yordis Prieto --- .../LogRecords/PrepareLogRecordTests.cs | 48 +++++++++++++++++++ .../LogRecords/PrepareLogRecord.cs | 3 +- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/EventStore.Core.XUnit.Tests/TransactionLog/LogRecords/PrepareLogRecordTests.cs diff --git a/src/EventStore.Core.XUnit.Tests/TransactionLog/LogRecords/PrepareLogRecordTests.cs b/src/EventStore.Core.XUnit.Tests/TransactionLog/LogRecords/PrepareLogRecordTests.cs new file mode 100644 index 000000000..2684f377d --- /dev/null +++ b/src/EventStore.Core.XUnit.Tests/TransactionLog/LogRecords/PrepareLogRecordTests.cs @@ -0,0 +1,48 @@ +using System; +using System.IO; +using DotNext.Buffers; +using DotNext.IO; +using EventStore.Core.TransactionLog.LogRecords; +using EventStore.LogCommon; +using Xunit; + +namespace EventStore.Core.XUnit.Tests.TransactionLog.LogRecords; + +public class PrepareLogRecordTests +{ + [Theory] + [InlineData(LogRecordVersion.LogRecordV0)] + [InlineData(LogRecordVersion.LogRecordV1)] + public void copy_for_retry_preserves_record_version(byte version) + { + var record = new PrepareLogRecord( + logPosition: 100, + correlationId: Guid.NewGuid(), + eventId: Guid.NewGuid(), + transactionPosition: 100, + transactionOffset: 0, + eventStreamId: "stream", + eventStreamIdSize: null, + expectedVersion: 0, + timeStamp: DateTime.UtcNow, + flags: PrepareFlags.SingleWrite, + eventType: "event-type", + eventTypeSize: null, + data: new byte[] { 1, 2, 3 }, + metadata: new byte[] { 4, 5, 6 }, + prepareRecordVersion: version); + + var retry = record.CopyForRetry(logPosition: 200, transactionPosition: 200); + + Assert.Equal(version, retry.Version); + + var writer = new BufferWriterSlim(); + retry.WriteTo(ref writer); + + using var recordBuffer = writer.DetachOrCopyBuffer(); + var reader = new SequenceReader(new(recordBuffer.Memory)); + var parsed = Assert.IsType(LogRecord.ReadFrom(ref reader)); + + Assert.Equal(version, parsed.Version); + } +} diff --git a/src/EventStore.Core/TransactionLog/LogRecords/PrepareLogRecord.cs b/src/EventStore.Core/TransactionLog/LogRecords/PrepareLogRecord.cs index 85b30052f..2d0cdaaf1 100644 --- a/src/EventStore.Core/TransactionLog/LogRecords/PrepareLogRecord.cs +++ b/src/EventStore.Core/TransactionLog/LogRecords/PrepareLogRecord.cs @@ -240,7 +240,8 @@ public IPrepareLogRecord CopyForRetry(long logPosition, long transaction eventType: EventType, eventTypeSize: _eventTypeSize, data: _dataOnDisk, - metadata: Metadata); + metadata: Metadata, + prepareRecordVersion: Version); } public override void WriteTo(ref BufferWriterSlim writer)