Skip to content

Commit

Permalink
init: Take lock on blocks directory in BlockManager ctor
Browse files Browse the repository at this point in the history
This moves the responsibility of taking the lock for the blocks
directory into the BlockManager. Use the DirectoryLock wrapper to ensure
it is the first resource to be acquired and is released again after use.

This is relevant for the kernel library where the lock should be taken
even if the user fails to explicitly do so.
  • Loading branch information
TheCharlatan committed Feb 16, 2025
1 parent 1d0cadd commit aab070a
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 16 deletions.
14 changes: 3 additions & 11 deletions src/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -1129,19 +1124,16 @@ 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()
{
// 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)
Expand Down
7 changes: 4 additions & 3 deletions src/init/common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
4 changes: 3 additions & 1 deletion src/node/blockstorage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include <util/batchpriority.h>
#include <util/check.h>
#include <util/fs.h>
#include <util/fs_helpers.h>
#include <util/signalinterrupt.h>
#include <util/strencodings.h>
#include <util/translation.h>
Expand Down Expand Up @@ -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}},
Expand Down
3 changes: 2 additions & 1 deletion src/node/blockstorage.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <sync.h>
#include <uint256.h>
#include <util/fs.h>
#include <util/fs_helpers.h>
#include <util/hasher.h>

#include <array>
Expand Down Expand Up @@ -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.
Expand All @@ -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(); }
/**
Expand Down

0 comments on commit aab070a

Please sign in to comment.