aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/projectstore/projectstore.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-10-03 13:31:02 +0200
committerGitHub <[email protected]>2023-10-03 13:31:02 +0200
commit68a72b68592c416969bd36f413eb2b2762b9fcff (patch)
tree9a5fc28eb9040f010c92f86a1745f9418dfc91ca /src/zenserver/projectstore/projectstore.cpp
parentclean up date formatting (#440) (diff)
downloadzen-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.cpp66
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)
{