aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-09-26 22:07:11 +0200
committerStefan Boberg <[email protected]>2021-09-26 22:07:11 +0200
commit9e7d8c9f4b47cc6ca9bdcc79282c0144a797110e (patch)
treea5f2fe03725913ea85efa93c1c05300f2836beb1
parentAdded http_requests logger for (optionally) logging HTTP requests (diff)
downloadzen-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.cpp51
-rw-r--r--zenstore/include/zenstore/caslog.h10
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>