diff options
| author | Stefan Boberg <[email protected]> | 2023-10-05 16:45:45 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-10-05 16:45:45 +0200 |
| commit | 9d8d68661205e955bf096f84f27c7e23bba5187a (patch) | |
| tree | a4ebf0273a8245ffafb737fc3ecc536d6d98f28f /src | |
| parent | fixed issue where IoBufferBuilder::ReadFromFileMaybe loses content type (#450) (diff) | |
| download | zen-9d8d68661205e955bf096f84f27c7e23bba5187a.tar.xz zen-9d8d68661205e955bf096f84f27c7e23bba5187a.zip | |
ZenCacheMemoryLayer should always store values using memory buffers (#451)
this change fixes a problem where the memory cache layer can inadvertently prevent underlying block store files from being deleted
* ensure we get memory buffers on all paths
* added more context to error in IoBufferBuilder::ReadFromFileMaybe
* fixed problematic pread call success check in IoBufferBuilder::ReadFromFileMaybe which would always report failure on Linux/MacOS
Diffstat (limited to 'src')
| -rw-r--r-- | src/zencore/iobuffer.cpp | 7 | ||||
| -rw-r--r-- | src/zenserver/cache/cachememorylayer.cpp | 7 |
2 files changed, 9 insertions, 5 deletions
diff --git a/src/zencore/iobuffer.cpp b/src/zencore/iobuffer.cpp index 82ead42f0..9043d4d4c 100644 --- a/src/zencore/iobuffer.cpp +++ b/src/zencore/iobuffer.cpp @@ -557,14 +557,17 @@ IoBufferBuilder::ReadFromFileMaybe(const IoBuffer& InBuffer) #else int Fd = int(intptr_t(FileRef.FileHandle)); int Result = pread(Fd, OutBuffer.MutableData(), size_t(FileRef.FileChunkSize), off_t(FileRef.FileChunkOffset)); - bool Success = (Result < 0); + bool Success = (Result >= 0); uint32_t dwNumberOfBytesRead = uint32_t(Result); #endif if (!Success) { - ThrowLastError("ReadFile failed in IoBufferBuilder::ReadFromFileMaybe"); + ThrowLastError(fmt::format("file read failed in IoBufferBuilder::ReadFromFileMaybe (handle: {}, offset: {}, length: {})", + intptr_t(FileRef.FileHandle), + FileRef.FileChunkOffset, + FileRef.FileChunkSize)); } ZEN_ASSERT(dwNumberOfBytesRead == FileRef.FileChunkSize); diff --git a/src/zenserver/cache/cachememorylayer.cpp b/src/zenserver/cache/cachememorylayer.cpp index d48ee5aa8..cae3b457e 100644 --- a/src/zenserver/cache/cachememorylayer.cpp +++ b/src/zenserver/cache/cachememorylayer.cpp @@ -404,7 +404,7 @@ ZenCacheMemoryLayer::CacheBucket::Put(const IoHash& HashKey, const ZenCacheValue BucketPayload& Payload = m_Payloads[EntryIndex]; OldPayloadSize = Payload.Payload.GetSize(); - Payload.Payload = Value.Value; + Payload.Payload = IoBufferBuilder::ReadFromFileMaybe(Value.Value); Payload.RawHash = Value.RawHash; Payload.RawSize = gsl::narrow<uint32_t>(Value.RawSize); m_AccessTimes[EntryIndex] = AccessTime; @@ -417,8 +417,9 @@ ZenCacheMemoryLayer::CacheBucket::Put(const IoHash& HashKey, const ZenCacheValue else { uint32_t EntryIndex = gsl::narrow<uint32_t>(m_Payloads.size()); - m_Payloads.emplace_back( - BucketPayload{.Payload = Value.Value, .RawSize = gsl::narrow<uint32_t>(Value.RawSize), .RawHash = Value.RawHash}); + m_Payloads.emplace_back(BucketPayload{.Payload = IoBufferBuilder::ReadFromFileMaybe(Value.Value), + .RawSize = gsl::narrow<uint32_t>(Value.RawSize), + .RawHash = Value.RawHash}); m_AccessTimes.emplace_back(AccessTime); m_CacheMap.insert_or_assign(HashKey, EntryIndex); } |