aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Ridgers <[email protected]>2021-12-08 09:10:20 +0100
committerMartin Ridgers <[email protected]>2021-12-08 09:10:20 +0100
commit3655347983570f17ecb1b0374f8a79501c0f870e (patch)
treec6b9c52c403e6a1ceeb76f05a38f88375459bf47
parentMerged main (diff)
parentReturn status_code as ErrorCode from jupiter api if not successful (diff)
downloadzen-3655347983570f17ecb1b0374f8a79501c0f870e.tar.xz
zen-3655347983570f17ecb1b0374f8a79501c0f870e.zip
Merged main
-rw-r--r--zencore/include/zencore/iobuffer.h47
-rw-r--r--zencore/iobuffer.cpp55
-rw-r--r--zenhttp/httpasio.cpp12
-rw-r--r--zenserver/upstream/jupiter.cpp72
-rw-r--r--zenserver/upstream/upstreamapply.cpp58
5 files changed, 159 insertions, 85 deletions
diff --git a/zencore/include/zencore/iobuffer.h b/zencore/include/zencore/iobuffer.h
index e1e8ee5a7..8b4288758 100644
--- a/zencore/include/zencore/iobuffer.h
+++ b/zencore/include/zencore/iobuffer.h
@@ -2,6 +2,7 @@
#pragma once
+#include <atomic>
#include <memory.h>
#include <zencore/memory.h>
#include "refcount.h"
@@ -111,39 +112,39 @@ public:
inline void EnsureDataValid() const
{
- if ((m_Flags & kIsExtended) && !(m_Flags & kIsMaterialized))
+ const uint32_t LocalFlags = m_Flags.load(std::memory_order_acquire);
+ if ((LocalFlags & kIsExtended) && !(LocalFlags & kIsMaterialized))
{
Materialize();
}
}
- inline bool IsOwnedByThis() const { return !!(m_Flags & kIsOwnedByThis); }
+ inline bool IsOwnedByThis() const { return !!(m_Flags.load(std::memory_order_relaxed) & kIsOwnedByThis); }
inline void SetIsOwnedByThis(bool NewState)
{
if (NewState)
{
- m_Flags |= kIsOwnedByThis;
+ m_Flags.fetch_or(kIsOwnedByThis, std::memory_order_relaxed);
}
else
{
- m_Flags &= ~kIsOwnedByThis;
+ m_Flags.fetch_and(~kIsOwnedByThis, std::memory_order_relaxed);
}
}
inline bool IsOwned() const
{
- bool ThisIsOwned = !!(m_Flags & kIsOwnedByThis);
- if (ThisIsOwned)
+ if (IsOwnedByThis())
{
return true;
}
return m_OuterCore && m_OuterCore->IsOwned();
}
- inline bool IsImmutable() const { return (m_Flags & kIsMutable) == 0; }
- inline bool IsWholeFile() const { return (m_Flags & kIsWholeFile) != 0; }
- inline bool IsNull() const { return (m_Flags & kIsNull) != 0; }
+ inline bool IsImmutable() const { return (m_Flags.load(std::memory_order_relaxed) & kIsMutable) == 0; }
+ inline bool IsWholeFile() const { return (m_Flags.load(std::memory_order_relaxed) & kIsWholeFile) != 0; }
+ inline bool IsNull() const { return (m_Flags.load(std::memory_order_relaxed) & kIsNull) != 0; }
inline IoBufferExtendedCore* ExtendedCore();
inline const IoBufferExtendedCore* ExtendedCore() const;
@@ -168,11 +169,11 @@ public:
{
if (!NewState)
{
- m_Flags |= kIsMutable;
+ m_Flags.fetch_or(kIsMutable, std::memory_order_relaxed);
}
else
{
- m_Flags &= ~kIsMutable;
+ m_Flags.fetch_and(~kIsMutable, std::memory_order_relaxed);
}
}
@@ -180,27 +181,35 @@ public:
{
if (NewState)
{
- m_Flags |= kIsWholeFile;
+ m_Flags.fetch_or(kIsWholeFile, std::memory_order_relaxed);
}
else
{
- m_Flags |= ~kIsWholeFile;
+ m_Flags.fetch_and(~kIsWholeFile, std::memory_order_relaxed);
}
}
inline void SetContentType(ZenContentType ContentType)
{
ZEN_ASSERT_SLOW((uint32_t(ContentType) & kContentTypeMask) == uint32_t(ContentType));
- m_Flags = (m_Flags & ~(kContentTypeMask << kContentTypeShift)) | (uint32_t(ContentType) << kContentTypeShift);
+ uint32_t OldValue = m_Flags.load(std::memory_order_relaxed);
+ uint32_t NewValue;
+ do
+ {
+ NewValue = (OldValue & ~(kContentTypeMask << kContentTypeShift)) | (uint32_t(ContentType) << kContentTypeShift);
+ } while (!m_Flags.compare_exchange_weak(OldValue, NewValue, std::memory_order_relaxed, std::memory_order_relaxed));
}
- inline ZenContentType GetContentType() const { return ZenContentType((m_Flags >> kContentTypeShift) & kContentTypeMask); }
+ inline ZenContentType GetContentType() const
+ {
+ return ZenContentType((m_Flags.load(std::memory_order_relaxed) >> kContentTypeShift) & kContentTypeMask);
+ }
inline uint32_t GetRefCount() const { return m_RefCount; }
protected:
uint32_t m_RefCount = 0;
- mutable uint32_t m_Flags = 0;
+ mutable std::atomic<uint32_t> m_Flags{0};
mutable const void* m_DataPtr = nullptr;
size_t m_DataBytes = 0;
RefPtr<const IoBufferCore> m_OuterCore;
@@ -213,7 +222,7 @@ protected:
static_assert((uint32_t(ZenContentType::kUnknownContentType) & ~kContentTypeMask) == 0);
- enum Flags
+ enum Flags : uint32_t
{
kIsNull = 1 << 0, // This is a null IoBuffer
kIsMutable = 1 << 1,
@@ -266,7 +275,7 @@ private:
inline IoBufferExtendedCore*
IoBufferCore::ExtendedCore()
{
- if (m_Flags & kIsExtended)
+ if (m_Flags.load(std::memory_order_relaxed) & kIsExtended)
{
return static_cast<IoBufferExtendedCore*>(this);
}
@@ -277,7 +286,7 @@ IoBufferCore::ExtendedCore()
inline const IoBufferExtendedCore*
IoBufferCore::ExtendedCore() const
{
- if (m_Flags & kIsExtended)
+ if (m_Flags.load(std::memory_order_relaxed) & kIsExtended)
{
return static_cast<const IoBufferExtendedCore*>(this);
}
diff --git a/zencore/iobuffer.cpp b/zencore/iobuffer.cpp
index fd652f580..656bbb705 100644
--- a/zencore/iobuffer.cpp
+++ b/zencore/iobuffer.cpp
@@ -39,7 +39,7 @@ IoBufferCore::AllocateBuffer(size_t InSize, size_t Alignment)
#if ZEN_PLATFORM_WINDOWS
if (((InSize & 0xffFF) == 0) && (Alignment == 0x10000))
{
- m_Flags |= kLowLevelAlloc;
+ m_Flags.fetch_or(kLowLevelAlloc, std::memory_order_relaxed);
m_DataPtr = VirtualAlloc(nullptr, InSize, MEM_COMMIT, PAGE_READWRITE);
return;
@@ -48,7 +48,7 @@ IoBufferCore::AllocateBuffer(size_t InSize, size_t Alignment)
#if ZEN_USE_MIMALLOC
void* Ptr = mi_aligned_alloc(Alignment, RoundUp(InSize, Alignment));
- m_Flags |= kIoBufferAlloc;
+ m_Flags.fetch_or(kIoBufferAlloc, std::memory_order_relaxed);
#else
void* Ptr = Memory::Alloc(InSize, Alignment);
#endif
@@ -66,8 +66,9 @@ IoBufferCore::FreeBuffer()
return;
}
+ const uint32_t LocalFlags = m_Flags.load(std::memory_order_relaxed);
#if ZEN_PLATFORM_WINDOWS
- if (m_Flags & kLowLevelAlloc)
+ if (LocalFlags & kLowLevelAlloc)
{
VirtualFree(const_cast<void*>(m_DataPtr), 0, MEM_DECOMMIT);
@@ -76,7 +77,7 @@ IoBufferCore::FreeBuffer()
#endif // ZEN_PLATFORM_WINDOWS
#if ZEN_USE_MIMALLOC
- if (m_Flags & kIoBufferAlloc)
+ if (LocalFlags & kIoBufferAlloc)
{
return mi_free(const_cast<void*>(m_DataPtr));
}
@@ -170,12 +171,13 @@ IoBufferExtendedCore::IoBufferExtendedCore(void* FileHandle, uint64_t Offset, ui
, m_FileHandle(FileHandle)
, m_FileOffset(Offset)
{
- m_Flags |= kIsOwnedByThis | kIsExtended;
+ uint32_t NewFlags = kIsOwnedByThis | kIsExtended;
if (TransferHandleOwnership)
{
- m_Flags |= kOwnsFile;
+ NewFlags |= kOwnsFile;
}
+ m_Flags.fetch_or(NewFlags, std::memory_order_relaxed);
}
IoBufferExtendedCore::IoBufferExtendedCore(const IoBufferExtendedCore* Outer, uint64_t Offset, uint64_t Size)
@@ -183,7 +185,7 @@ IoBufferExtendedCore::IoBufferExtendedCore(const IoBufferExtendedCore* Outer, ui
, m_FileHandle(Outer->m_FileHandle)
, m_FileOffset(Outer->m_FileOffset + Offset)
{
- m_Flags |= kIsOwnedByThis | kIsExtended;
+ m_Flags.fetch_or(kIsOwnedByThis | kIsExtended, std::memory_order_relaxed);
}
IoBufferExtendedCore::~IoBufferExtendedCore()
@@ -198,14 +200,15 @@ IoBufferExtendedCore::~IoBufferExtendedCore()
#endif
}
+ const uint32_t LocalFlags = m_Flags.load(std::memory_order_relaxed);
#if ZEN_PLATFORM_WINDOWS
- if (m_Flags & kOwnsMmap)
+ if (LocalFlags & kOwnsMmap)
{
CloseHandle(m_MmapHandle);
}
#endif
- if (m_Flags & kOwnsFile)
+ if (LocalFlags & kOwnsFile)
{
#if ZEN_PLATFORM_WINDOWS
BOOL Success = CloseHandle(m_FileHandle);
@@ -233,43 +236,46 @@ IoBufferExtendedCore::Materialize() const
// The synchronization scheme here is very primitive, if we end up with
// a lot of contention we can make it more fine-grained
- if (m_MmapHandle)
+ if (m_Flags.load(std::memory_order_acquire) & kIsMaterialized)
return;
RwLock::ExclusiveLockScope _(g_MappingLock);
// Someone could have gotten here first
- if (m_MmapHandle)
+ // We can use memory_order_relaxed on this load because the mutex has already provided the fence
+ if (m_Flags.load(std::memory_order_relaxed) & kIsMaterialized)
return;
+ uint32_t NewFlags = kIsMaterialized;
+
const uint64_t MapOffset = m_FileOffset & ~0xffffull;
const uint64_t MappedOffsetDisplacement = m_FileOffset - MapOffset;
const uint64_t MapSize = m_DataBytes + MappedOffsetDisplacement;
#if ZEN_PLATFORM_WINDOWS
- m_MmapHandle = CreateFileMapping(m_FileHandle,
- /* lpFileMappingAttributes */ nullptr,
- /* flProtect */ PAGE_READONLY,
- /* dwMaximumSizeLow */ 0,
- /* dwMaximumSizeHigh */ 0,
- /* lpName */ nullptr);
-
- if (m_MmapHandle == nullptr)
+ void* NewMmapHandle = CreateFileMapping(m_FileHandle,
+ /* lpFileMappingAttributes */ nullptr,
+ /* flProtect */ PAGE_READONLY,
+ /* dwMaximumSizeLow */ 0,
+ /* dwMaximumSizeHigh */ 0,
+ /* lpName */ nullptr);
+
+ if (NewMmapHandle == nullptr)
{
throw std::system_error(std::error_code(::GetLastError(), std::system_category()),
"CreateFileMapping failed on file '{}'"_format(zen::PathFromHandle(m_FileHandle)));
}
- m_Flags |= kOwnsMmap;
+ NewFlags |= kOwnsMmap;
- void* MappedBase = MapViewOfFile(m_MmapHandle,
+ void* MappedBase = MapViewOfFile(NewMmapHandle,
/* dwDesiredAccess */ FILE_MAP_READ,
/* FileOffsetHigh */ uint32_t(MapOffset >> 32),
/* FileOffsetLow */ uint32_t(MapOffset & 0xffFFffFFu),
/* dwNumberOfBytesToMap */ MapSize);
#else
- m_MmapHandle = (void*)uintptr_t(~MapSize); // ~ so it's never null (assuming MapSize >= 0)
- m_Flags |= kOwnsMmap;
+ NewMmapHandle = (void*)uintptr_t(~MapSize); // ~ so it's never null (assuming MapSize >= 0)
+ NewFlags |= kOwnsMmap;
void* MappedBase = mmap(
/* addr */ nullptr,
@@ -289,8 +295,9 @@ IoBufferExtendedCore::Materialize() const
m_MappedPointer = MappedBase;
m_DataPtr = reinterpret_cast<uint8_t*>(MappedBase) + MappedOffsetDisplacement;
+ m_MmapHandle = NewMmapHandle;
- m_Flags |= kIsMaterialized;
+ m_Flags.fetch_or(NewFlags, std::memory_order_release);
}
bool
diff --git a/zenhttp/httpasio.cpp b/zenhttp/httpasio.cpp
index 131c4513f..778a1ead9 100644
--- a/zenhttp/httpasio.cpp
+++ b/zenhttp/httpasio.cpp
@@ -502,7 +502,17 @@ HttpServerConnection::HandleRequest()
if (!HandlePackageOffers(*Service, Request, m_PackageHandler))
{
- Service->HandleRequest(Request);
+ try
+ {
+ Service->HandleRequest(Request);
+ }
+ catch (std::exception& ex)
+ {
+ ZEN_ERROR("Caught exception while handling request: '{}'", ex.what());
+
+ Request.WriteResponse(HttpResponseCode::InternalServerError, HttpContentType::kText, ex.what());
+ }
+
}
if (std::unique_ptr<HttpResponse> Response = std::move(Request.m_Response))
diff --git a/zenserver/upstream/jupiter.cpp b/zenserver/upstream/jupiter.cpp
index 177184591..0670c94cd 100644
--- a/zenserver/upstream/jupiter.cpp
+++ b/zenserver/upstream/jupiter.cpp
@@ -115,7 +115,11 @@ CloudCacheSession::GetDerivedData(std::string_view BucketId, std::string_view Ke
const bool Success = Response.status_code == 200;
const IoBuffer Buffer = Success ? IoBufferBuilder::MakeCloneFromMemory(Response.text.data(), Response.text.size()) : IoBuffer();
- return {.Response = Buffer, .Bytes = Response.downloaded_bytes, .ElapsedSeconds = Response.elapsed, .Success = Success};
+ return {.Response = Buffer,
+ .Bytes = Response.downloaded_bytes,
+ .ElapsedSeconds = Response.elapsed,
+ .ErrorCode = !Success ? Response.status_code : 0,
+ .Success = Success};
}
CloudCacheResult
@@ -160,7 +164,11 @@ CloudCacheSession::GetRef(std::string_view BucketId, const IoHash& Key, ZenConte
const bool Success = Response.status_code == 200;
const IoBuffer Buffer = Success ? IoBufferBuilder::MakeCloneFromMemory(Response.text.data(), Response.text.size()) : IoBuffer();
- return {.Response = Buffer, .Bytes = Response.downloaded_bytes, .ElapsedSeconds = Response.elapsed, .Success = Success};
+ return {.Response = Buffer,
+ .Bytes = Response.downloaded_bytes,
+ .ElapsedSeconds = Response.elapsed,
+ .ErrorCode = !Success ? Response.status_code : 0,
+ .Success = Success};
}
CloudCacheResult
@@ -197,7 +205,11 @@ CloudCacheSession::GetBlob(const IoHash& Key)
const IoBuffer Buffer =
Success && Response.text.size() > 0 ? IoBufferBuilder::MakeCloneFromMemory(Response.text.data(), Response.text.size()) : IoBuffer();
- return {.Response = Buffer, .Bytes = Response.downloaded_bytes, .ElapsedSeconds = Response.elapsed, .Success = Success};
+ return {.Response = Buffer,
+ .Bytes = Response.downloaded_bytes,
+ .ElapsedSeconds = Response.elapsed,
+ .ErrorCode = !Success ? Response.status_code : 0,
+ .Success = Success};
}
CloudCacheResult
@@ -233,7 +245,11 @@ CloudCacheSession::GetCompressedBlob(const IoHash& Key)
const bool Success = Response.status_code == 200;
const IoBuffer Buffer = Success ? IoBufferBuilder::MakeCloneFromMemory(Response.text.data(), Response.text.size()) : IoBuffer();
- return {.Response = Buffer, .Bytes = Response.downloaded_bytes, .ElapsedSeconds = Response.elapsed, .Success = Success};
+ return {.Response = Buffer,
+ .Bytes = Response.downloaded_bytes,
+ .ElapsedSeconds = Response.elapsed,
+ .ErrorCode = !Success ? Response.status_code : 0,
+ .Success = Success};
}
CloudCacheResult
@@ -269,7 +285,11 @@ CloudCacheSession::GetObject(const IoHash& Key)
const bool Success = Response.status_code == 200;
const IoBuffer Buffer = Success ? IoBufferBuilder::MakeCloneFromMemory(Response.text.data(), Response.text.size()) : IoBuffer();
- return {.Response = Buffer, .Bytes = Response.downloaded_bytes, .ElapsedSeconds = Response.elapsed, .Success = Success};
+ return {.Response = Buffer,
+ .Bytes = Response.downloaded_bytes,
+ .ElapsedSeconds = Response.elapsed,
+ .ErrorCode = !Success ? Response.status_code : 0,
+ .Success = Success};
}
CloudCacheResult
@@ -306,9 +326,12 @@ CloudCacheSession::PutDerivedData(std::string_view BucketId, std::string_view Ke
return {.ErrorCode = 401, .Reason = std::string("Invalid access token")};
}
+ const bool Success = Response.status_code == 200 || Response.status_code == 201;
+
return {.Bytes = Response.uploaded_bytes,
.ElapsedSeconds = Response.elapsed,
- .Success = (Response.status_code == 200 || Response.status_code == 201)};
+ .ErrorCode = !Success ? Response.status_code : 0,
+ .Success = Success};
}
CloudCacheResult
@@ -364,6 +387,7 @@ CloudCacheSession::PutRef(std::string_view BucketId, const IoHash& Key, IoBuffer
PutRefResult Result;
Result.Success = (Response.status_code == 200 || Response.status_code == 201);
+ Result.ErrorCode = !Result.Success ? Response.status_code : 0;
Result.Bytes = Response.uploaded_bytes;
Result.ElapsedSeconds = Response.elapsed;
@@ -428,6 +452,7 @@ CloudCacheSession::FinalizeRef(std::string_view BucketId, const IoHash& Key, con
FinalizeRefResult Result;
Result.Success = (Response.status_code == 200 || Response.status_code == 201);
+ Result.ErrorCode = !Result.Success ? Response.status_code : 0;
Result.Bytes = Response.uploaded_bytes;
Result.ElapsedSeconds = Response.elapsed;
@@ -478,9 +503,12 @@ CloudCacheSession::PutBlob(const IoHash& Key, IoBuffer Blob)
return {.ErrorCode = 401, .Reason = std::string("Invalid access token")};
}
+ const bool Success = Response.status_code == 200 || Response.status_code == 201;
+
return {.Bytes = Response.uploaded_bytes,
.ElapsedSeconds = Response.elapsed,
- .Success = (Response.status_code == 200 || Response.status_code == 201)};
+ .ErrorCode = !Success ? Response.status_code : 0,
+ .Success = Success};
}
CloudCacheResult
@@ -513,9 +541,12 @@ CloudCacheSession::PutCompressedBlob(const IoHash& Key, IoBuffer Blob)
return {.ErrorCode = 401, .Reason = std::string("Invalid access token")};
}
+ const bool Success = Response.status_code == 200 || Response.status_code == 201;
+
return {.Bytes = Response.uploaded_bytes,
.ElapsedSeconds = Response.elapsed,
- .Success = (Response.status_code == 200 || Response.status_code == 201)};
+ .ErrorCode = !Success ? Response.status_code : 0,
+ .Success = Success};
}
CloudCacheResult
@@ -548,9 +579,12 @@ CloudCacheSession::PutObject(const IoHash& Key, IoBuffer Object)
return {.ErrorCode = 401, .Reason = std::string("Invalid access token")};
}
+ const bool Success = Response.status_code == 200 || Response.status_code == 201;
+
return {.Bytes = Response.uploaded_bytes,
.ElapsedSeconds = Response.elapsed,
- .Success = (Response.status_code == 200 || Response.status_code == 201)};
+ .ErrorCode = !Success ? Response.status_code : 0,
+ .Success = Success};
}
CloudCacheResult
@@ -584,7 +618,9 @@ CloudCacheSession::RefExists(std::string_view BucketId, const IoHash& Key)
return {.ErrorCode = 401, .Reason = std::string("Invalid access token")};
}
- return {.ElapsedSeconds = Response.elapsed, .Success = Response.status_code == 200};
+ const bool Success = Response.status_code == 200;
+
+ return {.ElapsedSeconds = Response.elapsed, .ErrorCode = !Success ? Response.status_code : 0, .Success = Success};
}
CloudCacheResult
@@ -653,7 +689,9 @@ CloudCacheSession::PostComputeTasks(std::string_view ChannelId, IoBuffer TasksDa
return {.ErrorCode = 401, .Reason = std::string("Invalid access token")};
}
- return {.ElapsedSeconds = Response.elapsed, .Success = Response.status_code == 200};
+ const bool Success = Response.status_code == 200;
+
+ return {.ElapsedSeconds = Response.elapsed, .ErrorCode = !Success ? Response.status_code : 0, .Success = Success};
}
CloudCacheResult
@@ -689,7 +727,11 @@ CloudCacheSession::GetComputeUpdates(std::string_view ChannelId, const uint32_t
const bool Success = Response.status_code == 200;
const IoBuffer Buffer = Success ? IoBufferBuilder::MakeCloneFromMemory(Response.text.data(), Response.text.size()) : IoBuffer();
- return {.Response = Buffer, .Bytes = Response.downloaded_bytes, .ElapsedSeconds = Response.elapsed, .Success = Success};
+ return {.Response = Buffer,
+ .Bytes = Response.downloaded_bytes,
+ .ElapsedSeconds = Response.elapsed,
+ .ErrorCode = !Success ? Response.status_code : 0,
+ .Success = Success};
}
CloudCacheResult
@@ -725,7 +767,11 @@ CloudCacheSession::GetObjectTree(const IoHash& Key)
const bool Success = Response.status_code == 200;
const IoBuffer Buffer = Success ? IoBufferBuilder::MakeCloneFromMemory(Response.text.data(), Response.text.size()) : IoBuffer();
- return {.Response = Buffer, .Bytes = Response.downloaded_bytes, .ElapsedSeconds = Response.elapsed, .Success = Success};
+ return {.Response = Buffer,
+ .Bytes = Response.downloaded_bytes,
+ .ElapsedSeconds = Response.elapsed,
+ .ErrorCode = !Success ? Response.status_code : 0,
+ .Success = Success};
}
std::vector<IoHash>
diff --git a/zenserver/upstream/upstreamapply.cpp b/zenserver/upstream/upstreamapply.cpp
index 2b805fe14..f673ec3b3 100644
--- a/zenserver/upstream/upstreamapply.cpp
+++ b/zenserver/upstream/upstreamapply.cpp
@@ -115,7 +115,8 @@ namespace detail {
ElapsedSeconds += Result.ElapsedSeconds;
if (!Result.Success)
{
- return {.Error{.ErrorCode = Result.ErrorCode, .Reason = std::move(Result.Reason)},
+ return {.Error{.ErrorCode = Result.ErrorCode ? Result.ErrorCode : -1,
+ .Reason = !Result.Reason.empty() ? std::move(Result.Reason) : "Failed to upload blobs"},
.Bytes = Bytes,
.ElapsedSeconds = ElapsedSeconds};
}
@@ -128,7 +129,8 @@ namespace detail {
ElapsedSeconds += Result.ElapsedSeconds;
if (!Result.Success)
{
- return {.Error{.ErrorCode = Result.ErrorCode, .Reason = std::move(Result.Reason)},
+ return {.Error{.ErrorCode = Result.ErrorCode ? Result.ErrorCode : -1,
+ .Reason = !Result.Reason.empty() ? std::move(Result.Reason) : "Failed to upload objects"},
.Bytes = Bytes,
.ElapsedSeconds = ElapsedSeconds};
}
@@ -152,7 +154,8 @@ namespace detail {
m_PendingTasks.erase(UpstreamData.TaskId);
}
- return {.Error{.ErrorCode = Result.ErrorCode, .Reason = std::move(Result.Reason)},
+ return {.Error{.ErrorCode = Result.ErrorCode ? Result.ErrorCode : -1,
+ .Reason = !Result.Reason.empty() ? std::move(Result.Reason) : "Failed to post compute task"},
.Bytes = Bytes,
.ElapsedSeconds = ElapsedSeconds};
}
@@ -185,12 +188,12 @@ namespace detail {
CloudCacheExistsResult ExistsResult = Session.BlobExists(Keys);
ElapsedSeconds += ExistsResult.ElapsedSeconds;
- if (ExistsResult.ErrorCode != 0)
+ if (!ExistsResult.Success)
{
return {.Bytes = Bytes,
.ElapsedSeconds = ElapsedSeconds,
- .ErrorCode = ExistsResult.ErrorCode,
- .Reason = std::move(ExistsResult.Reason)};
+ .ErrorCode = ExistsResult.ErrorCode ? ExistsResult.ErrorCode : -1,
+ .Reason = !ExistsResult.Reason.empty() ? std::move(ExistsResult.Reason) : "Failed to check if blobs exist"};
}
// TODO: Batch upload missing blobs
@@ -209,8 +212,8 @@ namespace detail {
{
return {.Bytes = Bytes,
.ElapsedSeconds = ElapsedSeconds,
- .ErrorCode = Result.ErrorCode,
- .Reason = std::move(Result.Reason)};
+ .ErrorCode = ExistsResult.ErrorCode ? ExistsResult.ErrorCode : -1,
+ .Reason = !ExistsResult.Reason.empty() ? std::move(ExistsResult.Reason) : "Failed to put blobs"};
}
}
@@ -236,12 +239,12 @@ namespace detail {
CloudCacheExistsResult ExistsResult = Session.ObjectExists(Keys);
ElapsedSeconds += ExistsResult.ElapsedSeconds;
- if (ExistsResult.ErrorCode != 0)
+ if (!ExistsResult.Success)
{
return {.Bytes = Bytes,
.ElapsedSeconds = ElapsedSeconds,
- .ErrorCode = ExistsResult.ErrorCode,
- .Reason = std::move(ExistsResult.Reason)};
+ .ErrorCode = ExistsResult.ErrorCode ? ExistsResult.ErrorCode : -1,
+ .Reason = !ExistsResult.Reason.empty() ? std::move(ExistsResult.Reason) : "Failed to check if objects exist"};
}
// TODO: Batch upload missing objects
@@ -260,8 +263,8 @@ namespace detail {
{
return {.Bytes = Bytes,
.ElapsedSeconds = ElapsedSeconds,
- .ErrorCode = Result.ErrorCode,
- .Reason = std::move(Result.Reason)};
+ .ErrorCode = ExistsResult.ErrorCode ? ExistsResult.ErrorCode : -1,
+ .Reason = !ExistsResult.Reason.empty() ? std::move(ExistsResult.Reason) : "Failed to put objects"};
}
}
@@ -330,7 +333,7 @@ namespace detail {
CloudCacheResult UpdatesResult = Session.GetComputeUpdates(m_ChannelId);
Bytes += UpdatesResult.Bytes;
ElapsedSeconds += UpdatesResult.ElapsedSeconds;
- if (UpdatesResult.ErrorCode != 0)
+ if (!UpdatesResult.Success)
{
return {.Error{.ErrorCode = UpdatesResult.ErrorCode, .Reason = std::move(UpdatesResult.Reason)},
.Bytes = Bytes,
@@ -463,13 +466,6 @@ namespace detail {
Bytes += ObjectTreeResult.Bytes;
ElapsedSeconds += ObjectTreeResult.ElapsedSeconds;
- if (ObjectTreeResult.ErrorCode != 0)
- {
- return {.Error{.ErrorCode = ObjectTreeResult.ErrorCode, .Reason = std::move(ObjectTreeResult.Reason)},
- .Bytes = Bytes,
- .ElapsedSeconds = ElapsedSeconds};
- }
-
if (!ObjectTreeResult.Success)
{
return {.Error{.ErrorCode = -1, .Reason = "Failed to get result object data"},
@@ -516,7 +512,7 @@ namespace detail {
CloudCacheResult ObjectResult = Session.GetObject(It.first);
Bytes += ObjectTreeResult.Bytes;
ElapsedSeconds += ObjectTreeResult.ElapsedSeconds;
- if (ObjectTreeResult.ErrorCode != 0)
+ if (!ObjectTreeResult.Success)
{
return {.Error{.ErrorCode = ObjectResult.ErrorCode, .Reason = std::move(ObjectResult.Reason)},
.Bytes = Bytes,
@@ -540,7 +536,7 @@ namespace detail {
CloudCacheResult BlobResult = Session.GetBlob(It.first);
Bytes += ObjectTreeResult.Bytes;
ElapsedSeconds += ObjectTreeResult.ElapsedSeconds;
- if (BlobResult.ErrorCode != 0)
+ if (!BlobResult.Success)
{
return {.Error{.ErrorCode = BlobResult.ErrorCode, .Reason = std::move(BlobResult.Reason)},
.Bytes = Bytes,
@@ -595,7 +591,9 @@ namespace detail {
{
return {.Error{.ErrorCode = ExitCode, .Reason = "Build.output file not found in task results"},
.Bytes = Bytes,
- .ElapsedSeconds = ElapsedSeconds};
+ .ElapsedSeconds = ElapsedSeconds,
+ .StdOut = std::move(StdOut),
+ .StdErr = std::move(StdErr)};
}
// Get Output directory node
@@ -614,7 +612,9 @@ namespace detail {
{
return {.Error{.ErrorCode = ExitCode, .Reason = "Outputs directory not found in task results"},
.Bytes = Bytes,
- .ElapsedSeconds = ElapsedSeconds};
+ .ElapsedSeconds = ElapsedSeconds,
+ .StdOut = std::move(StdOut),
+ .StdErr = std::move(StdErr)};
}
// load build.output as CbObject
@@ -689,7 +689,9 @@ namespace detail {
{
return {.Error{.ErrorCode = -1, .Reason = "Failed to get result object attachment data"},
.Bytes = Bytes,
- .ElapsedSeconds = ElapsedSeconds};
+ .ElapsedSeconds = ElapsedSeconds,
+ .StdOut = std::move(StdOut),
+ .StdErr = std::move(StdErr)};
}
OutputPackage.SetObject(BuildOutputObject);
@@ -749,8 +751,8 @@ namespace detail {
std::string_view Directory = It.AsString();
std::string DummyFile = "{}/.zen_empty_file"_format(Directory);
InputFiles.insert(DummyFile);
- Data.Blobs[EmptyBufferId] = EmptyBuffer;
- InputFileHashes[DummyFile] = EmptyBufferId;
+ Data.Blobs[EmptyBufferId] = EmptyBuffer;
+ InputFileHashes[DummyFile] = EmptyBufferId;
}
for (auto& It : ApplyRecord.WorkerDescriptor["environment"sv])