88 lines
2.3 KiB
C#
88 lines
2.3 KiB
C#
// <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);
|