aboutsummaryrefslogtreecommitdiff
path: root/src/zenremotestore/projectstore/buildsremoteprojectstore.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zenremotestore/projectstore/buildsremoteprojectstore.cpp')
-rw-r--r--src/zenremotestore/projectstore/buildsremoteprojectstore.cpp316
1 files changed, 115 insertions, 201 deletions
diff --git a/src/zenremotestore/projectstore/buildsremoteprojectstore.cpp b/src/zenremotestore/projectstore/buildsremoteprojectstore.cpp
index a8e883dde..2282a31dd 100644
--- a/src/zenremotestore/projectstore/buildsremoteprojectstore.cpp
+++ b/src/zenremotestore/projectstore/buildsremoteprojectstore.cpp
@@ -7,8 +7,6 @@
#include <zencore/fmtutils.h>
#include <zencore/scopeguard.h>
-#include <zenhttp/httpclientauth.h>
-#include <zenremotestore/builds/buildstoragecache.h>
#include <zenremotestore/builds/buildstorageutil.h>
#include <zenremotestore/builds/jupiterbuildstorage.h>
#include <zenremotestore/operationlogoutput.h>
@@ -26,18 +24,14 @@ class BuildsRemoteStore : public RemoteProjectStore
public:
BuildsRemoteStore(LoggerRef InLog,
const HttpClientSettings& ClientSettings,
- HttpClientSettings* OptionalCacheClientSettings,
std::string_view HostUrl,
- std::string_view CacheUrl,
const std::filesystem::path& TempFilePath,
- WorkerThreadPool& CacheBackgroundWorkerPool,
std::string_view Namespace,
std::string_view Bucket,
const Oid& BuildId,
const IoBuffer& MetaData,
bool ForceDisableBlocks,
- bool ForceDisableTempBlocks,
- bool PopulateCache)
+ bool ForceDisableTempBlocks)
: m_Log(InLog)
, m_BuildStorageHttp(HostUrl, ClientSettings)
, m_BuildStorage(CreateJupiterBuildStorage(Log(),
@@ -53,20 +47,8 @@ public:
, m_MetaData(MetaData)
, m_EnableBlocks(!ForceDisableBlocks)
, m_UseTempBlocks(!ForceDisableTempBlocks)
- , m_PopulateCache(PopulateCache)
{
m_MetaData.MakeOwned();
- if (OptionalCacheClientSettings)
- {
- ZEN_ASSERT(!CacheUrl.empty());
- m_BuildCacheStorageHttp = std::make_unique<HttpClient>(CacheUrl, *OptionalCacheClientSettings);
- m_BuildCacheStorage = CreateZenBuildStorageCache(*m_BuildCacheStorageHttp,
- m_StorageCacheStats,
- Namespace,
- Bucket,
- TempFilePath,
- CacheBackgroundWorkerPool);
- }
}
virtual RemoteStoreInfo GetInfo() const override
@@ -75,9 +57,8 @@ public:
.UseTempBlockFiles = m_UseTempBlocks,
.AllowChunking = true,
.ContainerName = fmt::format("{}/{}/{}", m_Namespace, m_Bucket, m_BuildId),
- .Description = fmt::format("[cloud] {}{}. SessionId: {}. {}/{}/{}"sv,
+ .Description = fmt::format("[cloud] {}. SessionId: {}. {}/{}/{}"sv,
m_BuildStorageHttp.GetBaseUri(),
- m_BuildCacheStorage ? fmt::format(" (Cache: {})", m_BuildCacheStorageHttp->GetBaseUri()) : ""sv,
m_BuildStorageHttp.GetSessionId(),
m_Namespace,
m_Bucket,
@@ -86,15 +67,13 @@ public:
virtual Stats GetStats() const override
{
- return {
- .m_SentBytes = m_BuildStorageStats.TotalBytesWritten.load() + m_StorageCacheStats.TotalBytesWritten.load(),
- .m_ReceivedBytes = m_BuildStorageStats.TotalBytesRead.load() + m_StorageCacheStats.TotalBytesRead.load(),
- .m_RequestTimeNS = m_BuildStorageStats.TotalRequestTimeUs.load() * 1000 + m_StorageCacheStats.TotalRequestTimeUs.load() * 1000,
- .m_RequestCount = m_BuildStorageStats.TotalRequestCount.load() + m_StorageCacheStats.TotalRequestCount.load(),
- .m_PeakSentBytes = Max(m_BuildStorageStats.PeakSentBytes.load(), m_StorageCacheStats.PeakSentBytes.load()),
- .m_PeakReceivedBytes = Max(m_BuildStorageStats.PeakReceivedBytes.load(), m_StorageCacheStats.PeakReceivedBytes.load()),
- .m_PeakBytesPerSec = Max(m_BuildStorageStats.PeakBytesPerSec.load(), m_StorageCacheStats.PeakBytesPerSec.load()),
- };
+ return {.m_SentBytes = m_BuildStorageStats.TotalBytesWritten.load(),
+ .m_ReceivedBytes = m_BuildStorageStats.TotalBytesRead.load(),
+ .m_RequestTimeNS = m_BuildStorageStats.TotalRequestTimeUs.load() * 1000,
+ .m_RequestCount = m_BuildStorageStats.TotalRequestCount.load(),
+ .m_PeakSentBytes = m_BuildStorageStats.PeakSentBytes.load(),
+ .m_PeakReceivedBytes = m_BuildStorageStats.PeakReceivedBytes.load(),
+ .m_PeakBytesPerSec = m_BuildStorageStats.PeakBytesPerSec.load()};
}
virtual bool GetExtendedStats(ExtendedStats& OutStats) const override
@@ -109,11 +88,6 @@ public:
}
Result = true;
}
- if (m_BuildCacheStorage)
- {
- OutStats.m_ReceivedBytesPerSource.insert_or_assign("Cache", m_StorageCacheStats.TotalBytesRead);
- Result = true;
- }
return Result;
}
@@ -441,7 +415,7 @@ public:
catch (const HttpClientError& Ex)
{
Result.ErrorCode = MakeErrorCode(Ex);
- Result.Reason = fmt::format("Failed listing know blocks for {}/{}/{}/{}. Reason: '{}'",
+ Result.Reason = fmt::format("Failed listing known blocks for {}/{}/{}/{}. Reason: '{}'",
m_BuildStorageHttp.GetBaseUri(),
m_Namespace,
m_Bucket,
@@ -451,7 +425,7 @@ public:
catch (const std::exception& Ex)
{
Result.ErrorCode = gsl::narrow<int32_t>(HttpResponseCode::InternalServerError);
- Result.Reason = fmt::format("Failed listing know blocks for {}/{}/{}/{}. Reason: '{}'",
+ Result.Reason = fmt::format("Failed listing known blocks for {}/{}/{}/{}. Reason: '{}'",
m_BuildStorageHttp.GetBaseUri(),
m_Namespace,
m_Bucket,
@@ -462,6 +436,53 @@ public:
return Result;
}
+ virtual GetBlockDescriptionsResult GetBlockDescriptions(std::span<const IoHash> BlockHashes,
+ BuildStorageCache* OptionalCache,
+ const Oid& CacheBuildId) override
+ {
+ std::unique_ptr<OperationLogOutput> Output(CreateStandardLogOutput(Log()));
+
+ ZEN_ASSERT(m_OplogBuildPartId != Oid::Zero);
+ ZEN_ASSERT(OptionalCache == nullptr || CacheBuildId == m_BuildId);
+
+ GetBlockDescriptionsResult Result;
+ Stopwatch Timer;
+ auto _ = MakeGuard([&Timer, &Result]() { Result.ElapsedSeconds = Timer.GetElapsedTimeUs() / 1000000.0; });
+
+ try
+ {
+ Result.Blocks = zen::GetBlockDescriptions(*Output,
+ *m_BuildStorage,
+ OptionalCache,
+ m_BuildId,
+ BlockHashes,
+ /*AttemptFallback*/ false,
+ /*IsQuiet*/ false,
+ /*IsVerbose)*/ false);
+ }
+ catch (const HttpClientError& Ex)
+ {
+ Result.ErrorCode = MakeErrorCode(Ex);
+ Result.Reason = fmt::format("Failed listing known blocks for {}/{}/{}/{}. Reason: '{}'",
+ m_BuildStorageHttp.GetBaseUri(),
+ m_Namespace,
+ m_Bucket,
+ m_BuildId,
+ Ex.what());
+ }
+ catch (const std::exception& Ex)
+ {
+ Result.ErrorCode = gsl::narrow<int32_t>(HttpResponseCode::InternalServerError);
+ Result.Reason = fmt::format("Failed listing known blocks for {}/{}/{}/{}. Reason: '{}'",
+ m_BuildStorageHttp.GetBaseUri(),
+ m_Namespace,
+ m_Bucket,
+ m_BuildId,
+ Ex.what());
+ }
+ return Result;
+ }
+
virtual LoadAttachmentResult LoadAttachment(const IoHash& RawHash) override
{
ZEN_ASSERT(m_OplogBuildPartId != Oid::Zero);
@@ -472,44 +493,73 @@ public:
try
{
- if (m_BuildCacheStorage)
- {
- IoBuffer CachedBlob = m_BuildCacheStorage->GetBuildBlob(m_BuildId, RawHash);
- if (CachedBlob)
- {
- Result.Bytes = std::move(CachedBlob);
- }
- }
- if (!Result.Bytes)
+ Result.Bytes = m_BuildStorage->GetBuildBlob(m_BuildId, RawHash);
+ }
+ catch (const HttpClientError& Ex)
+ {
+ Result.ErrorCode = MakeErrorCode(Ex);
+ Result.Reason = fmt::format("Failed getting blob {}/{}/{}/{}/{}. Reason: '{}'",
+ m_BuildStorageHttp.GetBaseUri(),
+ m_Namespace,
+ m_Bucket,
+ m_BuildId,
+ RawHash,
+ Ex.what());
+ }
+ catch (const std::exception& Ex)
+ {
+ Result.ErrorCode = gsl::narrow<int32_t>(HttpResponseCode::InternalServerError);
+ Result.Reason = fmt::format("Failed getting blob {}/{}/{}/{}/{}. Reason: '{}'",
+ m_BuildStorageHttp.GetBaseUri(),
+ m_Namespace,
+ m_Bucket,
+ m_BuildId,
+ RawHash,
+ Ex.what());
+ }
+
+ return Result;
+ }
+
+ virtual LoadAttachmentRangesResult LoadAttachmentRanges(const IoHash& RawHash,
+ std::span<const std::pair<uint64_t, uint64_t>> Ranges) override
+ {
+ ZEN_ASSERT(!Ranges.empty());
+ LoadAttachmentRangesResult Result;
+ Stopwatch Timer;
+ auto _ = MakeGuard([&Timer, &Result]() { Result.ElapsedSeconds = Timer.GetElapsedTimeUs() / 1000000.0; });
+
+ try
+ {
+ BuildStorageBase::BuildBlobRanges BlobRanges = m_BuildStorage->GetBuildBlobRanges(m_BuildId, RawHash, Ranges);
+ if (BlobRanges.PayloadBuffer)
{
- Result.Bytes = m_BuildStorage->GetBuildBlob(m_BuildId, RawHash);
- if (m_BuildCacheStorage && Result.Bytes && m_PopulateCache)
- {
- m_BuildCacheStorage->PutBuildBlob(m_BuildId,
- RawHash,
- Result.Bytes.GetContentType(),
- CompositeBuffer(SharedBuffer(Result.Bytes)));
- }
+ Result.Bytes = std::move(BlobRanges.PayloadBuffer);
+ Result.Ranges = std::move(BlobRanges.Ranges);
}
}
catch (const HttpClientError& Ex)
{
Result.ErrorCode = MakeErrorCode(Ex);
- Result.Reason = fmt::format("Failed listing know blocks for {}/{}/{}/{}. Reason: '{}'",
+ Result.Reason = fmt::format("Failed getting {} ranges for blob {}/{}/{}/{}/{}. Reason: '{}'",
+ Ranges.size(),
m_BuildStorageHttp.GetBaseUri(),
m_Namespace,
m_Bucket,
m_BuildId,
+ RawHash,
Ex.what());
}
catch (const std::exception& Ex)
{
Result.ErrorCode = gsl::narrow<int32_t>(HttpResponseCode::InternalServerError);
- Result.Reason = fmt::format("Failed listing know blocks for {}/{}/{}/{}. Reason: '{}'",
+ Result.Reason = fmt::format("Failed getting {} ranges for blob {}/{}/{}/{}/{}. Reason: '{}'",
+ Ranges.size(),
m_BuildStorageHttp.GetBaseUri(),
m_Namespace,
m_Bucket,
m_BuildId,
+ RawHash,
Ex.what());
}
@@ -524,38 +574,6 @@ public:
std::vector<IoHash> AttachmentsLeftToFind = RawHashes;
- if (m_BuildCacheStorage)
- {
- std::vector<BuildStorageCache::BlobExistsResult> ExistCheck = m_BuildCacheStorage->BlobsExists(m_BuildId, RawHashes);
- if (ExistCheck.size() == RawHashes.size())
- {
- AttachmentsLeftToFind.clear();
- for (size_t BlobIndex = 0; BlobIndex < RawHashes.size(); BlobIndex++)
- {
- const IoHash& Hash = RawHashes[BlobIndex];
- const BuildStorageCache::BlobExistsResult& BlobExists = ExistCheck[BlobIndex];
- if (BlobExists.HasBody)
- {
- IoBuffer CachedPayload = m_BuildCacheStorage->GetBuildBlob(m_BuildId, Hash);
- if (CachedPayload)
- {
- Result.Chunks.emplace_back(
- std::pair<IoHash, CompressedBuffer>{Hash,
- CompressedBuffer::FromCompressedNoValidate(std::move(CachedPayload))});
- }
- else
- {
- AttachmentsLeftToFind.push_back(Hash);
- }
- }
- else
- {
- AttachmentsLeftToFind.push_back(Hash);
- }
- }
- }
- }
-
for (const IoHash& Hash : AttachmentsLeftToFind)
{
LoadAttachmentResult ChunkResult = LoadAttachment(Hash);
@@ -564,27 +582,12 @@ public:
return LoadAttachmentsResult{ChunkResult};
}
ZEN_DEBUG("Loaded attachment in {}", NiceTimeSpanMs(static_cast<uint64_t>(ChunkResult.ElapsedSeconds * 1000)));
- if (m_BuildCacheStorage && ChunkResult.Bytes && m_PopulateCache)
- {
- m_BuildCacheStorage->PutBuildBlob(m_BuildId,
- Hash,
- ChunkResult.Bytes.GetContentType(),
- CompositeBuffer(SharedBuffer(ChunkResult.Bytes)));
- }
Result.Chunks.emplace_back(
std::pair<IoHash, CompressedBuffer>{Hash, CompressedBuffer::FromCompressedNoValidate(std::move(ChunkResult.Bytes))});
}
return Result;
}
- virtual void Flush() override
- {
- if (m_BuildCacheStorage)
- {
- m_BuildCacheStorage->Flush(100, [](intptr_t) { return false; });
- }
- }
-
private:
static int MakeErrorCode(const HttpClientError& Ex)
{
@@ -601,10 +604,6 @@ private:
HttpClient m_BuildStorageHttp;
std::unique_ptr<BuildStorageBase> m_BuildStorage;
- BuildStorageCache::Statistics m_StorageCacheStats;
- std::unique_ptr<HttpClient> m_BuildCacheStorageHttp;
- std::unique_ptr<BuildStorageCache> m_BuildCacheStorage;
-
const std::string m_Namespace;
const std::string m_Bucket;
const Oid m_BuildId;
@@ -613,120 +612,35 @@ private:
const bool m_EnableBlocks = true;
const bool m_UseTempBlocks = true;
const bool m_AllowRedirect = false;
- const bool m_PopulateCache = true;
};
std::shared_ptr<RemoteProjectStore>
-CreateJupiterBuildsRemoteStore(LoggerRef InLog,
- const BuildsRemoteStoreOptions& Options,
- const std::filesystem::path& TempFilePath,
- bool Quiet,
- bool Unattended,
- bool Hidden,
- WorkerThreadPool& CacheBackgroundWorkerPool)
+CreateJupiterBuildsRemoteStore(LoggerRef InLog,
+ const BuildStorageResolveResult& ResolveResult,
+ std::function<HttpClientAccessToken()>&& TokenProvider,
+ const BuildsRemoteStoreOptions& Options,
+ const std::filesystem::path& TempFilePath)
{
- std::string Host = Options.Host;
- if (!Host.empty() && Host.find("://"sv) == std::string::npos)
- {
- // Assume https URL
- Host = fmt::format("https://{}"sv, Host);
- }
- std::string OverrideUrl = Options.OverrideHost;
- if (!OverrideUrl.empty() && OverrideUrl.find("://"sv) == std::string::npos)
- {
- // Assume https URL
- OverrideUrl = fmt::format("https://{}"sv, OverrideUrl);
- }
- std::string ZenHost = Options.ZenHost;
- if (!ZenHost.empty() && ZenHost.find("://"sv) == std::string::npos)
- {
- // Assume https URL
- ZenHost = fmt::format("https://{}"sv, ZenHost);
- }
-
- // 1) openid-provider if given (assumes oidctoken.exe -Zen true has been run with matching Options.OpenIdProvider
- // 2) Access token as parameter in request
- // 3) Environment variable (different win vs linux/mac)
- // 4) Default openid-provider (assumes oidctoken.exe -Zen true has been run with matching Options.OpenIdProvider
-
- std::function<HttpClientAccessToken()> TokenProvider;
- if (!Options.OpenIdProvider.empty())
- {
- TokenProvider = httpclientauth::CreateFromOpenIdProvider(Options.AuthManager, Options.OpenIdProvider);
- }
- else if (!Options.AccessToken.empty())
- {
- TokenProvider = httpclientauth::CreateFromStaticToken(Options.AccessToken);
- }
- else if (!Options.OidcExePath.empty())
- {
- if (auto TokenProviderMaybe = httpclientauth::CreateFromOidcTokenExecutable(Options.OidcExePath,
- Host.empty() ? OverrideUrl : Host,
- Quiet,
- Unattended,
- Hidden);
- TokenProviderMaybe)
- {
- TokenProvider = TokenProviderMaybe.value();
- }
- }
-
- if (!TokenProvider)
- {
- TokenProvider = httpclientauth::CreateFromDefaultOpenIdProvider(Options.AuthManager);
- }
-
- BuildStorageResolveResult ResolveRes;
- {
- HttpClientSettings ClientSettings{.LogCategory = "httpbuildsclient",
- .AccessTokenProvider = TokenProvider,
- .AssumeHttp2 = Options.AssumeHttp2,
- .AllowResume = true,
- .RetryCount = 2};
-
- std::unique_ptr<OperationLogOutput> Output(CreateStandardLogOutput(InLog));
-
- ResolveRes =
- ResolveBuildStorage(*Output, ClientSettings, Host, OverrideUrl, ZenHost, ZenCacheResolveMode::Discovery, /*Verbose*/ false);
- }
-
HttpClientSettings ClientSettings{.LogCategory = "httpbuildsclient",
.ConnectTimeout = std::chrono::milliseconds(3000),
.Timeout = std::chrono::milliseconds(1800000),
.AccessTokenProvider = std::move(TokenProvider),
- .AssumeHttp2 = ResolveRes.HostAssumeHttp2,
+ .AssumeHttp2 = ResolveResult.Cloud.AssumeHttp2,
.AllowResume = true,
.RetryCount = 4,
.MaximumInMemoryDownloadSize = Options.MaximumInMemoryDownloadSize};
- std::unique_ptr<HttpClientSettings> CacheClientSettings;
-
- if (!ResolveRes.CacheUrl.empty())
- {
- CacheClientSettings =
- std::make_unique<HttpClientSettings>(HttpClientSettings{.LogCategory = "httpcacheclient",
- .ConnectTimeout = std::chrono::milliseconds{3000},
- .Timeout = std::chrono::milliseconds{30000},
- .AssumeHttp2 = ResolveRes.CacheAssumeHttp2,
- .AllowResume = true,
- .RetryCount = 0,
- .MaximumInMemoryDownloadSize = Options.MaximumInMemoryDownloadSize});
- }
-
std::shared_ptr<RemoteProjectStore> RemoteStore = std::make_shared<BuildsRemoteStore>(InLog,
ClientSettings,
- CacheClientSettings.get(),
- ResolveRes.HostUrl,
- ResolveRes.CacheUrl,
+ ResolveResult.Cloud.Address,
TempFilePath,
- CacheBackgroundWorkerPool,
Options.Namespace,
Options.Bucket,
Options.BuildId,
Options.MetaData,
Options.ForceDisableBlocks,
- Options.ForceDisableTempBlocks,
- Options.PopulateCache);
+ Options.ForceDisableTempBlocks);
+
return RemoteStore;
}