aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/projectstore/httpprojectstore.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2025-09-08 13:50:27 +0200
committerGitHub Enterprise <[email protected]>2025-09-08 13:50:27 +0200
commitb01ffdbbe93e14d4388b237b63344fd029902b81 (patch)
tree2760b933b0dab8674473482253a7e8d2c80d0523 /src/zenserver/projectstore/httpprojectstore.cpp
parent5.7.1-pre1 (diff)
downloadzen-b01ffdbbe93e14d4388b237b63344fd029902b81.tar.xz
zen-b01ffdbbe93e14d4388b237b63344fd029902b81.zip
faster oplog entries with referenceset (#488)
- Improvement: Faster project store `/entries` endpoint, 10-15% faster when using a reference set to limit entries fix missing space after task name in pretty progressbar
Diffstat (limited to 'src/zenserver/projectstore/httpprojectstore.cpp')
-rw-r--r--src/zenserver/projectstore/httpprojectstore.cpp71
1 files changed, 48 insertions, 23 deletions
diff --git a/src/zenserver/projectstore/httpprojectstore.cpp b/src/zenserver/projectstore/httpprojectstore.cpp
index 237dc097e..11ef067c4 100644
--- a/src/zenserver/projectstore/httpprojectstore.cpp
+++ b/src/zenserver/projectstore/httpprojectstore.cpp
@@ -1712,13 +1712,6 @@ HttpProjectService::HandleOpLogEntriesRequest(HttpRouterRequest& Req)
}
else
{
- std::optional<OplogReferencedSet> ReferencedSet;
- if (auto TrimString = Params.GetValue("trim_by_referencedset"); TrimString == "true")
- {
- ReferencedSet = LoadReferencedSet(*Project, *FoundLog);
- }
- Response.BeginArray("entries"sv);
-
ProjectStore::Oplog::Paging EntryPaging;
if (std::string_view Param = Params.GetValue("start"); !Param.empty())
{
@@ -1735,24 +1728,56 @@ HttpProjectService::HandleOpLogEntriesRequest(HttpRouterRequest& Req)
}
}
+ std::optional<OplogReferencedSet> MaybeReferencedSet;
+ if (auto TrimString = Params.GetValue("trim_by_referencedset"); TrimString == "true")
+ {
+ MaybeReferencedSet = LoadReferencedSet(*Project, *FoundLog);
+ }
+ Response.BeginArray("entries"sv);
+
bool ShouldFilterFields = !FieldNamesFilter.empty();
- FoundLog->IterateOplogWithKey(
- [this, &Response, &FilterObject, ShouldFilterFields, &ReferencedSet](uint32_t /* LSN */, const Oid& Key, CbObjectView Op) {
- if (ReferencedSet && !ReferencedSet->Contains(Key, Op["key"].AsString()))
- {
- return;
- }
- if (ShouldFilterFields)
- {
- Response << FilterObject(Op);
- }
- else
- {
- Response << Op;
- }
- },
- EntryPaging);
+ if (MaybeReferencedSet)
+ {
+ const OplogReferencedSet& ReferencedSet = MaybeReferencedSet.value();
+ FoundLog->IterateOplogWithKey(
+ [this, &Response, &FilterObject, ShouldFilterFields, &ReferencedSet](uint32_t /* LSN */,
+ const Oid& Key,
+ CbObjectView Op) {
+ if (!ReferencedSet.Contains(Key))
+ {
+ if (!OplogReferencedSet::IsNonPackage(Op["key"].AsString()))
+ {
+ return;
+ }
+ }
+
+ if (ShouldFilterFields)
+ {
+ Response << FilterObject(Op);
+ }
+ else
+ {
+ Response << Op;
+ }
+ },
+ EntryPaging);
+ }
+ else
+ {
+ FoundLog->IterateOplog(
+ [this, &Response, &FilterObject, ShouldFilterFields](CbObjectView Op) {
+ if (ShouldFilterFields)
+ {
+ Response << FilterObject(Op);
+ }
+ else
+ {
+ Response << Op;
+ }
+ },
+ EntryPaging);
+ }
Response.EndArray();
}