// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include #include "projectstore.h" #include #include namespace zen { class CidStore; class WorkerThreadPool; struct ChunkedInfo; class RemoteProjectStore { public: struct Result { int32_t ErrorCode{}; double ElapsedSeconds{}; std::string Reason; std::string Text; }; struct CreateContainerResult : public Result { }; struct SaveResult : public Result { std::unordered_set Needs; IoHash RawHash; }; struct FinalizeResult : public Result { std::unordered_set Needs; }; struct SaveAttachmentResult : public Result { }; struct SaveAttachmentsResult : public Result { }; struct LoadAttachmentResult : public Result { IoBuffer Bytes; }; struct LoadContainerResult : public Result { CbObject ContainerObject; }; struct LoadAttachmentsResult : public Result { std::vector> Chunks; }; struct GetKnownBlocksResult : public Result { std::vector Blocks; }; struct RemoteStoreInfo { bool CreateBlocks; bool UseTempBlockFiles; bool AllowChunking; std::string ContainerName; std::string Description; }; struct Stats { std::uint64_t m_SentBytes; std::uint64_t m_ReceivedBytes; std::uint64_t m_RequestTimeNS; std::uint64_t m_RequestCount; std::uint64_t m_PeakSentBytes; std::uint64_t m_PeakReceivedBytes; std::uint64_t m_PeakBytesPerSec; }; RemoteProjectStore(); virtual ~RemoteProjectStore(); virtual RemoteStoreInfo GetInfo() const = 0; virtual Stats GetStats() const = 0; virtual CreateContainerResult CreateContainer() = 0; virtual SaveResult SaveContainer(const IoBuffer& Payload) = 0; virtual SaveAttachmentResult SaveAttachment(const CompositeBuffer& Payload, const IoHash& RawHash, ChunkBlockDescription&& Block) = 0; virtual FinalizeResult FinalizeContainer(const IoHash& RawHash) = 0; virtual SaveAttachmentsResult SaveAttachments(const std::vector& Payloads) = 0; virtual LoadContainerResult LoadContainer() = 0; virtual GetKnownBlocksResult GetKnownBlocks() = 0; virtual LoadAttachmentResult LoadAttachment(const IoHash& RawHash) = 0; virtual LoadAttachmentsResult LoadAttachments(const std::vector& RawHashes) = 0; }; struct RemoteStoreOptions { static const size_t DefaultMaxBlockSize = 64u * 1024u * 1024u; static const size_t DefaultMaxChunkEmbedSize = 3u * 512u * 1024u; static const size_t DefaultChunkFileSizeLimit = 256u * 1024u * 1024u; size_t MaxBlockSize = DefaultMaxBlockSize; size_t MaxChunkEmbedSize = DefaultMaxChunkEmbedSize; size_t ChunkFileSizeLimit = DefaultChunkFileSizeLimit; }; typedef std::function TGetAttachmentBufferFunc; RemoteProjectStore::LoadContainerResult BuildContainer( CidStore& ChunkStore, ProjectStore::Project& Project, ProjectStore::Oplog& Oplog, size_t MaxBlockSize, size_t MaxChunkEmbedSize, size_t ChunkFileSizeLimit, bool BuildBlocks, bool IgnoreMissingAttachments, bool AllowChunking, const std::function& AsyncOnBlock, const std::function& OnLargeAttachment, const std::function>&&)>& OnBlockChunks, bool EmbedLooseFiles); class JobContext; RemoteProjectStore::Result SaveOplogContainer(ProjectStore::Oplog& Oplog, const CbObject& ContainerObject, const std::function RawHashes)>& OnReferencedAttachments, const std::function& HasAttachment, const std::function&& Chunks)>& OnNeedBlock, const std::function& OnNeedAttachment, const std::function& OnChunkedAttachment, JobContext* OptionalContext); RemoteProjectStore::Result SaveOplog(CidStore& ChunkStore, RemoteProjectStore& RemoteStore, ProjectStore::Project& Project, ProjectStore::Oplog& Oplog, size_t MaxBlockSize, size_t MaxChunkEmbedSize, size_t ChunkFileSizeLimit, bool EmbedLooseFiles, bool ForceUpload, bool IgnoreMissingAttachments, JobContext* OptionalContext); RemoteProjectStore::Result LoadOplog(CidStore& ChunkStore, RemoteProjectStore& RemoteStore, ProjectStore::Oplog& Oplog, bool ForceDownload, bool IgnoreMissingAttachments, bool CleanOplog, JobContext* OptionalContext); std::vector GetBlockHashesFromOplog(CbObjectView ContainerObject); std::vector GetBlocksFromOplog(CbObjectView ContainerObject, std::span IncludeBlockHashes); } // namespace zen