mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-14 16:50:17 +02:00
Merge bitcoin/bitcoin#31560: rpc: allow writing UTXO set to a named pipe
b19caeea09doc: add release note for #31560 (named pipe support for `dumptxoutset` RPC) (Sebastian Falbesoner)61a5460d0dtest: add test for utxo-to-sqlite conversion using named pipe (Sebastian Falbesoner)2e8072edberpc: support writing UTXO set dump (`dumptxoutset`) to a named pipe (Sebastian Falbesoner) Pull request description: This PR slightly modifies the `dumptxoutset` RPC to allow writing the UTXO set dump into a [named pipe](https://askubuntu.com/a/449192), so that the output data can be consumed by another process, see #31373. Taking use of this with the utxo-to-sqlite.py tool (introduced in #27432), creating an UTXO set in SQLite3 format is possible on the fly. E.g. for signet: ``` $ mkfifo /tmp/utxo_fifo && ./build/bin/bitcoin-cli -signet dumptxoutset /tmp/utxo_fifo latest & $ ./contrib/utxo-tools/utxo_to_sqlite.py /tmp/utxo_fifo ./utxo.sqlite UTXO Snapshot for Signet at block hash 000000012711f0a4e741be4a22792982..., contains 61848352 coins 1048576 coins converted [1.70%], 2.800s passed since start .... .... 60817408 coins converted [98.33%], 159.598s passed since start { "coins_written": 61848352, "base_hash": "000000012711f0a4e741be4a22792982370f51326db20fca955c7d45da97f768", "base_height": 294305, "path": "/tmp/utxo_fifo", "txoutset_hash": "34ae7fe7af33f58d4b83e00ecfc3b9605d927f154e7a94401226922f8e3f534e", "nchaintx": 28760852 } TOTAL: 61848352 coins written to ./utxo.sqlite, snapshot height is 294305. ``` Note that the `dumptxoutset` RPC calculates an UTXO set hash as a first step before any data is emitted, so especially on mainnet it takes quite a while until the conversion starts and something is happening visibly. ACKs for top commit: ajtowns: utACKb19caeea09sedited: Re-ACKb19caeea09Tree-SHA512: 7101563d0dba15439cdef8c8fb535f8593d5a779ff04208e2d72382a3f99072db8eac3651d1b3fe72c5e1f03e164efb281c3030d45d0723b943ebbbcf2a841d6
This commit is contained in:
@@ -3109,11 +3109,12 @@ static RPCHelpMan dumptxoutset()
|
||||
|
||||
const ArgsManager& args{EnsureAnyArgsman(request.context)};
|
||||
const fs::path path = fsbridge::AbsPathJoin(args.GetDataDirNet(), fs::u8path(self.Arg<std::string_view>("path")));
|
||||
const auto path_info{fs::status(path)};
|
||||
// Write to a temporary path and then move into `path` on completion
|
||||
// to avoid confusion due to an interruption.
|
||||
const fs::path temppath = path + ".incomplete";
|
||||
// to avoid confusion due to an interruption. If a named pipe passed, write directly to it.
|
||||
const fs::path temppath = fs::is_fifo(path_info) ? path : path + ".incomplete";
|
||||
|
||||
if (fs::exists(path)) {
|
||||
if (fs::exists(path_info) && !fs::is_fifo(path_info)) {
|
||||
throw JSONRPCError(
|
||||
RPC_INVALID_PARAMETER,
|
||||
path.utf8string() + " already exists. If you are sure this is what you want, "
|
||||
@@ -3197,7 +3198,9 @@ static RPCHelpMan dumptxoutset()
|
||||
path,
|
||||
temppath,
|
||||
node.rpc_interruption_point);
|
||||
fs::rename(temppath, path);
|
||||
if (!fs::is_fifo(path_info)) {
|
||||
fs::rename(temppath, path);
|
||||
}
|
||||
|
||||
result.pushKV("path", path.utf8string());
|
||||
return result;
|
||||
|
||||
Reference in New Issue
Block a user