diff options
| author | Martin Ridgers <[email protected]> | 2021-12-08 09:10:20 +0100 |
|---|---|---|
| committer | Martin Ridgers <[email protected]> | 2021-12-08 09:10:20 +0100 |
| commit | 3655347983570f17ecb1b0374f8a79501c0f870e (patch) | |
| tree | c6b9c52c403e6a1ceeb76f05a38f88375459bf47 | |
| parent | Merged main (diff) | |
| parent | Return status_code as ErrorCode from jupiter api if not successful (diff) | |
| download | zen-3655347983570f17ecb1b0374f8a79501c0f870e.tar.xz zen-3655347983570f17ecb1b0374f8a79501c0f870e.zip | |
Merged main
| -rw-r--r-- | zencore/include/zencore/iobuffer.h | 47 | ||||
| -rw-r--r-- | zencore/iobuffer.cpp | 55 | ||||
| -rw-r--r-- | zenhttp/httpasio.cpp | 12 | ||||
| -rw-r--r-- | zenserver/upstream/jupiter.cpp | 72 | ||||
| -rw-r--r-- | zenserver/upstream/upstreamapply.cpp | 58 |
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]) |