aboutsummaryrefslogtreecommitdiff
path: root/zenserver/upstream/upstreamcache.h
diff options
context:
space:
mode:
authorPer Larsson <[email protected]>2021-09-22 21:21:15 +0200
committerPer Larsson <[email protected]>2021-09-22 21:21:15 +0200
commitddb84cb54f7cf6777d2ccaed4338fff56b75922c (patch)
treebffa905f41526a5ed0ddbefed45573a069a2d845 /zenserver/upstream/upstreamcache.h
parentMade icon resource path relative, as it should be (diff)
downloadzen-ddb84cb54f7cf6777d2ccaed4338fff56b75922c.tar.xz
zen-ddb84cb54f7cf6777d2ccaed4338fff56b75922c.zip
Made upstream endpoints more resilient to failures by checking health/reconnecting at regular intervals.
Diffstat (limited to 'zenserver/upstream/upstreamcache.h')
-rw-r--r--zenserver/upstream/upstreamcache.h44
1 files changed, 34 insertions, 10 deletions
diff --git a/zenserver/upstream/upstreamcache.h b/zenserver/upstream/upstreamcache.h
index 142fe260f..96ee8bddc 100644
--- a/zenserver/upstream/upstreamcache.h
+++ b/zenserver/upstream/upstreamcache.h
@@ -6,6 +6,7 @@
#include <zencore/iohash.h>
#include <zencore/zencore.h>
+#include <chrono>
#include <memory>
namespace zen {
@@ -35,18 +36,33 @@ struct UpstreamCacheRecord
struct UpstreamCacheOptions
{
- uint32_t ThreadCount = 4;
- bool ReadUpstream = true;
- bool WriteUpstream = true;
+ std::chrono::seconds HealthCheckInterval{5};
+ uint32_t ThreadCount = 4;
+ bool ReadUpstream = true;
+ bool WriteUpstream = true;
+};
+
+enum class UpstreamStatusCode : uint8_t
+{
+ Ok,
+ Error
+};
+
+struct UpstreamError
+{
+ UpstreamStatusCode StatusCode = UpstreamStatusCode::Ok;
+ std::string Reason;
+
+ explicit operator bool() const { return StatusCode != UpstreamStatusCode::Ok; }
};
struct GetUpstreamCacheResult
{
- IoBuffer Value;
- std::string Reason;
- int64_t Bytes = {};
- double ElapsedSeconds = {};
- bool Success = false;
+ IoBuffer Value;
+ UpstreamError Error;
+ int64_t Bytes = {};
+ double ElapsedSeconds = {};
+ bool Success = false;
};
struct PutUpstreamCacheResult
@@ -57,6 +73,12 @@ struct PutUpstreamCacheResult
bool Success = false;
};
+struct UpstreamEndpointHealth
+{
+ std::string Reason;
+ bool Ok = false;
+};
+
/**
* The upstream endpont is responsible for handling upload/downloading of cache records.
*/
@@ -65,7 +87,9 @@ class UpstreamEndpoint
public:
virtual ~UpstreamEndpoint() = default;
- virtual bool Initialize() = 0;
+ virtual bool IsHealthy() const = 0;
+
+ virtual UpstreamEndpointHealth CheckHealth() = 0;
virtual std::string_view DisplayName() const = 0;
@@ -88,7 +112,7 @@ public:
virtual bool Initialize() = 0;
- virtual void AddEndpoint(std::unique_ptr<UpstreamEndpoint> Endpoint) = 0;
+ virtual void RegisterEndpoint(std::unique_ptr<UpstreamEndpoint> Endpoint) = 0;
virtual GetUpstreamCacheResult GetCacheRecord(UpstreamCacheKey CacheKey, ZenContentType Type) = 0;