diff options
| author | Dan Engelbrecht <[email protected]> | 2025-09-08 13:50:27 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2025-09-08 13:50:27 +0200 |
| commit | b01ffdbbe93e14d4388b237b63344fd029902b81 (patch) | |
| tree | 2760b933b0dab8674473482253a7e8d2c80d0523 /src/zenserver/projectstore/httpprojectstore.cpp | |
| parent | 5.7.1-pre1 (diff) | |
| download | zen-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.cpp | 71 |
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(); } |