diff options
author | Jim Posen <jim.posen@gmail.com> | 2019-01-06 11:27:31 -0800 |
---|---|---|
committer | Jim Posen <jim.posen@gmail.com> | 2019-02-22 17:38:45 -0800 |
commit | 992404b31ed2f8cabeed59d074552f0ae10fda94 (patch) | |
tree | 3213de9eb432c4ce86c87970dd2bde8905d1042d /src/flatfile.cpp | |
parent | e2d2abb99fe353ffc2ff3bc1ff578fad31065335 (diff) |
validation: Refactor block file pre-allocation into FlatFileSeq.
Diffstat (limited to 'src/flatfile.cpp')
-rw-r--r-- | src/flatfile.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/flatfile.cpp b/src/flatfile.cpp index 535f4eda91..d9fd4041b7 100644 --- a/src/flatfile.cpp +++ b/src/flatfile.cpp @@ -7,6 +7,7 @@ #include <flatfile.h> #include <logging.h> #include <tinyformat.h> +#include <util/system.h> FlatFileSeq::FlatFileSeq(fs::path dir, const char* prefix, size_t chunk_size) : m_dir(std::move(dir)), @@ -45,3 +46,29 @@ FILE* FlatFileSeq::Open(const CDiskBlockPos& pos, bool fReadOnly) } return file; } + +size_t FlatFileSeq::Allocate(const CDiskBlockPos& pos, size_t add_size, bool& out_of_space) +{ + out_of_space = false; + + unsigned int n_old_chunks = (pos.nPos + m_chunk_size - 1) / m_chunk_size; + unsigned int n_new_chunks = (pos.nPos + add_size + m_chunk_size - 1) / m_chunk_size; + if (n_new_chunks > n_old_chunks) { + size_t old_size = pos.nPos; + size_t new_size = n_new_chunks * m_chunk_size; + size_t inc_size = new_size - old_size; + + if (CheckDiskSpace(m_dir, inc_size)) { + FILE *file = Open(pos); + if (file) { + LogPrintf("Pre-allocating up to position 0x%x in %s%05u.dat\n", new_size, m_prefix, pos.nFile); + AllocateFileRange(file, pos.nPos, inc_size); + fclose(file); + return inc_size; + } + } else { + out_of_space = true; + } + } + return 0; +} |