aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/iobuffer.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-08-06 14:13:15 +0200
committerGitHub Enterprise <[email protected]>2024-08-06 14:13:15 +0200
commitce8eec0b0dd7d90b37caef9aa055bc25e15338b0 (patch)
treed4ed9168ffc21b2e4a780ed12cee30901b493b86 /src/zencore/iobuffer.cpp
parentchangelog (#99) (diff)
downloadzen-ce8eec0b0dd7d90b37caef9aa055bc25e15338b0.tar.xz
zen-ce8eec0b0dd7d90b37caef9aa055bc25e15338b0.zip
improve iobuffer read error logs (#100)
* Make IoBufferExtendedCore::Materialize error reporting match Materialize
Diffstat (limited to 'src/zencore/iobuffer.cpp')
-rw-r--r--src/zencore/iobuffer.cpp70
1 files changed, 47 insertions, 23 deletions
diff --git a/src/zencore/iobuffer.cpp b/src/zencore/iobuffer.cpp
index 33762bdb7..fdee4e5e5 100644
--- a/src/zencore/iobuffer.cpp
+++ b/src/zencore/iobuffer.cpp
@@ -349,18 +349,19 @@ IoBufferExtendedCore::Materialize() const
if (Error || (BytesRead != m_DataBytes))
{
std::error_code DummyEc;
- ZEN_WARN("ReadFile/pread failed (offset {:#x}, size {:#x}) file: '{}' (size {:#x}), {}",
+ ZEN_WARN("IoBufferExtendedCore::Materialize: ReadFile/pread failed (offset {:#x}, size {:#x}) file: '{}' (size {:#x}), {}",
m_FileOffset,
m_DataBytes,
zen::PathFromHandle(m_FileHandle, DummyEc),
zen::FileSizeFromHandle(m_FileHandle),
GetSystemErrorAsString(Error));
- throw std::system_error(std::error_code(Error, std::system_category()),
- fmt::format("ReadFile/pread failed (offset {:#x}, size {:#x}) file: '{}' (size {:#x})",
- m_FileOffset,
- m_DataBytes,
- PathFromHandle(m_FileHandle, DummyEc),
- FileSizeFromHandle(m_FileHandle)));
+ throw std::system_error(
+ std::error_code(Error, std::system_category()),
+ fmt::format("IoBufferExtendedCore::Materialize: ReadFile/pread failed (offset {:#x}, size {:#x}) file: '{}' (size {:#x})",
+ m_FileOffset,
+ m_DataBytes,
+ PathFromHandle(m_FileHandle, DummyEc),
+ FileSizeFromHandle(m_FileHandle)));
}
m_Flags.fetch_or(NewFlags, std::memory_order_release);
@@ -555,37 +556,60 @@ IoBufferBuilder::ReadFromFileMaybe(const IoBuffer& InBuffer)
{
IoBuffer OutBuffer(FileRef.FileChunkSize);
+ int32_t Error = 0;
+ size_t BytesRead = 0;
+
+ const uint64_t NumberOfBytesToRead = FileRef.FileChunkSize;
+ const uint64_t FileOffset = FileRef.FileChunkOffset;
+
#if ZEN_PLATFORM_WINDOWS
OVERLAPPED Ovl{};
- const uint64_t NumberOfBytesToRead = FileRef.FileChunkSize;
- const uint64_t& FileOffset = FileRef.FileChunkOffset;
-
Ovl.Offset = DWORD(FileOffset & 0xffff'ffffu);
Ovl.OffsetHigh = DWORD(FileOffset >> 32);
DWORD dwNumberOfBytesRead = 0;
BOOL Success = ::ReadFile(FileRef.FileHandle, OutBuffer.MutableData(), DWORD(NumberOfBytesToRead), &dwNumberOfBytesRead, &Ovl);
+ if (Success)
+ {
+ BytesRead = size_t(dwNumberOfBytesRead);
+ }
+ else
+ {
+ Error = zen::GetLastError();
+ }
#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);
-
- uint32_t dwNumberOfBytesRead = uint32_t(Result);
+ int Fd = int(intptr_t(FileRef.FileHandle));
+ ssize_t ReadResult = pread(Fd, OutBuffer.MutableData(), size_t(NumberOfBytesToRead), off_t(FileOffset));
+ if (ReadResult != -1)
+ {
+ BytesRead = size_t(ReadResult);
+ }
+ else
+ {
+ Error = zen::GetLastError();
+ }
#endif
- if (!Success)
+ if (Error || (BytesRead != NumberOfBytesToRead))
{
- ThrowLastError(fmt::format("file read failed in IoBufferBuilder::ReadFromFileMaybe (handle: {}, offset: {}, length: {})",
- intptr_t(FileRef.FileHandle),
- FileRef.FileChunkOffset,
- FileRef.FileChunkSize));
+ std::error_code DummyEc;
+ ZEN_WARN("IoBufferBuilder::ReadFromFileMaybe: ReadFile/pread failed (offset {:#x}, size {:#x}) file: '{}' (size {:#x}), {}",
+ FileOffset,
+ NumberOfBytesToRead,
+ zen::PathFromHandle(FileRef.FileHandle, DummyEc),
+ zen::FileSizeFromHandle(FileRef.FileHandle),
+ GetSystemErrorAsString(Error));
+ throw std::system_error(
+ std::error_code(Error, std::system_category()),
+ fmt::format("IoBufferBuilder::ReadFromFileMaybe: ReadFile/pread failed (offset {:#x}, size {:#x}) file: '{}' (size {:#x})",
+ FileOffset,
+ NumberOfBytesToRead,
+ PathFromHandle(FileRef.FileHandle, DummyEc),
+ FileSizeFromHandle(FileRef.FileHandle)));
}
- ZEN_ASSERT(dwNumberOfBytesRead == FileRef.FileChunkSize);
-
OutBuffer.SetContentType(InBuffer.GetContentType());
-
return OutBuffer;
}
else