diff options
Diffstat (limited to 'zenserver')
| -rw-r--r-- | zenserver/compute/apply.cpp | 31 | ||||
| -rw-r--r-- | zenserver/compute/apply.h | 2 | ||||
| -rw-r--r-- | zenserver/config.cpp | 33 | ||||
| -rw-r--r-- | zenserver/upstream/upstreamapply.cpp | 28 | ||||
| -rw-r--r-- | zenserver/xmake.lua | 1 | ||||
| -rw-r--r-- | zenserver/zenserver.vcxproj | 2 |
6 files changed, 73 insertions, 24 deletions
diff --git a/zenserver/compute/apply.cpp b/zenserver/compute/apply.cpp index 1db3fe631..ddf7ad36c 100644 --- a/zenserver/compute/apply.cpp +++ b/zenserver/compute/apply.cpp @@ -593,9 +593,13 @@ HttpFunctionService::HttpFunctionService(CasStore& Store, CidStore& InCidStore, if (NeedList.empty()) { // We already have everything + CbObject Output; + HttpResponseCode ResponseCode = ExecActionUpstream(Worker, RequestObject, Output); - CbObject Output = ExecActionUpstream(Worker, RequestObject); - + if (ResponseCode != HttpResponseCode::OK) + { + return HttpReq.WriteResponse(ResponseCode); + } return HttpReq.WriteResponse(HttpResponseCode::OK, Output); } @@ -655,8 +659,13 @@ HttpFunctionService::HttpFunctionService(CasStore& Store, CidStore& InCidStore, zen::NiceBytes(TotalNewBytes), NewAttachmentCount); - CbObject Output = ExecActionUpstream(Worker, ActionObj); + CbObject Output; + HttpResponseCode ResponseCode = ExecActionUpstream(Worker, ActionObj, Output); + if (ResponseCode != HttpResponseCode::OK) + { + return HttpReq.WriteResponse(ResponseCode); + } return HttpReq.WriteResponse(HttpResponseCode::OK, Output); } break; @@ -904,8 +913,8 @@ HttpFunctionService::ExecAction(const WorkerDesc& Worker, CbObject Action) return OutputPackage; } -CbObject -HttpFunctionService::ExecActionUpstream(const WorkerDesc& Worker, CbObject Action) +HttpResponseCode +HttpFunctionService::ExecActionUpstream(const WorkerDesc& Worker, CbObject Action, CbObject& Object) { const IoHash WorkerId = Worker.Descriptor.GetHash(); const IoHash ActionId = Action.GetHash(); @@ -918,14 +927,19 @@ HttpFunctionService::ExecActionUpstream(const WorkerDesc& Worker, CbObject Actio if (!EnqueueResult.Success) { - throw std::runtime_error("Error enqueuing upstream task"); + ZEN_ERROR( + "Error enqueuing upstream Action {}/{}", + WorkerId.ToHexString(), + ActionId.ToHexString()); + return HttpResponseCode::InternalServerError; } CbObjectWriter Writer; Writer.AddHash("worker", WorkerId); Writer.AddHash("action", ActionId); - return std::move(Writer.Save()); + Object = std::move(Writer.Save()); + return HttpResponseCode::OK; } HttpResponseCode @@ -955,8 +969,7 @@ HttpFunctionService::ExecActionUpstreamResult(const IoHash& WorkerId, const IoHa Completed.Error.Reason, Completed.Error.ErrorCode); - throw std::runtime_error( - "Action {}/{} failed"_format(WorkerId.ToHexString(), ActionId.ToHexString()).c_str()); + return HttpResponseCode::InternalServerError; } ZEN_INFO("Action {}/{} completed with {} attachments ({} compressed, {} uncompressed)", diff --git a/zenserver/compute/apply.h b/zenserver/compute/apply.h index a3e36819d..af8668ee2 100644 --- a/zenserver/compute/apply.h +++ b/zenserver/compute/apply.h @@ -54,7 +54,7 @@ private: [[nodiscard]] std::filesystem::path CreateNewSandbox(); [[nodiscard]] CbPackage ExecAction(const WorkerDesc& Worker, CbObject Action); - [[nodiscard]] CbObject ExecActionUpstream(const WorkerDesc& Worker, CbObject Action); + [[nodiscard]] HttpResponseCode ExecActionUpstream(const WorkerDesc& Worker, CbObject Action, CbObject& Object); [[nodiscard]] HttpResponseCode ExecActionUpstreamResult(const IoHash& WorkerId, const IoHash& ActionId, CbPackage& Package); RwLock m_WorkerLock; diff --git a/zenserver/config.cpp b/zenserver/config.cpp index 84eb4ae75..354df7b25 100644 --- a/zenserver/config.cpp +++ b/zenserver/config.cpp @@ -47,6 +47,39 @@ PickDefaultStateDirectory() return myDocumentsDir; } + int CandidateDriveLetterOffset = -1; + ULARGE_INTEGER CandidateDriveSize; + CandidateDriveSize.QuadPart = 0L; + DWORD LogicalDrives = GetLogicalDrives(); + char CandidateDriveName[] = "A:\\"; + for (int DriveLetterOffset = 0; DriveLetterOffset < 32; ++DriveLetterOffset) + { + if ((LogicalDrives & (1 << DriveLetterOffset)) != 0) + { + CandidateDriveName[0] = (char)('A' + DriveLetterOffset); + if (GetDriveTypeA(CandidateDriveName) == DRIVE_FIXED) + { + ULARGE_INTEGER FreeBytesAvailableToCaller; + ULARGE_INTEGER TotalNumberOfBytes; + if (0 != GetDiskFreeSpaceExA(CandidateDriveName, &FreeBytesAvailableToCaller, &TotalNumberOfBytes, nullptr)) + { + if ((FreeBytesAvailableToCaller.QuadPart > 0) && (TotalNumberOfBytes.QuadPart > CandidateDriveSize.QuadPart)) + { + CandidateDriveLetterOffset = DriveLetterOffset; + CandidateDriveSize = TotalNumberOfBytes; + } + } + } + } + } + + if (CandidateDriveLetterOffset >= 0) + { + char RootZenFolderName[] = "A:\\zen"; + RootZenFolderName[0] = (char)('A' + CandidateDriveLetterOffset); + return RootZenFolderName; + } + return L""; } diff --git a/zenserver/upstream/upstreamapply.cpp b/zenserver/upstream/upstreamapply.cpp index 6ff5c5da2..2b805fe14 100644 --- a/zenserver/upstream/upstreamapply.cpp +++ b/zenserver/upstream/upstreamapply.cpp @@ -40,6 +40,9 @@ namespace zen { using namespace std::literals; +static const IoBuffer EmptyBuffer; +static const IoHash EmptyBufferId = IoHash::HashBuffer(EmptyBuffer); + namespace detail { class HordeUpstreamApplyEndpoint final : public UpstreamApplyEndpoint @@ -708,6 +711,8 @@ namespace detail { [[nodiscard]] bool ProcessApplyKey(const UpstreamApplyRecord& ApplyRecord, UpstreamData& Data) { + using namespace fmt::literals; + std::string ExecutablePath; std::map<std::string, std::string> Environment; std::set<std::filesystem::path> InputFiles; @@ -739,6 +744,15 @@ namespace detail { } } + for (auto& It : ApplyRecord.WorkerDescriptor["dirs"sv]) + { + std::string_view Directory = It.AsString(); + std::string DummyFile = "{}/.zen_empty_file"_format(Directory); + InputFiles.insert(DummyFile); + Data.Blobs[EmptyBufferId] = EmptyBuffer; + InputFileHashes[DummyFile] = EmptyBufferId; + } + for (auto& It : ApplyRecord.WorkerDescriptor["environment"sv]) { std::string_view Env = It.AsString(); @@ -813,18 +827,10 @@ namespace detail { bool Exclusive = ApplyRecord.WorkerDescriptor["exclusive"sv].AsBool(); // TODO: Remove override when Horde accepts the UE style Host Platforms (Win64, Linux, Mac) - std::string Condition; - if (HostPlatform == "Win64" || HostPlatform == "Windows") - { - Condition = "OSFamily == 'Windows' && Pool == 'Win-RemoteExec'"; - } - else if (HostPlatform == "Mac") - { - Condition = "OSFamily == 'MacOS'"; - } - else + std::string Condition = "Platform == '{}'"_format(HostPlatform); + if (HostPlatform == "Win64") { - Condition = "OSFamily == '{}'"_format(HostPlatform); + Condition += " && Pool == 'Win-RemoteExec'"; } std::map<std::string_view, int64_t> Resources; diff --git a/zenserver/xmake.lua b/zenserver/xmake.lua index 35094c457..d53fdd4f0 100644 --- a/zenserver/xmake.lua +++ b/zenserver/xmake.lua @@ -12,7 +12,6 @@ target("zenserver") if is_plat("windows") then add_ldflags("/subsystem:console,5.02") add_ldflags("/MANIFEST:EMBED") - add_ldflags("/MANIFESTUAC:level='requireAdministrator'") add_ldflags("/LTCG") else del_files("windows/**") diff --git a/zenserver/zenserver.vcxproj b/zenserver/zenserver.vcxproj index 935979cc3..056d431cb 100644 --- a/zenserver/zenserver.vcxproj +++ b/zenserver/zenserver.vcxproj @@ -82,7 +82,6 @@ <EnableCOMDATFolding>true</EnableCOMDATFolding> <OptimizeReferences>true</OptimizeReferences> <GenerateDebugInformation>true</GenerateDebugInformation> - <UACExecutionLevel>RequireAdministrator</UACExecutionLevel> <DelayLoadDLLs>projectedfslib.dll;shell32.dll</DelayLoadDLLs> </Link> </ItemDefinitionGroup> @@ -99,7 +98,6 @@ <Link> <SubSystem>Console</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> - <UACExecutionLevel>RequireAdministrator</UACExecutionLevel> <DelayLoadDLLs>projectedfslib.dll;shell32.dll</DelayLoadDLLs> </Link> </ItemDefinitionGroup> |