aboutsummaryrefslogtreecommitdiff
path: root/zenserver/upstream
diff options
context:
space:
mode:
Diffstat (limited to 'zenserver/upstream')
-rw-r--r--zenserver/upstream/zen.cpp97
-rw-r--r--zenserver/upstream/zen.h54
2 files changed, 147 insertions, 4 deletions
diff --git a/zenserver/upstream/zen.cpp b/zenserver/upstream/zen.cpp
index 7904f9b28..715df6f69 100644
--- a/zenserver/upstream/zen.cpp
+++ b/zenserver/upstream/zen.cpp
@@ -7,12 +7,14 @@
#include <zencore/fmtutils.h>
#include <zencore/stream.h>
+#include "cache/structuredcachestore.h"
+
+#include <cpr/cpr.h>
#include <spdlog/spdlog.h>
#include <xxhash.h>
#include <gsl/gsl-lite.hpp>
namespace zen {
-
namespace detail {
struct MessageHeader
{
@@ -288,4 +290,97 @@ Mesh::IssueReceive()
});
}
+//////////////////////////////////////////////////////////////////////////
+
+namespace detail {
+ struct ZenCacheSessionState
+ {
+ ZenCacheSessionState(ZenStructuredCacheClient& Client) : OwnerClient(Client) {}
+ ~ZenCacheSessionState() {}
+
+ void Reset() {}
+
+ ZenStructuredCacheClient& OwnerClient;
+ cpr::Session Session;
+ };
+} // namespace detail
+
+//////////////////////////////////////////////////////////////////////////
+
+ZenStructuredCacheClient::ZenStructuredCacheClient(std::string_view ServiceUrl) : m_ServiceUrl(ServiceUrl)
+{
+}
+
+ZenStructuredCacheClient::~ZenStructuredCacheClient()
+{
+}
+
+detail::ZenCacheSessionState*
+ZenStructuredCacheClient::AllocSessionState()
+{
+ detail::ZenCacheSessionState* State = nullptr;
+
+ if (RwLock::ExclusiveLockScope _(m_SessionStateLock); !m_SessionStateCache.empty())
+ {
+ State = m_SessionStateCache.front();
+ m_SessionStateCache.pop_front();
+ }
+
+ if (State == nullptr)
+ {
+ State = new detail::ZenCacheSessionState(*this);
+ }
+
+ State->Reset();
+
+ return State;
+}
+
+void
+ZenStructuredCacheClient::FreeSessionState(detail::ZenCacheSessionState* State)
+{
+ RwLock::ExclusiveLockScope _(m_SessionStateLock);
+ m_SessionStateCache.push_front(State);
+}
+
+//////////////////////////////////////////////////////////////////////////
+
+ZenStructuredCacheSession::ZenStructuredCacheSession(ZenStructuredCacheClient& OuterClient) : m_Client(OuterClient)
+{
+}
+
+ZenStructuredCacheSession::~ZenStructuredCacheSession()
+{
+}
+
+IoBuffer
+ZenStructuredCacheSession::Get(std::string_view BucketId, std::string_view Key)
+{
+ ZEN_UNUSED(BucketId, Key);
+
+ return {};
+}
+
+void
+ZenStructuredCacheSession::Put(std::string_view BucketId, std::string_view Key, IoBuffer Data)
+{
+ ZEN_UNUSED(BucketId, Key, Data);
+}
+
+// Structured cache operations
+
+IoBuffer
+ZenStructuredCacheSession::Get(std::string_view BucketId, const IoHash& Key)
+{
+ ZEN_UNUSED(BucketId, Key);
+
+ return {};
+}
+
+void
+ZenStructuredCacheSession::Put(std::string_view BucketId, const IoHash& Key, ZenCacheValue Data)
+{
+ ZEN_UNUSED(BucketId, Key, Data);
+}
+
} // namespace zen
diff --git a/zenserver/upstream/zen.h b/zenserver/upstream/zen.h
index 75e29bf86..9bdcdda23 100644
--- a/zenserver/upstream/zen.h
+++ b/zenserver/upstream/zen.h
@@ -2,6 +2,8 @@
#pragma once
+#include <zencore/iobuffer.h>
+#include <zencore/iohash.h>
#include <zencore/memory.h>
#include <zencore/thread.h>
#include <zencore/uid.h>
@@ -16,9 +18,12 @@
#include <chrono>
+struct ZenCacheValue;
+
namespace zen {
class CbObjectWriter;
+class ZenStructuredCacheClient;
/** Zen mesh tracker
*
@@ -72,13 +77,56 @@ private:
tsl::robin_map<Oid, PeerInfo, Oid::Hasher> m_KnownPeers;
};
-class ZenKvCacheClient
+namespace detail {
+ struct ZenCacheSessionState;
+}
+
+/** Zen Structured Cache session
+ *
+ * This provides a context in which cache queries can be performed
+ *
+ * These are currently all synchronous. Will need to be made asynchronous
+ */
+class ZenStructuredCacheSession
+{
+public:
+ ZenStructuredCacheSession(ZenStructuredCacheClient& OuterClient);
+ ~ZenStructuredCacheSession();
+
+ // Key-value cache operations
+ IoBuffer Get(std::string_view BucketId, std::string_view Key);
+ void Put(std::string_view BucketId, std::string_view Key, IoBuffer Data);
+
+ // Structured cache operations
+ IoBuffer Get(std::string_view BucketId, const IoHash& Key);
+ void Put(std::string_view BucketId, const IoHash& Key, ZenCacheValue Data);
+
+private:
+ ZenStructuredCacheClient& m_Client;
+ detail::ZenCacheSessionState* m_SessionState;
+};
+
+/** Zen Structured Cache client
+ *
+ * This represents an endpoint to query -- actual queries should be done via
+ * ZenStructuredCacheSession
+ */
+class ZenStructuredCacheClient : public RefCounted
{
public:
- ZenKvCacheClient();
- ~ZenKvCacheClient();
+ ZenStructuredCacheClient(std::string_view ServiceUrl);
+ ~ZenStructuredCacheClient();
private:
+ std::string m_ServiceUrl;
+
+ RwLock m_SessionStateLock;
+ std::list<detail::ZenCacheSessionState*> m_SessionStateCache;
+
+ detail::ZenCacheSessionState* AllocSessionState();
+ void FreeSessionState(detail::ZenCacheSessionState*);
+
+ friend class ZenStructuredCacheSession;
};
} // namespace zen