From 6630a1e8448c633e4abaa8f5903f11cac6f433a7 Mon Sep 17 00:00:00 2001 From: Ben Woosley Date: Wed, 8 Jun 2022 15:48:58 -0500 Subject: [PATCH] Add warning on first startup if free disk space is less than necessary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To accommodate the expected blocks data. Co-authored-by: Antoine Poinsot Co-authored-by: benthecarman Co-authored-by: Justin Litchfield Co-authored-by: Liran Cohen Co-authored-by: Ryan Loomba Co-authored-by: Buck Perley Co-authored-by: bajjer Co-authored-by: Suhail Saqan Co-authored-by: Christopher Sweeney Co-authored-by: Alyssa Co-authored-by: Ben Schroth Co-authored-by: Jason Hester Co-authored-by: Matt Clough Co-authored-by: Elise Schedler Co-authored-by: ghander Co-authored-by: PopeLaz Co-authored-by: Aurèle Oulès --- src/init.cpp | 20 ++++++++++++++++++-- test/functional/p2p_dos_header_tree.py | 4 ++-- test/functional/wallet_crosschain.py | 4 ++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 25b40c6c6eb..2dc7ff42540 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1569,6 +1569,24 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) return false; } + int chain_active_height = WITH_LOCK(cs_main, return chainman.ActiveChain().Height()); + + // On first startup, warn on low block storage space + if (!fReindex && !fReindexChainState && chain_active_height <= 1) { + uint64_t additional_bytes_needed = fPruneMode ? nPruneTarget + : chainparams.AssumedBlockchainSize() * 1024 * 1024 * 1024; + + if (!CheckDiskSpace(args.GetBlocksDirPath(), additional_bytes_needed)) { + InitWarning(strprintf(_( + "Disk space for %s may not accommodate the block files. " \ + "Approximately %u GB of data will be stored in this directory." + ), + fs::quoted(fs::PathToString(args.GetBlocksDirPath())), + chainparams.AssumedBlockchainSize() + )); + } + } + // Either install a handler to notify us when genesis activates, or set fHaveGenesis directly. // No locking, as this happens before any background thread is started. boost::signals2::connection block_notify_genesis_wait_connection; @@ -1618,8 +1636,6 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) // ********************************************************* Step 12: start node - int chain_active_height; - //// debug print { LOCK(cs_main); diff --git a/test/functional/p2p_dos_header_tree.py b/test/functional/p2p_dos_header_tree.py index 7e269945118..1f904644fc6 100755 --- a/test/functional/p2p_dos_header_tree.py +++ b/test/functional/p2p_dos_header_tree.py @@ -22,7 +22,7 @@ class RejectLowDifficultyHeadersTest(BitcoinTestFramework): self.setup_clean_chain = True self.chain = 'testnet3' # Use testnet chain because it has an early checkpoint self.num_nodes = 2 - self.extra_args = [["-minimumchainwork=0x0"], ["-minimumchainwork=0x0"]] + self.extra_args = [["-minimumchainwork=0x0", '-prune=550']] * self.num_nodes def add_options(self, parser): parser.add_argument( @@ -63,7 +63,7 @@ class RejectLowDifficultyHeadersTest(BitcoinTestFramework): self.log.info("Feed all fork headers (succeeds without checkpoint)") # On node 0 it succeeds because checkpoints are disabled - self.restart_node(0, extra_args=['-nocheckpoints', "-minimumchainwork=0x0"]) + self.restart_node(0, extra_args=['-nocheckpoints', "-minimumchainwork=0x0", '-prune=550']) peer_no_checkpoint = self.nodes[0].add_p2p_connection(P2PInterface()) peer_no_checkpoint.send_and_ping(msg_headers(self.headers_fork)) assert { diff --git a/test/functional/wallet_crosschain.py b/test/functional/wallet_crosschain.py index b6d0c87985f..c0047542ed3 100755 --- a/test/functional/wallet_crosschain.py +++ b/test/functional/wallet_crosschain.py @@ -21,7 +21,7 @@ class WalletCrossChain(BitcoinTestFramework): # Switch node 1 to testnet before starting it. self.nodes[1].chain = 'testnet3' - self.nodes[1].extra_args = ['-maxconnections=0'] # disable testnet sync + self.nodes[1].extra_args = ['-maxconnections=0', '-prune=550'] # disable testnet sync with open(self.nodes[1].bitcoinconf, 'r', encoding='utf8') as conf: conf_data = conf.read() with open (self.nodes[1].bitcoinconf, 'w', encoding='utf8') as conf: @@ -51,7 +51,7 @@ class WalletCrossChain(BitcoinTestFramework): if not self.options.descriptors: self.log.info("Override cross-chain wallet load protection") self.stop_nodes() - self.start_nodes([['-walletcrosschain']] * self.num_nodes) + self.start_nodes([['-walletcrosschain', '-prune=550']] * self.num_nodes) self.nodes[0].loadwallet(node1_wallet) self.nodes[1].loadwallet(node0_wallet)