diff options
| author | Per Larsson <[email protected]> | 2021-12-12 12:04:31 +0100 |
|---|---|---|
| committer | Per Larsson <[email protected]> | 2021-12-12 12:04:31 +0100 |
| commit | a40133fe893100631f9bb8cd68fb7c2edbab0759 (patch) | |
| tree | 80cdcb8af8fad50d1004116671a655ec4495d729 /zenserver | |
| parent | Added size to GcStorage. (diff) | |
| download | zen-a40133fe893100631f9bb8cd68fb7c2edbab0759.tar.xz zen-a40133fe893100631f9bb8cd68fb7c2edbab0759.zip | |
Added support for triggering GC with different params and refactored GC scheduler.
Diffstat (limited to 'zenserver')
| -rw-r--r-- | zenserver/admin/admin.cpp | 51 | ||||
| -rw-r--r-- | zenserver/admin/admin.h | 14 | ||||
| -rw-r--r-- | zenserver/zenserver.cpp | 17 |
3 files changed, 32 insertions, 50 deletions
diff --git a/zenserver/admin/admin.cpp b/zenserver/admin/admin.cpp index 0d7a57e36..8a3ab460c 100644 --- a/zenserver/admin/admin.cpp +++ b/zenserver/admin/admin.cpp @@ -6,10 +6,13 @@ #include <zencore/compactbinarybuilder.h> #include <zencore/string.h> +#include <zenstore/gc.h> + +#include <chrono> namespace zen { -HttpAdminService::HttpAdminService() +HttpAdminService::HttpAdminService(GcScheduler& Scheduler) : m_GcScheduler(Scheduler) { using namespace std::literals; @@ -25,42 +28,42 @@ HttpAdminService::HttpAdminService() m_Router.RegisterRoute( "gc", [this](HttpRouterRequest& Req) { - CbObject Response; - if (m_GcHandler.Status) - { - Response = m_GcHandler.Status(); - } - else - { - CbObjectWriter Writer; - Writer << "Status"sv - << "Ok"sv; - Response = Writer.Save(); - } - Req.ServerRequest().WriteResponse(HttpResponseCode::OK, Response); + const GcSchedulerStatus Status = m_GcScheduler.Status(); + + CbObjectWriter Response; + Response << "Status"sv << (GcSchedulerStatus::kIdle == Status ? "Idle"sv : "Running"sv); + Req.ServerRequest().WriteResponse(HttpResponseCode::OK, Response.Save()); }, HttpVerb::kGet); m_Router.RegisterRoute( "gc", [this](HttpRouterRequest& Req) { - CbObject Response; - if (m_GcHandler.Trigger) + HttpServerRequest& HttpReq = Req.ServerRequest(); + const HttpServerRequest::QueryParams Params = HttpReq.GetQueryParams(); + GcScheduler::TriggerParams GcParams; + + if (auto Param = Params.GetValue("smallobjects"); Param == "true"sv) { - Response = m_GcHandler.Trigger(); + GcParams.CollectSmallObjects = true; } - else + + if (auto Param = Params.GetValue("maxcacheduration"); Param.empty() == false) { - CbObjectWriter Writer; - Writer << "Status"sv - << "Ok"sv; - Response = Writer.Save(); + if (auto Value = ParseInt<uint64_t>(Param)) + { + GcParams.MaxCacheDuration = std::chrono::seconds(Value.value()); + } } - Req.ServerRequest().WriteResponse(HttpResponseCode::OK, Response); + + const bool Started = m_GcScheduler.Trigger(GcParams); + + CbObjectWriter Response; + Response << "Status"sv << (Started ? "Started"sv : "Running"sv); + HttpReq.WriteResponse(HttpResponseCode::OK, Response.Save()); }, HttpVerb::kPost); - // RPC endpoint m_Router.RegisterRoute( "", [this](HttpRouterRequest& Req) { diff --git a/zenserver/admin/admin.h b/zenserver/admin/admin.h index f8fcab7de..9463ffbb3 100644 --- a/zenserver/admin/admin.h +++ b/zenserver/admin/admin.h @@ -7,26 +7,20 @@ namespace zen { +class GcScheduler; + class HttpAdminService : public zen::HttpService { public: - HttpAdminService(); + HttpAdminService(GcScheduler& Scheduler); ~HttpAdminService(); virtual const char* BaseUri() const override; virtual void HandleRequest(zen::HttpServerRequest& Request) override; - struct GcHandler - { - std::function<CbObject()> Trigger; - std::function<CbObject()> Status; - }; - - void RegisterGcHandler(GcHandler&& Handler) { m_GcHandler = std::forward<GcHandler>(Handler); } - private: HttpRequestRouter m_Router; - GcHandler m_GcHandler; + GcScheduler& m_GcScheduler; }; } // namespace zen diff --git a/zenserver/zenserver.cpp b/zenserver/zenserver.cpp index c4cc22140..e14f93f5b 100644 --- a/zenserver/zenserver.cpp +++ b/zenserver/zenserver.cpp @@ -195,21 +195,6 @@ public: .HttpServerClass = std::string(ServerOptions.HttpServerClass), .BuildVersion = std::string(BUILD_VERSION)}); - m_AdminService.RegisterGcHandler({.Trigger = - [this]() { - CbObjectWriter Writer; - const bool Started = m_GcScheduler.ScheduleNow(); - Writer << "Status"sv << (Started ? "Started"sv : "Running"sv); - return Writer.Save(); - }, - .Status = - [this]() { - CbObjectWriter Writer; - const GcSchedulerStatus Status = m_GcScheduler.Status(); - Writer << "Status"sv << (GcSchedulerStatus::kIdle == Status ? "Idle"sv : "Running"sv); - return Writer.Save(); - }}); - // Ok so now we're configured, let's kick things off m_Http = zen::CreateHttpServer(ServerOptions.HttpServerClass); @@ -540,7 +525,7 @@ private: zen::RefPtr<zen::ProjectStore> m_ProjectStore; std::unique_ptr<zen::HttpProjectService> m_HttpProjectService; std::unique_ptr<zen::HttpStructuredCacheService> m_StructuredCacheService; - zen::HttpAdminService m_AdminService; + zen::HttpAdminService m_AdminService{m_GcScheduler}; zen::HttpHealthService m_HealthService; zen::Mesh m_ZenMesh{m_IoContext}; std::unique_ptr<zen::HttpFunctionService> m_HttpFunctionService; |