diff options
Diffstat (limited to 'src/zenstore/projectstore.cpp')
| -rw-r--r-- | src/zenstore/projectstore.cpp | 86 |
1 files changed, 42 insertions, 44 deletions
diff --git a/src/zenstore/projectstore.cpp b/src/zenstore/projectstore.cpp index 0c4abeb1e..8159f9f83 100644 --- a/src/zenstore/projectstore.cpp +++ b/src/zenstore/projectstore.cpp @@ -3403,11 +3403,11 @@ ProjectStore::Oplog::AppendNewOplogEntry(CbPackage OpPackage) return EntryId; } -RefPtr<ProjectStore::OplogStorage> +Ref<ProjectStore::OplogStorage> ProjectStore::Oplog::GetStorage() { ZEN_MEMSCOPE(GetProjectstoreTag()); - RefPtr<OplogStorage> Storage; + Ref<OplogStorage> Storage; { RwLock::SharedLockScope _(m_OplogLock); Storage = m_Storage; @@ -3425,7 +3425,7 @@ ProjectStore::Oplog::AppendNewOplogEntry(CbObjectView Core) using namespace std::literals; - RefPtr<OplogStorage> Storage = GetStorage(); + Ref<OplogStorage> Storage = GetStorage(); if (!Storage) { return {}; @@ -3457,7 +3457,7 @@ ProjectStore::Oplog::AppendNewOplogEntries(std::span<CbObjectView> Cores) using namespace std::literals; - RefPtr<OplogStorage> Storage = GetStorage(); + Ref<OplogStorage> Storage = GetStorage(); if (!Storage) { return std::vector<ProjectStore::LogSequenceNumber>(Cores.size(), LogSequenceNumber{}); @@ -3516,7 +3516,18 @@ ProjectStore::Project::~Project() // Only write access times if we have not been explicitly deleted if (!m_OplogStoragePath.empty()) { - WriteAccessTimes(); + try + { + WriteAccessTimes(); + } + catch (const std::exception& Ex) + { + // RefCounted::Release() is noexcept, so a destructor that propagates an exception + // terminates the program. WriteAccessTimes() already catches I/O failures, but lock + // acquisition and allocations ahead of the internal try/catch can still throw, so + // we defend here as well. + ZEN_ERROR("project '{}': ~Project threw exception: '{}'", Identifier, Ex.what()); + } } } @@ -4739,7 +4750,7 @@ ProjectStore::GetProjectsList() CbObject ProjectStore::GetProjectFiles(LoggerRef InLog, Project& Project, Oplog& Oplog, const std::unordered_set<std::string>& WantedFieldNames) { - auto Log = [&InLog]() { return InLog; }; + ZEN_SCOPED_LOG(InLog); using namespace std::literals; @@ -4894,7 +4905,7 @@ ProjectStore::GetProjectChunkInfos(LoggerRef InLog, Project& Project, Oplog& Opl ZEN_MEMSCOPE(GetProjectstoreTag()); ZEN_TRACE_CPU("ProjectStore::GetProjectChunkInfos"); - auto Log = [&InLog]() { return InLog; }; + ZEN_SCOPED_LOG(InLog); using namespace std::literals; @@ -5051,16 +5062,13 @@ ProjectStore::GetProjectChunkInfos(LoggerRef InLog, Project& Project, Oplog& Opl } CbObject -ProjectStore::GetChunkInfo(LoggerRef InLog, Project& Project, Oplog& Oplog, const Oid& ChunkId) +ProjectStore::GetChunkInfo(Project& Project, Oplog& Oplog, const Oid& ChunkId) { ZEN_MEMSCOPE(GetProjectstoreTag()); ZEN_TRACE_CPU("ProjectStore::GetChunkInfo"); using namespace std::literals; - auto Log = [&InLog]() { return InLog; }; - ZEN_UNUSED(Log); - IoBuffer Chunk = Oplog.FindChunk(Project.RootDir, ChunkId, nullptr); if (!Chunk) { @@ -5169,7 +5177,10 @@ ExtractRange(IoBuffer&& Chunk, uint64_t Offset, uint64_t Size, ZenContentType Ac const bool IsFullRange = (Offset == 0) && ((Size == ~(0ull)) || (Size == ChunkSize)); if (IsFullRange) { - Result.Chunk = CompositeBuffer(SharedBuffer(std::move(Chunk))); + if (ChunkSize > 0) + { + Result.Chunk = CompositeBuffer(SharedBuffer(std::move(Chunk))); + } Result.RawSize = 0; } else @@ -5206,8 +5217,7 @@ ExtractRange(IoBuffer&& Chunk, uint64_t Offset, uint64_t Size, ZenContentType Ac } ProjectStore::GetChunkRangeResult -ProjectStore::GetChunkRange(LoggerRef InLog, - Project& Project, +ProjectStore::GetChunkRange(Project& Project, Oplog& Oplog, const Oid& ChunkId, uint64_t Offset, @@ -5219,9 +5229,6 @@ ProjectStore::GetChunkRange(LoggerRef InLog, ZEN_TRACE_CPU("ProjectStore::GetChunkRange"); - auto Log = [&InLog]() { return InLog; }; - ZEN_UNUSED(Log); - uint64_t OldTag = OptionalInOutModificationTag == nullptr ? 0 : *OptionalInOutModificationTag; IoBuffer Chunk = Oplog.FindChunk(Project.RootDir, ChunkId, OptionalInOutModificationTag); if (!Chunk) @@ -5728,7 +5735,7 @@ public: ZEN_TRACE_CPU("Store::CompactStore"); ZEN_MEMSCOPE(GetProjectstoreTag()); - auto Log = [&Ctx]() { return Ctx.Logger; }; + ZEN_SCOPED_LOG(Ctx.Logger); Stopwatch Timer; const auto _ = MakeGuard([&] { @@ -5864,7 +5871,7 @@ ProjectStore::RemoveExpiredData(GcCtx& Ctx, GcStats& Stats) ZEN_TRACE_CPU("Store::RemoveExpiredData"); ZEN_MEMSCOPE(GetProjectstoreTag()); - auto Log = [&Ctx]() { return Ctx.Logger; }; + ZEN_SCOPED_LOG(Ctx.Logger); Stopwatch Timer; const auto _ = MakeGuard([&] { @@ -6017,7 +6024,7 @@ public: { ZEN_TRACE_CPU("Store::UpdateLockedState"); - auto Log = [&Ctx]() { return Ctx.Logger; }; + ZEN_SCOPED_LOG(Ctx.Logger); Stopwatch Timer; @@ -6094,7 +6101,7 @@ public: { ZEN_TRACE_CPU("Store::GetUnusedReferences"); - auto Log = [&Ctx]() { return Ctx.Logger; }; + ZEN_SCOPED_LOG(Ctx.Logger); size_t InitialCount = IoCids.size(); size_t UsedCount = InitialCount; @@ -6118,6 +6125,7 @@ public: } private: + LoggerRef Log() { return m_ProjectStore.Log(); } ProjectStore& m_ProjectStore; std::vector<IoHash> m_References; }; @@ -6162,7 +6170,7 @@ public: { ZEN_TRACE_CPU("Store::Oplog::PreCache"); - auto Log = [&Ctx]() { return Ctx.Logger; }; + ZEN_SCOPED_LOG(Ctx.Logger); Stopwatch Timer; const auto _ = MakeGuard([&] { @@ -6280,7 +6288,7 @@ public: { ZEN_TRACE_CPU("Store::Oplog::UpdateLockedState"); - auto Log = [&Ctx]() { return Ctx.Logger; }; + ZEN_SCOPED_LOG(Ctx.Logger); Stopwatch Timer; const auto _ = MakeGuard([&] { @@ -6388,7 +6396,7 @@ public: { ZEN_TRACE_CPU("Store::Oplog::GetUnusedReferences"); - auto Log = [&Ctx]() { return Ctx.Logger; }; + ZEN_SCOPED_LOG(Ctx.Logger); const size_t InitialCount = IoCids.size(); size_t UsedCount = InitialCount; @@ -6414,6 +6422,7 @@ public: return UnusedReferences; } + LoggerRef Log() { return m_Project->Log(); } ProjectStore& m_ProjectStore; Ref<ProjectStore::Project> m_Project; std::string m_OplogId; @@ -6429,7 +6438,7 @@ ProjectStore::CreateReferenceCheckers(GcCtx& Ctx) { ZEN_TRACE_CPU("Store::CreateReferenceCheckers"); - auto Log = [&Ctx]() { return Ctx.Logger; }; + ZEN_SCOPED_LOG(Ctx.Logger); size_t ProjectCount = 0; size_t OplogCount = 0; @@ -6491,11 +6500,9 @@ ProjectStore::CreateReferenceCheckers(GcCtx& Ctx) std::vector<RwLock::SharedLockScope> ProjectStore::LockState(GcCtx& Ctx) { + ZEN_UNUSED(Ctx); ZEN_TRACE_CPU("Store::LockState"); - auto Log = [&Ctx]() { return Ctx.Logger; }; - ZEN_UNUSED(Log); - std::vector<RwLock::SharedLockScope> Locks; Locks.emplace_back(RwLock::SharedLockScope(m_ProjectsLock)); for (auto& ProjectIt : m_Projects) @@ -6527,7 +6534,7 @@ public: { ZEN_TRACE_CPU("Store::Validate"); - auto Log = [&Ctx]() { return Ctx.Logger; }; + ZEN_SCOPED_LOG(Ctx.Logger); ProjectStore::Oplog::ValidationResult Result; @@ -6626,9 +6633,6 @@ ProjectStore::CreateReferenceValidators(GcCtx& Ctx) return {}; } - auto Log = [&Ctx]() { return Ctx.Logger; }; - ZEN_UNUSED(Log); - DiscoverProjects(); std::vector<std::pair<std::string, std::string>> Oplogs; @@ -8243,8 +8247,7 @@ TEST_CASE("project.store.partial.read") { uint64_t ModificationTag = 0; - auto Result = ProjectStore.GetChunkRange(Log(), - *Project1, + auto Result = ProjectStore.GetChunkRange(*Project1, *Oplog1, Attachments[OpIds[1]][0].first, 0, @@ -8259,8 +8262,7 @@ TEST_CASE("project.store.partial.read") CompressedBuffer Attachment = CompressedBuffer::FromCompressed(Result.Chunk, RawHash, RawSize); CHECK(RawSize == Attachments[OpIds[1]][0].second.DecodeRawSize()); - auto Result2 = ProjectStore.GetChunkRange(Log(), - *Project1, + auto Result2 = ProjectStore.GetChunkRange(*Project1, *Oplog1, Attachments[OpIds[1]][0].first, 0, @@ -8273,8 +8275,7 @@ TEST_CASE("project.store.partial.read") { uint64_t FullChunkModificationTag = 0; { - auto Result = ProjectStore.GetChunkRange(Log(), - *Project1, + auto Result = ProjectStore.GetChunkRange(*Project1, *Oplog1, Attachments[OpIds[2]][1].first, 0, @@ -8287,8 +8288,7 @@ TEST_CASE("project.store.partial.read") Attachments[OpIds[2]][1].second.DecodeRawSize()); } { - auto Result = ProjectStore.GetChunkRange(Log(), - *Project1, + auto Result = ProjectStore.GetChunkRange(*Project1, *Oplog1, Attachments[OpIds[2]][1].first, 0, @@ -8301,8 +8301,7 @@ TEST_CASE("project.store.partial.read") { uint64_t PartialChunkModificationTag = 0; { - auto Result = ProjectStore.GetChunkRange(Log(), - *Project1, + auto Result = ProjectStore.GetChunkRange(*Project1, *Oplog1, Attachments[OpIds[2]][1].first, 5, @@ -8325,8 +8324,7 @@ TEST_CASE("project.store.partial.read") } { - auto Result = ProjectStore.GetChunkRange(Log(), - *Project1, + auto Result = ProjectStore.GetChunkRange(*Project1, *Oplog1, Attachments[OpIds[2]][1].first, 0, |