mirror of
https://github.com/Retropex/bitcoin.git
synced 2025-05-29 13:32:33 +02:00
Merge bitcoin/bitcoin#28946: init: don't delete PID file if it was not generated
8f6ab31863
init: don't delete PID file if it was not generated (willcl-ark) Pull request description: In a similar vein to #28784, if a second `bitcoind` is started using the same datadir it will fail to start up, but during shutdown remove the PID file from the first `bitcoind` instance. ACKs for top commit: achow101: ACK8f6ab31863
andrewtoth: ACK8f6ab31863
romanz: ACK8f6ab31863
Tree-SHA512: c9af703cbfa179d33ef9580a51e86c1b0acbd28daa18c8d2e5e5ff796ab4d3e2009a962a47e6046a0e5ece936f8a06ee8af5fdf8ff4ae1e52cbcdbec4b942271
This commit is contained in:
commit
afdc4c3a30
25
src/init.cpp
25
src/init.cpp
@ -155,6 +155,11 @@ static const char* DEFAULT_ASMAP_FILENAME="ip_asn.map";
|
|||||||
* The PID file facilities.
|
* The PID file facilities.
|
||||||
*/
|
*/
|
||||||
static const char* BITCOIN_PID_FILENAME = "bitcoind.pid";
|
static const char* BITCOIN_PID_FILENAME = "bitcoind.pid";
|
||||||
|
/**
|
||||||
|
* True if this process has created a PID file.
|
||||||
|
* Used to determine whether we should remove the PID file on shutdown.
|
||||||
|
*/
|
||||||
|
static bool g_generated_pid{false};
|
||||||
|
|
||||||
static fs::path GetPidFile(const ArgsManager& args)
|
static fs::path GetPidFile(const ArgsManager& args)
|
||||||
{
|
{
|
||||||
@ -170,12 +175,24 @@ static fs::path GetPidFile(const ArgsManager& args)
|
|||||||
#else
|
#else
|
||||||
tfm::format(file, "%d\n", getpid());
|
tfm::format(file, "%d\n", getpid());
|
||||||
#endif
|
#endif
|
||||||
|
g_generated_pid = true;
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return InitError(strprintf(_("Unable to create the PID file '%s': %s"), fs::PathToString(GetPidFile(args)), SysErrorString(errno)));
|
return InitError(strprintf(_("Unable to create the PID file '%s': %s"), fs::PathToString(GetPidFile(args)), SysErrorString(errno)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void RemovePidFile(const ArgsManager& args)
|
||||||
|
{
|
||||||
|
if (!g_generated_pid) return;
|
||||||
|
const auto pid_path{GetPidFile(args)};
|
||||||
|
if (std::error_code error; !fs::remove(pid_path, error)) {
|
||||||
|
std::string msg{error ? error.message() : "File does not exist"};
|
||||||
|
LogPrintf("Unable to remove PID file (%s): %s\n", fs::PathToString(pid_path), msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Shutdown
|
// Shutdown
|
||||||
@ -352,13 +369,7 @@ void Shutdown(NodeContext& node)
|
|||||||
node.scheduler.reset();
|
node.scheduler.reset();
|
||||||
node.kernel.reset();
|
node.kernel.reset();
|
||||||
|
|
||||||
try {
|
RemovePidFile(*node.args);
|
||||||
if (!fs::remove(GetPidFile(*node.args))) {
|
|
||||||
LogPrintf("%s: Unable to remove PID file: File does not exist\n", __func__);
|
|
||||||
}
|
|
||||||
} catch (const fs::filesystem_error& e) {
|
|
||||||
LogPrintf("%s: Unable to remove PID file: %s\n", __func__, fsbridge::get_filesystem_error_message(e));
|
|
||||||
}
|
|
||||||
|
|
||||||
LogPrintf("%s: done\n", __func__);
|
LogPrintf("%s: done\n", __func__);
|
||||||
}
|
}
|
||||||
|
@ -30,8 +30,11 @@ class FilelockTest(BitcoinTestFramework):
|
|||||||
expected_msg = f"Error: Cannot obtain a lock on data directory {datadir}. {self.config['environment']['PACKAGE_NAME']} is probably already running."
|
expected_msg = f"Error: Cannot obtain a lock on data directory {datadir}. {self.config['environment']['PACKAGE_NAME']} is probably already running."
|
||||||
self.nodes[1].assert_start_raises_init_error(extra_args=[f'-datadir={self.nodes[0].datadir_path}', '-noserver'], expected_msg=expected_msg)
|
self.nodes[1].assert_start_raises_init_error(extra_args=[f'-datadir={self.nodes[0].datadir_path}', '-noserver'], expected_msg=expected_msg)
|
||||||
|
|
||||||
|
self.log.info("Check that cookie and PID file are not deleted when attempting to start a second bitcoind using the same datadir")
|
||||||
cookie_file = datadir / ".cookie"
|
cookie_file = datadir / ".cookie"
|
||||||
assert cookie_file.exists() # should not be deleted during the second bitcoind instance shutdown
|
assert cookie_file.exists() # should not be deleted during the second bitcoind instance shutdown
|
||||||
|
pid_file = datadir / "bitcoind.pid"
|
||||||
|
assert pid_file.exists()
|
||||||
|
|
||||||
if self.is_wallet_compiled():
|
if self.is_wallet_compiled():
|
||||||
def check_wallet_filelock(descriptors):
|
def check_wallet_filelock(descriptors):
|
||||||
|
Loading…
Reference in New Issue
Block a user