aboutsummaryrefslogtreecommitdiff
path: root/src/zenstore/projectstore.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zenstore/projectstore.cpp')
-rw-r--r--src/zenstore/projectstore.cpp86
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,