// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "zencompute/functionservice.h" #if ZEN_WITH_COMPUTE_SERVICES # include "functionrunner.h" # include # include # include # include # include # include # include namespace zen { class CidStore; } namespace zen::compute { /** HTTP-based runner This implements a DDC remote compute execution strategy via REST API */ class RemoteHttpRunner : public FunctionRunner { RemoteHttpRunner(RemoteHttpRunner&&) = delete; RemoteHttpRunner& operator=(RemoteHttpRunner&&) = delete; public: RemoteHttpRunner(ChunkResolver& InChunkResolver, const std::filesystem::path& BaseDir, std::string_view HostName); ~RemoteHttpRunner(); virtual void Shutdown() override; virtual void RegisterWorker(const CbPackage& WorkerPackage) override; [[nodiscard]] virtual SubmitResult SubmitAction(Ref Action) override; [[nodiscard]] virtual bool IsHealthy() override; [[nodiscard]] virtual size_t GetSubmittedActionCount() override; [[nodiscard]] virtual size_t QueryCapacity() override; [[nodiscard]] virtual std::vector SubmitActions(const std::vector>& Actions) override; protected: LoggerRef Log() { return m_Log; } private: LoggerRef m_Log; ChunkResolver& m_ChunkResolver; std::string m_BaseUrl; HttpClient m_Http; int32_t m_MaxRunningActions = 256; // arbitrary limit for testing struct HttpRunningAction { Ref Action; int RemoteActionLsn = 0; // Remote LSN bool Success = false; CbPackage ActionResults; }; RwLock m_RunningLock; std::unordered_map m_RemoteRunningMap; // Note that this is keyed on the *REMOTE* lsn std::thread m_MonitorThread; std::atomic m_MonitorThreadEnabled{true}; Event m_MonitorThreadEvent; void MonitorThreadFunction(); size_t SweepRunningActions(); }; } // namespace zen::compute #endif