diff --git a/src/init.cpp b/src/init.cpp index d46318fd45e..9346e9e2048 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1107,11 +1107,6 @@ static bool LockDirectory(const fs::path& dir, bool probeOnly) } // no default case, so the compiler can warn about missing cases assert(false); } -static bool LockDirectories(bool probeOnly) -{ - return LockDirectory(gArgs.GetDataDirNet(), probeOnly) && \ - LockDirectory(gArgs.GetBlocksDirPath(), probeOnly); -} bool AppInitSanityChecks(const kernel::Context& kernel) { @@ -1129,7 +1124,8 @@ bool AppInitSanityChecks(const kernel::Context& kernel) // Probe the directory locks to give an early error message, if possible // We cannot hold the directory locks here, as the forking for daemon() hasn't yet happened, // and a fork will cause weird behavior to them. - return LockDirectories(true); + return LockDirectory(gArgs.GetDataDirNet(), /*probeOnly=*/true) + && LockDirectory(gArgs.GetBlocksDirPath(), /*probeOnly=*/true); } bool AppInitLockDirectories() @@ -1137,11 +1133,7 @@ bool AppInitLockDirectories() // After daemonization get the directory locks again and hold on to them until exit // This creates a slight window for a race condition to happen, however this condition is harmless: it // will at most make us exit without printing a message to console. - if (!LockDirectories(false)) { - // Detailed error printed inside LockDirectory - return false; - } - return true; + return LockDirectory(gArgs.GetDataDirNet(), /*probeOnly=*/false); } bool AppInitInterfaces(NodeContext& node) diff --git a/src/init/common.cpp b/src/init/common.cpp index bc0a2f65080..e90d34afb05 100644 --- a/src/init/common.cpp +++ b/src/init/common.cpp @@ -119,9 +119,10 @@ bool StartLogging(const ArgsManager& args) } if (!LogInstance().m_log_timestamps) - LogPrintf("Startup time: %s\n", FormatISO8601DateTime(GetTime())); - LogPrintf("Default data directory %s\n", fs::PathToString(GetDefaultDataDir())); - LogPrintf("Using data directory %s\n", fs::PathToString(gArgs.GetDataDirNet())); + LogInfo("Startup time: %s", FormatISO8601DateTime(GetTime())); + LogInfo("Default data directory %s", fs::PathToString(GetDefaultDataDir())); + LogInfo("Using data directory %s", fs::PathToString(gArgs.GetDataDirNet())); + LogInfo("Using blocks directory %s", fs::PathToString(gArgs.GetBlocksDirPath())); // Only log conf file usage message if conf file actually exists. fs::path config_file_path = args.GetConfigFilePath(); diff --git a/src/node/blockstorage.cpp b/src/node/blockstorage.cpp index 372395dd24d..e3209847556 100644 --- a/src/node/blockstorage.cpp +++ b/src/node/blockstorage.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -1165,7 +1166,8 @@ static auto InitBlocksdirXorKey(const BlockManager::Options& opts) } BlockManager::BlockManager(const util::SignalInterrupt& interrupt, Options opts) - : m_prune_mode{opts.prune_target > 0}, + : m_blocks_dir_lock{DirectoryLock(opts.blocks_dir, "blocks")}, + m_prune_mode{opts.prune_target > 0}, m_xor_key{InitBlocksdirXorKey(opts)}, m_opts{std::move(opts)}, m_block_file_seq{FlatFileSeq{m_opts.blocks_dir, "blk", m_opts.fast_prune ? 0x4000 /* 16kB */ : BLOCKFILE_CHUNK_SIZE}}, diff --git a/src/node/blockstorage.h b/src/node/blockstorage.h index 8a34efadfea..5db9aa82d67 100644 --- a/src/node/blockstorage.h +++ b/src/node/blockstorage.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -127,7 +128,6 @@ struct BlockfileCursor { std::ostream& operator<<(std::ostream& os, const BlockfileCursor& cursor); - /** * Maintains a tree of blocks (stored in `m_block_index`) which is consulted * to determine where the most-work tip is. @@ -141,6 +141,7 @@ class BlockManager friend ChainstateManager; private: + DirectoryLock m_blocks_dir_lock; const CChainParams& GetParams() const { return m_opts.chainparams; } const Consensus::Params& GetConsensus() const { return m_opts.chainparams.GetConsensus(); } /**