aboutsummaryrefslogtreecommitdiff
path: root/src/zenstore/include
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-05-29 08:54:01 +0200
committerGitHub Enterprise <[email protected]>2024-05-29 08:54:01 +0200
commit3d3a39d69b39d5202960ada6d3512786fa4a8c83 (patch)
treef981eaf60b278edc84d7bd959153981fc2934b22 /src/zenstore/include
parent5.5.2 (diff)
downloadzen-3d3a39d69b39d5202960ada6d3512786fa4a8c83.tar.xz
zen-3d3a39d69b39d5202960ada6d3512786fa4a8c83.zip
workspace shares (#84)
Feature: New 'workspaces' service which allows a user to share a local folder via zenserver. A workspace can have mulitple workspace shares and they provie an HTTP API that is compatible with the project oplog HTTP API. Workspaces and shares are preserved between runs. Workspaces feature is disabled by default - enable with --workspaces-enabled option when launching zenserver.
Diffstat (limited to 'src/zenstore/include')
-rw-r--r--src/zenstore/include/zenstore/workspaces.h102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/zenstore/include/zenstore/workspaces.h b/src/zenstore/include/zenstore/workspaces.h
new file mode 100644
index 000000000..e1a024894
--- /dev/null
+++ b/src/zenstore/include/zenstore/workspaces.h
@@ -0,0 +1,102 @@
+// Copyright Epic Games, Inc. All Rights Reserved.
+
+#pragma once
+
+#include <zenbase/refcount.h>
+#include <zencore/filesystem.h>
+#include <zencore/logbase.h>
+#include <zencore/uid.h>
+#include <zencore/zencore.h>
+
+ZEN_THIRD_PARTY_INCLUDES_START
+#include <tsl/robin_map.h>
+ZEN_THIRD_PARTY_INCLUDES_END
+
+#include <optional>
+
+namespace zen {
+
+class WorkerThreadPool;
+class Workspace;
+class WorkspaceShare;
+
+class Workspaces
+{
+public:
+ struct ChunkRequest
+ {
+ Oid ChunkId;
+ uint64_t Offset = 0;
+ uint64_t Size = ~uint64_t(0);
+ };
+
+ struct ShareFile
+ {
+ std::string RelativePath;
+ uint64_t Size;
+ Oid Id;
+ };
+
+ struct WorkspaceConfiguration
+ {
+ Oid Id;
+ std::filesystem::path RootPath;
+ };
+
+ struct WorkspaceShareConfiguration
+ {
+ Oid Id;
+ std::filesystem::path SharePath;
+ };
+
+ struct WorkspaceInfo
+ {
+ WorkspaceConfiguration Config;
+ std::vector<WorkspaceShareConfiguration> Shares;
+ };
+
+ Workspaces();
+ ~Workspaces();
+
+ bool AddWorkspace(const WorkspaceConfiguration& Configuration);
+ WorkspaceConfiguration GetWorkspaceConfiguration(const Oid& WorkspaceId) const;
+ WorkspaceInfo GetWorkspaceInfo(const Oid& WorkspaceId) const;
+ bool RemoveWorkspace(const Oid& WorkspaceId);
+
+ bool AddWorkspaceShare(const Oid& WorkspaceId,
+ const WorkspaceShareConfiguration& Configuration,
+ std::function<Oid(const std::filesystem::path& Path)>&& PathToIdCB);
+ WorkspaceShareConfiguration GetWorkspaceShareConfiguration(const Oid& WorkspaceId, const Oid& ShareId) const;
+ bool RemoveWorkspaceShare(const Oid& WorkspaceId, const Oid& ShareId);
+
+ std::optional<std::vector<ShareFile>> GetWorkspaceShareFiles(const Oid& WorkspaceId,
+ const Oid& ShareId,
+ bool ForceRefresh,
+ WorkerThreadPool& WorkerPool);
+
+ ShareFile GetWorkspaceShareChunkInfo(const Oid& WorkspaceId, const Oid& ShareId, const Oid& ChunkId, WorkerThreadPool& WorkerPool);
+
+ std::vector<IoBuffer> GetWorkspaceShareChunks(const Oid& WorkspaceId,
+ const Oid& ShareId,
+ const std::span<const ChunkRequest> ChunkRequests,
+ WorkerThreadPool& WorkerPool);
+
+ void WriteState(const std::filesystem::path& WorkspaceStatePath);
+ void ReadState(const std::filesystem::path& WorkspaceStatePath, std::function<Oid(const std::filesystem::path& Path)>&& PathToIdCB);
+
+private:
+ LoggerRef& Log() { return m_Log; }
+
+ Ref<Workspace> FindWorkspace(const RwLock::SharedLockScope& Lock, const Oid& WorkspaceId) const;
+ std::pair<Ref<Workspace>, Ref<WorkspaceShare>> FindWorkspaceShare(const Oid& WorkspaceId,
+ const Oid& ShareId,
+ bool ForceRefresh,
+ WorkerThreadPool& WorkerPool);
+ LoggerRef m_Log;
+ mutable RwLock m_Lock;
+ tsl::robin_map<Oid, Ref<Workspace>, Oid::Hasher> m_Workspaces;
+};
+
+void workspaces_forcelink();
+
+} // namespace zen