diff options
| author | Stefan Boberg <[email protected]> | 2021-09-26 22:07:11 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-09-26 22:07:11 +0200 |
| commit | 9e7d8c9f4b47cc6ca9bdcc79282c0144a797110e (patch) | |
| tree | a5f2fe03725913ea85efa93c1c05300f2836beb1 | |
| parent | Added http_requests logger for (optionally) logging HTTP requests (diff) | |
| download | zen-9e7d8c9f4b47cc6ca9bdcc79282c0144a797110e.tar.xz zen-9e7d8c9f4b47cc6ca9bdcc79282c0144a797110e.zip | |
Reimplemented CasLogFile in terms of BasicFile
This removes another ATL dependency in favour of something more platform independent
| -rw-r--r-- | zenstore/caslog.cpp | 51 | ||||
| -rw-r--r-- | zenstore/include/zenstore/caslog.h | 10 |
2 files changed, 28 insertions, 33 deletions
diff --git a/zenstore/caslog.cpp b/zenstore/caslog.cpp index dc6021544..2bac6affd 100644 --- a/zenstore/caslog.cpp +++ b/zenstore/caslog.cpp @@ -17,11 +17,8 @@ #include <gsl/gsl-lite.hpp> -#include <functional> - -struct IUnknown; // Workaround for "combaseapi.h(229): error C2187: syntax error: 'identifier' was unexpected here" when using /permissive- -#include <atlfile.h> #include <filesystem> +#include <functional> ////////////////////////////////////////////////////////////////////////// @@ -48,13 +45,12 @@ CasLogFile::Open(std::filesystem::path FileName, size_t RecordSize, bool IsCreat { m_RecordSize = RecordSize; - const DWORD dwCreationDisposition = IsCreate ? CREATE_ALWAYS : OPEN_EXISTING; + std::error_code Ec; + m_File.Open(FileName, IsCreate); - HRESULT hRes = m_File.Create(FileName.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, dwCreationDisposition); - - if (FAILED(hRes)) + if (Ec) { - throw std::system_error(GetLastError(), std::system_category(), "Failed to open log file '{}'"_format(FileName)); + throw std::system_error(Ec, "Failed to open log file '{}'"_format(FileName)); } uint64_t AppendOffset = 0; @@ -66,7 +62,7 @@ CasLogFile::Open(std::filesystem::path FileName, size_t RecordSize, bool IsCreat memcpy(Header.Magic, FileHeader::MagicSequence, sizeof Header.Magic); Header.Finalize(); - m_File.Write(&Header, sizeof Header); + m_File.Write(&Header, sizeof Header, 0); AppendOffset = sizeof(FileHeader); @@ -76,7 +72,7 @@ CasLogFile::Open(std::filesystem::path FileName, size_t RecordSize, bool IsCreat { // Validate header and log contents and prepare for appending/replay FileHeader Header; - m_File.Read(&Header, sizeof Header); + m_File.Read(&Header, sizeof Header, 0); if ((0 != memcmp(Header.Magic, FileHeader::MagicSequence, sizeof Header.Magic)) || (Header.Checksum != Header.ComputeChecksum())) { @@ -84,11 +80,8 @@ CasLogFile::Open(std::filesystem::path FileName, size_t RecordSize, bool IsCreat throw std::runtime_error("Mangled log header"); } - ULONGLONG Sz; - m_File.GetSize(Sz); - AppendOffset = Sz; - - m_Header = Header; + AppendOffset = m_File.FileSize(); + m_Header = Header; } m_AppendOffset = AppendOffset; @@ -106,8 +99,7 @@ CasLogFile::Close() void CasLogFile::Replay(std::function<void(const void*)>&& Handler) { - ULONGLONG LogFileSize; - m_File.GetSize(LogFileSize); + uint64_t LogFileSize = m_File.FileSize(); // Ensure we end up on a clean boundary const uint64_t LogBaseOffset = sizeof(FileHeader); @@ -118,18 +110,16 @@ CasLogFile::Replay(std::function<void(const void*)>&& Handler) return; } + // This should really be streaming the data rather than just + // reading it into memory, though we don't tend to get very + // large logs so it may not matter + const uint64_t LogDataSize = LogEntryCount * m_RecordSize; std::vector<uint8_t> ReadBuffer; ReadBuffer.resize(LogDataSize); - m_File.Seek(LogBaseOffset, FILE_BEGIN); - HRESULT hRes = m_File.Read(ReadBuffer.data(), gsl::narrow<DWORD>(LogDataSize)); - - if (FAILED(hRes)) - { - ThrowSystemException(hRes, "Failed to read log file"); - } + m_File.Read(ReadBuffer.data(), LogDataSize, LogBaseOffset); for (int i = 0; i < LogEntryCount; ++i) { @@ -140,11 +130,16 @@ CasLogFile::Replay(std::function<void(const void*)>&& Handler) void CasLogFile::Append(const void* DataPointer, uint64_t DataSize) { - HRESULT hRes = m_File.Write(DataPointer, gsl::narrow<DWORD>(DataSize)); + ZEN_ASSERT(DataSize == m_RecordSize); + + uint64_t AppendOffset = m_AppendOffset.fetch_add(DataSize); + + std::error_code Ec; + m_File.Write(DataPointer, gsl::narrow<DWORD>(DataSize), AppendOffset, Ec); - if (FAILED(hRes)) + if (Ec) { - ThrowSystemException(hRes, "Failed to write to log file '{}'"_format(PathFromHandle(m_File))); + throw std::system_error(Ec, "Failed to write to log file '{}'"_format(PathFromHandle(m_File.Handle()))); } } diff --git a/zenstore/include/zenstore/caslog.h b/zenstore/include/zenstore/caslog.h index 1fbda0265..00b987383 100644 --- a/zenstore/include/zenstore/caslog.h +++ b/zenstore/include/zenstore/caslog.h @@ -9,9 +9,9 @@ #include <zencore/thread.h> #include <zencore/uid.h> #include <zencore/windows.h> +#include <zenstore/basicfile.h> #include <zenstore/cas.h> -#include <atlfile.h> #include <functional> namespace zen { @@ -47,10 +47,10 @@ private: static_assert(sizeof(FileHeader) == 64); private: - CAtlFile m_File; - FileHeader m_Header; - size_t m_RecordSize = 1; - uint64_t m_AppendOffset = 0; + BasicFile m_File; + FileHeader m_Header; + size_t m_RecordSize = 1; + std::atomic<uint64_t> m_AppendOffset = 0; }; template<typename T> |