Files
UnrealEngine/Engine/Source/Programs/UnrealCloudDDC/Jupiter/Implementation/Blob/IBlobIndex.cs
2025-05-18 13:04:45 +08:00

120 lines
4.0 KiB
C#

// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using EpicGames.Horde.Storage;
namespace Jupiter.Implementation.Blob
{
public class BucketStats
{
public NamespaceId Namespace { get; set; }
public BucketId Bucket { get; set; }
public long CountOfRefs { get; set; }
public long CountOfBlobs { get; set; }
public long TotalSize { get; set; }
public double AvgSize { get; set; }
public long LargestBlob { get; set; }
public long SmallestBlobFound { get; set; }
}
public interface IBlobIndex
{
Task AddBlobToIndexAsync(NamespaceId ns, BlobId id, string? region = null, CancellationToken cancellationToken = default);
Task RemoveBlobFromRegionAsync(NamespaceId ns, BlobId id, string? region = null, CancellationToken cancellationToken = default);
Task RemoveBlobFromAllRegionsAsync(NamespaceId ns, BlobId id, CancellationToken cancellationToken = default);
Task<bool> BlobExistsInRegionAsync(NamespaceId ns, BlobId blobIdentifier, string? region = null, CancellationToken cancellationToken = default);
IAsyncEnumerable<(NamespaceId, BlobId)> GetAllBlobsAsync(CancellationToken cancellationToken = default);
IAsyncEnumerable<(NamespaceId, BaseBlobReference)> GetAllBlobReferencesAsync(CancellationToken cancellationToken = default);
IAsyncEnumerable<BaseBlobReference> GetBlobReferencesAsync(NamespaceId ns, BlobId id, CancellationToken cancellationToken = default);
Task AddRefToBlobsAsync(NamespaceId ns, BucketId bucket, RefId key, BlobId[] blobs, CancellationToken cancellationToken = default);
Task RemoveReferencesAsync(NamespaceId ns, BlobId id, List<BaseBlobReference>? referencesToRemove, CancellationToken cancellationToken = default);
Task<List<string>> GetBlobRegionsAsync(NamespaceId ns, BlobId blob, CancellationToken cancellationToken = default);
Task AddBlobReferencesAsync(NamespaceId ns, BlobId blob, BlobId blobThatReferences, CancellationToken cancellationToken = default);
Task AddBlobToBucketListAsync(NamespaceId ns, BucketId bucket, RefId key, BlobId blobId, long blobSize, CancellationToken cancellationToken = default);
Task RemoveBlobFromBucketListAsync(NamespaceId ns, BucketId bucket, RefId key, List<BlobId> blobIds, CancellationToken cancellationToken = default);
Task<BucketStats> CalculateBucketStatisticsAsync(NamespaceId ns, BucketId bucket, CancellationToken cancellationToken = default);
}
public abstract class BaseBlobReference : IEquatable<BaseBlobReference>
{
protected BaseBlobReference(BlobId sourceBlob)
{
SourceBlob = sourceBlob;
}
public BlobId SourceBlob { get; init; }
public override bool Equals(object? o)
{
if (o is BaseBlobReference baseBlob)
{
return Equals(baseBlob);
}
return false;
}
public override int GetHashCode()
{
return SourceBlob.GetHashCode();
}
public virtual bool Equals(BaseBlobReference? other)
{
if (other != null && other.SourceBlob.Equals(SourceBlob))
{
return true;
}
return false;
}
}
public class RefBlobReference : BaseBlobReference
{
public RefBlobReference(BlobId sourceBlob, BucketId bucket, RefId key) : base(sourceBlob)
{
Bucket = bucket;
Key = key;
}
public BucketId Bucket { get; set; }
public RefId Key { get; set; }
public override bool Equals(BaseBlobReference? other)
{
if (other is RefBlobReference otherRefBlob)
{
return otherRefBlob.Key.Equals(Key) && otherRefBlob.Bucket.Equals(Bucket) && otherRefBlob.SourceBlob.Equals(SourceBlob);
}
return false;
}
}
public class BlobToBlobReference : BaseBlobReference
{
public BlobToBlobReference(BlobId sourceBlob, BlobId blob) : base(sourceBlob)
{
Blob = blob;
}
public BlobId Blob { get; set; }
public override bool Equals(BaseBlobReference? other)
{
if (other is BlobToBlobReference otherBlobToBlob)
{
return otherBlobToBlob.Blob.Equals(Blob) && otherBlobToBlob.SourceBlob.Equals(SourceBlob);
}
return false;
}
}
}