save progress
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
// <copyright file="MergeResult.cs" company="StellaOps">
|
||||
// Copyright (c) StellaOps. Licensed under AGPL-3.0-or-later.
|
||||
// </copyright>
|
||||
|
||||
using StellaOps.HybridLogicalClock;
|
||||
|
||||
namespace StellaOps.AirGap.Sync.Models;
|
||||
|
||||
/// <summary>
|
||||
/// Result of merging job logs from multiple offline nodes.
|
||||
/// </summary>
|
||||
public sealed record MergeResult
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the merged entries in HLC total order.
|
||||
/// </summary>
|
||||
public required IReadOnlyList<MergedJobEntry> MergedEntries { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets duplicate entries that were dropped during merge.
|
||||
/// </summary>
|
||||
public required IReadOnlyList<DuplicateEntry> Duplicates { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the merged chain head (final link after merge).
|
||||
/// </summary>
|
||||
public byte[]? MergedChainHead { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the source node IDs that contributed to this merge.
|
||||
/// </summary>
|
||||
public required IReadOnlyList<string> SourceNodes { get; init; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A job entry after merge with unified chain link.
|
||||
/// </summary>
|
||||
public sealed class MergedJobEntry
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets the source node ID that created this entry.
|
||||
/// </summary>
|
||||
public required string SourceNodeId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the HLC timestamp.
|
||||
/// </summary>
|
||||
public required HlcTimestamp THlc { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the job ID.
|
||||
/// </summary>
|
||||
public required Guid JobId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the partition key.
|
||||
/// </summary>
|
||||
public string? PartitionKey { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the serialized payload.
|
||||
/// </summary>
|
||||
public required string Payload { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the payload hash.
|
||||
/// </summary>
|
||||
public required byte[] PayloadHash { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the original chain link from the source node.
|
||||
/// </summary>
|
||||
public required byte[] OriginalLink { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the merged chain link (computed during merge).
|
||||
/// </summary>
|
||||
public byte[]? MergedLink { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Represents a duplicate entry dropped during merge.
|
||||
/// </summary>
|
||||
public sealed record DuplicateEntry(
|
||||
Guid JobId,
|
||||
string NodeId,
|
||||
HlcTimestamp THlc);
|
||||
Reference in New Issue
Block a user