diff options
| author | Dan Engelbrecht <[email protected]> | 2024-08-06 14:13:15 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2024-08-06 14:13:15 +0200 |
| commit | ce8eec0b0dd7d90b37caef9aa055bc25e15338b0 (patch) | |
| tree | d4ed9168ffc21b2e4a780ed12cee30901b493b86 /src/zencore/iobuffer.cpp | |
| parent | changelog (#99) (diff) | |
| download | zen-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.cpp | 70 |
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 |