aboutsummaryrefslogtreecommitdiff
path: root/zenstore/compactcas.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2022-03-23 00:02:39 +0100
committerDan Engelbrecht <[email protected]>2022-03-31 11:29:27 +0200
commitc99a64ed2ee559c1e720e85babec4bb8ba82d09a (patch)
treec1f06238ed869d5e5ead0e2e132820afcce890b2 /zenstore/compactcas.cpp
parentMove FormatHex and ParseHex to zencore/string (diff)
downloadzen-c99a64ed2ee559c1e720e85babec4bb8ba82d09a.tar.xz
zen-c99a64ed2ee559c1e720e85babec4bb8ba82d09a.zip
Use simpler locking for ChunkFile
Diffstat (limited to 'zenstore/compactcas.cpp')
-rw-r--r--zenstore/compactcas.cpp47
1 files changed, 21 insertions, 26 deletions
diff --git a/zenstore/compactcas.cpp b/zenstore/compactcas.cpp
index d7929e42a..c49bfc8bf 100644
--- a/zenstore/compactcas.cpp
+++ b/zenstore/compactcas.cpp
@@ -74,8 +74,8 @@ struct CasContainerStrategy::ChunkBlock
void StreamByteRange(uint64_t FileOffset, uint64_t Size, std::function<void(const void* Data, uint64_t Size)>&& ChunkFun);
private:
+ void InternalOpen();
const std::filesystem::path m_Path;
- std::atomic<bool> m_IsOpened;
RwLock m_OpenLock;
BasicFile m_File;
IoBuffer m_IoBuffer;
@@ -87,10 +87,8 @@ CasContainerStrategy::ChunkBlock::ChunkBlock(const std::filesystem::path& BlockP
CasContainerStrategy::ChunkBlock::~ChunkBlock()
{
- if (m_IsOpened.load(std::memory_order_acquire))
- {
- m_File.Detach();
- }
+ RwLock::ExclusiveLockScope _(m_OpenLock);
+ m_File.Detach();
}
const std::filesystem::path&
@@ -100,31 +98,28 @@ CasContainerStrategy::ChunkBlock::GetPath() const
}
void
-CasContainerStrategy::ChunkBlock::Open()
+CasContainerStrategy::ChunkBlock::InternalOpen()
{
- // Open can have a race if multiple requests wants to read the same block
- // Create or ~ChunkBlock() can not have a race so we only need to guard Open()
- if (m_IsOpened.load(std::memory_order_acquire))
- {
- return;
- }
-
- RwLock::ExclusiveLockScope _(m_OpenLock);
- if (m_IsOpened.load(std::memory_order_acquire))
+ if (m_File.Handle())
{
return;
}
-
m_File.Open(m_Path, false);
void* FileHandle = m_File.Handle();
m_IoBuffer = IoBuffer(IoBuffer::File, FileHandle, 0, m_File.FileSize());
- m_IsOpened.store(true, std::memory_order_release);
+}
+
+void
+CasContainerStrategy::ChunkBlock::Open()
+{
+ RwLock::ExclusiveLockScope _(m_OpenLock);
+ InternalOpen();
}
void
CasContainerStrategy::ChunkBlock::Create(uint64_t InitialSize)
{
- ZEN_ASSERT(!m_IsOpened.load(std::memory_order_acquire));
+ RwLock::ExclusiveLockScope _(m_OpenLock);
auto ParentPath = m_Path.parent_path();
if (!std::filesystem::is_directory(ParentPath))
@@ -139,13 +134,12 @@ CasContainerStrategy::ChunkBlock::Create(uint64_t InitialSize)
}
void* FileHandle = m_File.Handle();
m_IoBuffer = IoBuffer(IoBuffer::File, FileHandle, 0, InitialSize);
- m_IsOpened.store(true, std::memory_order_release);
}
uint64_t
CasContainerStrategy::ChunkBlock::FileSize()
{
- ZEN_ASSERT(m_IsOpened.load(std::memory_order_acquire));
+ RwLock::SharedLockScope _(m_OpenLock);
return m_File.FileSize();
}
@@ -153,7 +147,7 @@ void
CasContainerStrategy::ChunkBlock::MarkAsDeleteOnClose(std::error_code& Ec)
{
RwLock::ExclusiveLockScope _(m_OpenLock);
- if (m_IsOpened.load(std::memory_order::memory_order_acquire))
+ if (m_File.Handle())
{
m_File.MarkAsDeleteOnClose(Ec);
return;
@@ -168,28 +162,29 @@ CasContainerStrategy::ChunkBlock::MarkAsDeleteOnClose(std::error_code& Ec)
IoBuffer
CasContainerStrategy::ChunkBlock::GetChunk(uint64_t Offset, uint64_t Size)
{
- Open();
+ InternalOpen();
return IoBuffer(m_IoBuffer, Offset, Size);
}
void
CasContainerStrategy::ChunkBlock::Read(void* Data, uint64_t Size, uint64_t FileOffset)
{
- ZEN_ASSERT(m_IsOpened.load(std::memory_order_acquire));
+ RwLock::SharedLockScope _(m_OpenLock);
m_File.Read(Data, Size, FileOffset);
}
void
CasContainerStrategy::ChunkBlock::Write(const void* Data, uint64_t Size, uint64_t FileOffset)
{
- ZEN_ASSERT(m_IsOpened.load(std::memory_order_acquire));
+ RwLock::SharedLockScope _(m_OpenLock);
m_File.Write(Data, Size, FileOffset);
}
void
CasContainerStrategy::ChunkBlock::Flush()
{
- if (!m_IsOpened.load(std::memory_order_acquire))
+ RwLock::ExclusiveLockScope _(m_OpenLock);
+ if (!m_File.Handle())
{
return;
}
@@ -201,7 +196,7 @@ CasContainerStrategy::ChunkBlock::StreamByteRange(uint64_t FileOffse
uint64_t Size,
std::function<void(const void* Data, uint64_t Size)>&& ChunkFun)
{
- ZEN_ASSERT(m_IsOpened.load(std::memory_order_acquire));
+ RwLock::SharedLockScope _(m_OpenLock);
m_File.StreamByteRange(FileOffset, Size, std::move(ChunkFun));
}