Files
2025-05-18 13:04:45 +08:00

119 lines
3.3 KiB
C#

// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using EpicGames.Horde.Storage;
namespace Jupiter.Implementation
{
public interface IReplicationLog
{
IAsyncEnumerable<NamespaceId> GetNamespacesAsync();
Task<(string, Guid)> InsertAddEventAsync(NamespaceId ns, BucketId bucket, RefId key, BlobId objectBlob, DateTime? timeBucket = null);
Task<(string, Guid)> InsertDeleteEventAsync(NamespaceId ns, BucketId bucket, RefId key, DateTime? timeBucket = null);
IAsyncEnumerable<ReplicationLogEvent> GetAsync(NamespaceId ns, string? lastBucket, Guid? lastEvent);
Task AddSnapshotAsync(SnapshotInfo snapshotHeader);
Task<SnapshotInfo?> GetLatestSnapshotAsync(NamespaceId ns);
IAsyncEnumerable<SnapshotInfo> GetSnapshotsAsync(NamespaceId ns);
Task UpdateReplicatorStateAsync(NamespaceId ns, string replicatorName, ReplicatorState newState);
Task<ReplicatorState?> GetReplicatorStateAsync(NamespaceId ns, string replicatorName);
Task<(string, Guid)> InsertAddBlobEventAsync(NamespaceId ns, BlobId objectBlob, DateTime? timeBucket = null, BucketId? bucketHint = null);
IAsyncEnumerable<BlobReplicationLogEvent> GetBlobEventsAsync(NamespaceId ns, string replicationBucket);
}
public class SnapshotInfo
{
[JsonConstructor]
public SnapshotInfo(NamespaceId snapshottedNamespace, NamespaceId blobNamespace, BlobId snapshotBlob, DateTime timestamp)
{
SnapshottedNamespace = snapshottedNamespace;
BlobNamespace = blobNamespace;
SnapshotBlob = snapshotBlob;
Timestamp = timestamp;
}
public NamespaceId SnapshottedNamespace { get; set; }
public NamespaceId BlobNamespace { get; set; }
public BlobId SnapshotBlob { get; set; }
public DateTime Timestamp { get; set; }
}
public class ReplicationLogEvent
{
[JsonConstructor]
public ReplicationLogEvent(NamespaceId @namespace, BucketId bucket, RefId key, BlobId? blob, Guid eventId, string timeBucket, DateTime timestamp, OpType op)
{
Namespace = @namespace;
Bucket = bucket;
Key = key;
Blob = blob;
EventId = eventId;
TimeBucket = timeBucket;
Timestamp = timestamp;
Op = op;
}
// these are serialized as ints so make sure to keep the value intact
public enum OpType
{
Added = 0,
Deleted = 1
};
public NamespaceId Namespace { get; }
public BucketId Bucket { get; }
public RefId Key { get; }
public OpType Op { get; }
public DateTime Timestamp { get; }
public string TimeBucket { get; }
public Guid EventId { get; }
public BlobId? Blob { get; }
}
public class BlobReplicationLogEvent
{
[JsonConstructor]
public BlobReplicationLogEvent(NamespaceId @namespace, BlobId blob, Guid eventId, string timeBucket, DateTime timestamp, OpType op, BucketId? bucketHint)
{
Namespace = @namespace;
Blob = blob;
EventId = eventId;
TimeBucket = timeBucket;
Timestamp = timestamp;
Op = op;
BucketHint = bucketHint;
}
public enum OpType
{
Added = 0,
Deleted = 1
};
public NamespaceId Namespace { get; }
public BlobId Blob { get; }
public OpType Op { get; }
public DateTime Timestamp { get; }
public string TimeBucket { get; }
public Guid EventId { get; }
public BucketId? BucketHint { get; }
}
public class IncrementalLogNotAvailableException : Exception
{
}
}