diff options
| author | Dan Engelbrecht <[email protected]> | 2023-10-03 13:31:02 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-10-03 13:31:02 +0200 |
| commit | 68a72b68592c416969bd36f413eb2b2762b9fcff (patch) | |
| tree | 9a5fc28eb9040f010c92f86a1745f9418dfc91ca /src/zenserver/projectstore/projectstore.cpp | |
| parent | clean up date formatting (#440) (diff) | |
| download | zen-68a72b68592c416969bd36f413eb2b2762b9fcff.tar.xz zen-68a72b68592c416969bd36f413eb2b2762b9fcff.zip | |
faster accesstime save restore (#439)
- Improvement: Reduce time a cache bucket is locked for write when flushing/garbage collecting
- Change format for faster read/write and reduced size on disk
- Don't lock index while writing manifest to disk
- Skip garbage collect if we are currently in a Flush operation
- BlockStore::Flush no longer terminates currently writing block
- Garbage collect references to currently writing block but keep the block as new data may be added
- Fix BlockStore::Prune used disk space calculation
- Don't materialize data in filecas when we just need the size
Diffstat (limited to 'src/zenserver/projectstore/projectstore.cpp')
| -rw-r--r-- | src/zenserver/projectstore/projectstore.cpp | 66 |
1 files changed, 43 insertions, 23 deletions
diff --git a/src/zenserver/projectstore/projectstore.cpp b/src/zenserver/projectstore/projectstore.cpp index 4ddbdded7..4402e4486 100644 --- a/src/zenserver/projectstore/projectstore.cpp +++ b/src/zenserver/projectstore/projectstore.cpp @@ -1239,15 +1239,37 @@ ProjectStore::Project::ReadAccessTimes() if (ValidationError == CbValidateError::None) { - CbObject Reader = LoadCompactBinaryObject(Obj); - CbArrayView LastAccessTimes = Reader["lastaccess"sv].AsArrayView(); + CbObject Reader = LoadCompactBinaryObject(Obj); - for (CbFieldView& Entry : LastAccessTimes) + uint64_t Count = Reader["count"sv].AsUInt64(0); + if (Count > 0) { - CbObjectView AccessTime = Entry.AsObjectView(); - std::string_view Id = AccessTime["id"sv].AsString(); - GcClock::Tick AccessTick = AccessTime["tick"sv].AsUInt64(); - m_LastAccessTimes.insert_or_assign(std::string(Id), AccessTick); + std::vector<uint64_t> Ticks; + Ticks.reserve(Count); + CbArrayView TicksArray = Reader["ticks"sv].AsArrayView(); + for (CbFieldView& TickView : TicksArray) + { + Ticks.emplace_back(TickView.AsUInt64()); + } + CbArrayView IdArray = Reader["ids"sv].AsArrayView(); + uint64_t Index = 0; + for (CbFieldView& IdView : IdArray) + { + std::string_view Id = IdView.AsString(); + m_LastAccessTimes.insert_or_assign(std::string(Id), Ticks[Index++]); + } + } + + ////// Legacy format read + { + CbArrayView LastAccessTimes = Reader["lastaccess"sv].AsArrayView(); + for (CbFieldView& Entry : LastAccessTimes) + { + CbObjectView AccessTime = Entry.AsObjectView(); + std::string_view Id = AccessTime["id"sv].AsString(); + GcClock::Tick AccessTick = AccessTime["tick"sv].AsUInt64(); + m_LastAccessTimes.insert_or_assign(std::string(Id), AccessTick); + } } } else @@ -1261,26 +1283,27 @@ ProjectStore::Project::WriteAccessTimes() { using namespace std::literals; - RwLock::ExclusiveLockScope _(m_ProjectLock); + CbObjectWriter Writer; - BinaryWriter Mem; + Writer.AddInteger("count", gsl::narrow<uint64_t>(m_LastAccessTimes.size())); + Writer.BeginArray("ids"); - CbObjectWriter Writer; - Writer.BeginArray("lastaccess"); { + RwLock::SharedLockScope _(m_ProjectLock); for (const auto& It : m_LastAccessTimes) { - Writer.BeginObject(); - { - Writer << "id"sv << It.first; - Writer << "tick"sv << gsl::narrow<uint64_t>(It.second); - } - Writer.EndObject(); + Writer << It.first; } + Writer.EndArray(); + Writer.BeginArray("ticks"); + for (const auto& It : m_LastAccessTimes) + { + Writer << gsl::narrow<uint64_t>(It.second); + } + Writer.EndArray(); } - Writer.EndArray(); - Writer.Save(Mem); + CbObject Data = Writer.Save(); try { @@ -1290,10 +1313,7 @@ ProjectStore::Project::WriteAccessTimes() ZEN_INFO("persisting access times for project '{}' to {}", Identifier, ProjectAccessTimesFilePath); - BasicFile Blob; - Blob.Open(ProjectAccessTimesFilePath, BasicFile::Mode::kTruncate); - Blob.Write(Mem.Data(), Mem.Size(), 0); - Blob.Flush(); + WriteFile(ProjectAccessTimesFilePath, Data.GetBuffer().AsIoBuffer()); } catch (std::exception& Err) { |