diff options
| author | Dan Engelbrecht <[email protected]> | 2023-05-12 13:23:56 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-05-12 13:23:56 +0200 |
| commit | b6bb54c963e1748b9a24568dddd375cdb8f7e192 (patch) | |
| tree | a0fef992d1b639b8f3a9e1047bf1c9f21e214b61 /src | |
| parent | fix logic for old blocks in blockstore gc (#295) (diff) | |
| download | zen-b6bb54c963e1748b9a24568dddd375cdb8f7e192.tar.xz zen-b6bb54c963e1748b9a24568dddd375cdb8f7e192.zip | |
better logging/exception when reading file in IoBuffer::Materialize fails (#294)
* better logging/exception when reading file in IoBuffer::Materialize fails
* changelog
Diffstat (limited to 'src')
| -rw-r--r-- | src/zencore/iobuffer.cpp | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/src/zencore/iobuffer.cpp b/src/zencore/iobuffer.cpp index e28bf11b2..96653c670 100644 --- a/src/zencore/iobuffer.cpp +++ b/src/zencore/iobuffer.cpp @@ -283,6 +283,8 @@ IoBufferExtendedCore::Materialize() const { AllocateBuffer(m_DataBytes, sizeof(void*)); NewFlags |= kIsOwnedByThis; + int32_t Error = 0; + size_t BytesRead = 0; #if ZEN_PLATFORM_WINDOWS OVERLAPPED Ovl{}; @@ -291,16 +293,43 @@ IoBufferExtendedCore::Materialize() const Ovl.OffsetHigh = DWORD(m_FileOffset >> 32); DWORD dwNumberOfBytesRead = 0; - BOOL Success = ::ReadFile(m_FileHandle, (void*)m_DataPtr, DWORD(m_DataBytes), &dwNumberOfBytesRead, &Ovl); - - ZEN_ASSERT(Success); - ZEN_ASSERT(dwNumberOfBytesRead == m_DataBytes); + BOOL Success = ::ReadFile(m_FileHandle, (void*)m_DataPtr, DWORD(m_DataBytes), &dwNumberOfBytesRead, &Ovl) == TRUE; + if (Success) + { + BytesRead = size_t(dwNumberOfBytesRead); + } + else + { + Error = zen::GetLastError(); + } #else static_assert(sizeof(off_t) >= sizeof(uint64_t), "sizeof(off_t) does not support large files"); - int Fd = int(uintptr_t(m_FileHandle)); - int BytesRead = pread(Fd, (void*)m_DataPtr, m_DataBytes, m_FileOffset); - bool Success = (BytesRead > 0); + int Fd = int(uintptr_t(m_FileHandle)); + int ReadResult = pread(Fd, (void*)m_DataPtr, m_DataBytes, m_FileOffset); + if (ReadResult != -1) + { + BytesRead = size_t(ReadResult); + } + else + { + Error = zen::GetLastError(); + } #endif // ZEN_PLATFORM_WINDOWS + if (Error || (BytesRead != m_DataBytes)) + { + ZEN_ERROR("ReadFile/pread failed (offset {:#x}, size {:#x}) file: '{}' (size {:#x}), {}", + m_FileOffset, + m_DataBytes, + zen::PathFromHandle(m_FileHandle), + 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), + FileSizeFromHandle(m_FileHandle))); + } m_Flags.fetch_or(NewFlags, std::memory_order_release); return; @@ -357,7 +386,7 @@ IoBufferExtendedCore::Materialize() const CloseHandle(NewMmapHandle); #endif // ZEN_PLATFORM_WINDOWS - ZEN_ERROR("MapViewOfFile failed (offset {:#x}, size {:#x}) file: '{}' (size {:#x}), {}", + ZEN_ERROR("MapViewOfFile/mmap failed (offset {:#x}, size {:#x}) file: '{}' (size {:#x}), {}", MapOffset, MapSize, zen::PathFromHandle(m_FileHandle), |