aboutsummaryrefslogtreecommitdiff
path: root/src/zenutil
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-09-04 09:14:46 -0400
committerGitHub <[email protected]>2023-09-04 15:14:46 +0200
commitf43bee9eed90ee5175f9b3e0dd2a7b7d4b3145e4 (patch)
tree02c1ed9658eadfdfd13795b932e4743b566a5941 /src/zenutil
parentadd `--write-config` to zenserver options (#382) (diff)
downloadzen-f43bee9eed90ee5175f9b3e0dd2a7b7d4b3145e4.tar.xz
zen-f43bee9eed90ee5175f9b3e0dd2a7b7d4b3145e4.zip
retry file create (#383)
* add retry logic when creating files * only write disk usage log if disk writes are allowed * changelog
Diffstat (limited to 'src/zenutil')
-rw-r--r--src/zenutil/basicfile.cpp16
-rw-r--r--src/zenutil/include/zenutil/basicfile.h1
2 files changed, 17 insertions, 0 deletions
diff --git a/src/zenutil/basicfile.cpp b/src/zenutil/basicfile.cpp
index 12d9cf950..84e8bed85 100644
--- a/src/zenutil/basicfile.cpp
+++ b/src/zenutil/basicfile.cpp
@@ -128,6 +128,22 @@ BasicFile::Open(const std::filesystem::path& FileName, Mode InMode, std::error_c
}
void
+BasicFile::Open(const std::filesystem::path& FileName, Mode Mode, std::function<bool(std::error_code& Ec)>&& RetryCallback)
+{
+ std::error_code Ec;
+ Open(FileName, Mode, Ec);
+ while (Ec && RetryCallback(Ec))
+ {
+ Ec.clear();
+ Open(FileName, Mode, Ec);
+ }
+ if (Ec)
+ {
+ throw std::system_error(Ec, fmt::format("failed to open file '{}', mode: {:x}", FileName, uint32_t(Mode)));
+ }
+}
+
+void
BasicFile::Close()
{
if (m_FileHandle)
diff --git a/src/zenutil/include/zenutil/basicfile.h b/src/zenutil/include/zenutil/basicfile.h
index 5a27befd9..7cf8b05db 100644
--- a/src/zenutil/include/zenutil/basicfile.h
+++ b/src/zenutil/include/zenutil/basicfile.h
@@ -49,6 +49,7 @@ public:
void Open(const std::filesystem::path& FileName, Mode Mode);
void Open(const std::filesystem::path& FileName, Mode Mode, std::error_code& Ec);
+ void Open(const std::filesystem::path& FileName, Mode Mode, std::function<bool(std::error_code& Ec)>&& RetryCallback);
void Close();
void Read(void* Data, uint64_t Size, uint64_t FileOffset);
IoBuffer ReadRange(uint64_t FileOffset, uint64_t ByteCount);