aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2026-02-03 09:26:22 +0100
committerGitHub Enterprise <[email protected]>2026-02-03 09:26:22 +0100
commit38baa12f2d72319dea661ccc55b33994f732942c (patch)
treeb998b03ebb1d40cad9a2ad345f2462e25bf28939
parentonly disable backlog scheduling when downloaded payload is not on disk (#741) (diff)
downloadzen-38baa12f2d72319dea661ccc55b33994f732942c.tar.xz
zen-38baa12f2d72319dea661ccc55b33994f732942c.zip
add command line option for scrub timeslice (#742)
-rw-r--r--CHANGELOG.md2
-rw-r--r--src/zen/cmds/admin_cmd.cpp11
-rw-r--r--src/zen/cmds/admin_cmd.h7
-rw-r--r--src/zenserver/storage/admin/admin.cpp10
4 files changed, 25 insertions, 5 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 26199bcd9..9d5cbae95 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,8 @@
- Improvement: Reduce default size for block store chunk read window when iterating chunks
- Improvement: Increase timeout before warning on slow shut down of zenserver
- Improvement: Revise logic for enabling work backlog during `zen builds download`
+- Improvement: Added `--maxtimeslice` option to `zen scrub` command to control how long a scrub operation may run
+- Improvement: Increased the default scrub timeslice from 1 min 40 sec to 5 min.
- Bugfix: Restore `/health/log` and `/health/info` endpoint functionality
## 5.7.19
diff --git a/src/zen/cmds/admin_cmd.cpp b/src/zen/cmds/admin_cmd.cpp
index 502d1e799..15e854796 100644
--- a/src/zen/cmds/admin_cmd.cpp
+++ b/src/zen/cmds/admin_cmd.cpp
@@ -21,6 +21,12 @@ ScrubCommand::ScrubCommand()
m_Options.add_option("", "n", "dry", "Dry run (do not delete any data)", cxxopts::value(m_DryRun), "<bool>");
m_Options.add_option("", "", "no-gc", "Do not perform GC after scrub pass", cxxopts::value(m_NoGc), "<bool>");
m_Options.add_option("", "", "no-cas", "Do not scrub CAS stores", cxxopts::value(m_NoCas), "<bool>");
+ m_Options.add_option("",
+ "",
+ "maxtimeslice",
+ "Number of second Scrub is allowed to run before stopping in seconds (default 300s)",
+ cxxopts::value(m_MaxTimeSliceSeconds),
+ "<maxtimeslice>");
}
ScrubCommand::~ScrubCommand() = default;
@@ -44,7 +50,10 @@ ScrubCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
HttpClient Http(m_HostName);
- HttpClient::KeyValueMap Params{{"skipdelete", ToString(m_DryRun)}, {"skipgc", ToString(m_NoGc)}, {"skipcid", ToString(m_NoCas)}};
+ HttpClient::KeyValueMap Params{{"skipdelete", ToString(m_DryRun)},
+ {"skipgc", ToString(m_NoGc)},
+ {"skipcid", ToString(m_NoCas)},
+ {"maxtimeslice", fmt::format("{}", m_MaxTimeSliceSeconds)}};
if (HttpClient::Response Response = Http.Post("/admin/scrub"sv, /* headers */ HttpClient::KeyValueMap{}, Params))
{
diff --git a/src/zen/cmds/admin_cmd.h b/src/zen/cmds/admin_cmd.h
index 4f97b7ad4..87ef8091b 100644
--- a/src/zen/cmds/admin_cmd.h
+++ b/src/zen/cmds/admin_cmd.h
@@ -22,9 +22,10 @@ public:
private:
cxxopts::Options m_Options{"scrub", "Scrub zen storage"};
std::string m_HostName;
- bool m_DryRun = false;
- bool m_NoGc = false;
- bool m_NoCas = false;
+ bool m_DryRun = false;
+ bool m_NoGc = false;
+ bool m_NoCas = false;
+ uint64_t m_MaxTimeSliceSeconds = 300;
};
/** Garbage collect storage
diff --git a/src/zenserver/storage/admin/admin.cpp b/src/zenserver/storage/admin/admin.cpp
index 04f43d33a..cd6002d59 100644
--- a/src/zenserver/storage/admin/admin.cpp
+++ b/src/zenserver/storage/admin/admin.cpp
@@ -539,7 +539,7 @@ HttpAdminService::HttpAdminService(GcScheduler& Scheduler,
const HttpServerRequest::QueryParams Params = HttpReq.GetQueryParams();
GcScheduler::TriggerScrubParams ScrubParams;
- ScrubParams.MaxTimeslice = std::chrono::seconds(100);
+ ScrubParams.MaxTimeslice = std::chrono::seconds(300);
if (auto Param = Params.GetValue("skipdelete"); Param.empty() == false)
{
@@ -556,6 +556,14 @@ HttpAdminService::HttpAdminService(GcScheduler& Scheduler,
ScrubParams.SkipCas = (Param == "true"sv);
}
+ if (auto Param = Params.GetValue("maxtimeslice"); Param.empty() == false)
+ {
+ if (auto Value = ParseInt<uint64_t>(Param))
+ {
+ ScrubParams.MaxTimeslice = std::chrono::seconds(Value.value());
+ }
+ }
+
m_GcScheduler.TriggerScrub(ScrubParams);
CbObjectWriter Response;