From 18379c80874ad6f4fa0e962dd2046e2fa7ecd287 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Sun, 27 Jan 2013 00:22:15 +0100 Subject: [PATCH] Add disk space checks before flushing CCoins cache --- src/main.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 1d881c0a..2b4acccb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1806,6 +1806,13 @@ bool SetBestChain(CValidationState &state, CBlockIndex* pindexNew) // Make sure it's successfully written to disk before changing memory structure bool fIsInitialDownload = IsInitialBlockDownload(); if (!fIsInitialDownload || pcoinsTip->GetCacheSize() > nCoinCacheSize) { + // Typical CCoins structures on disk are around 100 bytes in size. + // Pushing a new one to the database can cause it to be written + // twice (once in the log, and once in the tables). This is already + // an overestimation, as most will delete an existing entry or + // overwrite one. Still, use a conservative safety factor of 2. + if (!CheckDiskSpace(100 * 2 * 2 * pcoinsTip->GetCacheSize())) + return state.Error(); FlushBlockFile(); pblocktree->Sync(); if (!pcoinsTip->Flush())