diff options
Diffstat (limited to 'zenserver/upstream')
| -rw-r--r-- | zenserver/upstream/zen.cpp | 97 | ||||
| -rw-r--r-- | zenserver/upstream/zen.h | 54 |
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 |