diff options
| author | Dan Engelbrecht <[email protected]> | 2026-03-03 20:45:52 +0100 |
|---|---|---|
| committer | Dan Engelbrecht <[email protected]> | 2026-03-03 20:45:52 +0100 |
| commit | 610dac1a31e19edb5fb9ba9080487ad68ddf85d8 (patch) | |
| tree | 8c384f4dda2eef7530e08e4a45c23b507389000c /src/zenutil/include | |
| parent | fix objectstore uri path parsing (#801) (diff) | |
| download | zen-610dac1a31e19edb5fb9ba9080487ad68ddf85d8.tar.xz zen-610dac1a31e19edb5fb9ba9080487ad68ddf85d8.zip | |
initial implementation from
Diffstat (limited to 'src/zenutil/include')
| -rw-r--r-- | src/zenutil/include/zenutil/consul.h | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/zenutil/include/zenutil/consul.h b/src/zenutil/include/zenutil/consul.h index 08871fa66..74e6abce4 100644 --- a/src/zenutil/include/zenutil/consul.h +++ b/src/zenutil/include/zenutil/consul.h @@ -5,11 +5,25 @@ #include <zenbase/zenbase.h> #include <zenhttp/httpclient.h> +#include <atomic> +#include <cstdint> #include <string> #include <string_view> +#include <thread> namespace zen::consul { +struct ServiceRegistrationInfo +{ + std::string ServiceId; + std::string ServiceName; + std::string Address; + uint16_t Port = 0; + std::string HealthEndpoint; + int HealthIntervalSeconds = 10; + int DeregisterAfterSeconds = 30; +}; + class ConsulClient { public: @@ -23,6 +37,13 @@ public: std::string GetKeyValue(std::string_view Key); void DeleteKey(std::string_view Key); + bool RegisterService(const ServiceRegistrationInfo& Info); + bool DeregisterService(std::string_view ServiceId); + + // Query methods for testing + bool HasService(std::string_view ServiceId); + std::string GetAgentServicesJson(); + private: HttpClient m_HttpClient; }; @@ -44,4 +65,34 @@ private: std::unique_ptr<Impl> m_Impl; }; +/** + * RAII wrapper for Consul service registration. + * + * Manages the lifecycle of a Consul service registration with: + * - Async registration in a background thread + * - Exponential backoff retry on failure (100ms, 200ms, 400ms) + * - Continuous background retry every 5 seconds after initial failures + * - Automatic deregistration on destruction + */ +class ServiceRegistration +{ +public: + ServiceRegistration(ConsulClient* Client, const ServiceRegistrationInfo& Info); + ~ServiceRegistration(); + + ServiceRegistration(const ServiceRegistration&) = delete; + ServiceRegistration& operator=(const ServiceRegistration&) = delete; + + bool IsRegistered() const { return m_IsRegistered.load(); } + +private: + ConsulClient* m_Client; + ServiceRegistrationInfo m_Info; + std::atomic<bool> m_IsRegistered{false}; + std::atomic<bool> m_ShouldStop{false}; + std::thread m_RegistrationThread; + + void RegistrationLoop(); +}; + } // namespace zen::consul |