aboutsummaryrefslogtreecommitdiff
path: root/src/flatfile.cpp
diff options
context:
space:
mode:
authorJim Posen <jim.posen@gmail.com>2019-01-06 11:27:31 -0800
committerJim Posen <jim.posen@gmail.com>2019-02-22 17:38:45 -0800
commit992404b31ed2f8cabeed59d074552f0ae10fda94 (patch)
tree3213de9eb432c4ce86c87970dd2bde8905d1042d /src/flatfile.cpp
parente2d2abb99fe353ffc2ff3bc1ff578fad31065335 (diff)
validation: Refactor block file pre-allocation into FlatFileSeq.
Diffstat (limited to 'src/flatfile.cpp')
-rw-r--r--src/flatfile.cpp27
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;
+}