Browse Source

Merge #11367: [rpc] getblockchaininfo: add size_on_disk, prune_target_size

b7dfc6c [rpc] getblockchaininfo: add size_on_disk, prune_target_size, automatic_pruning (Daniel Edgecumbe)

Pull request description:

Tree-SHA512: c255c27d6c922434d203ffdefda0dd3dddbd765b6a9cce5f80f5af5cb0b1c11c8aff6f4d00e96a326701d0bc81aace2f216fd1985675aa979f76c16f564a6cf6
0.16
Wladimir J. van der Laan 7 years ago
parent
commit
3a93270c55
No known key found for this signature in database
GPG Key ID: 1E4AED62986CD25D
  1. 30
      src/rpc/blockchain.cpp
  2. 8
      src/validation.cpp
  3. 3
      src/validation.h
  4. 30
      test/functional/blockchain.py

30
src/rpc/blockchain.cpp

@ -1136,8 +1136,11 @@ UniValue getblockchaininfo(const JSONRPCRequest& request)
" \"mediantime\": xxxxxx, (numeric) median time for the current best block\n" " \"mediantime\": xxxxxx, (numeric) median time for the current best block\n"
" \"verificationprogress\": xxxx, (numeric) estimate of verification progress [0..1]\n" " \"verificationprogress\": xxxx, (numeric) estimate of verification progress [0..1]\n"
" \"chainwork\": \"xxxx\" (string) total amount of work in active chain, in hexadecimal\n" " \"chainwork\": \"xxxx\" (string) total amount of work in active chain, in hexadecimal\n"
" \"size_on_disk\": xxxxxx, (numeric) the estimated size of the block and undo files on disk\n"
" \"pruned\": xx, (boolean) if the blocks are subject to pruning\n" " \"pruned\": xx, (boolean) if the blocks are subject to pruning\n"
" \"pruneheight\": xxxxxx, (numeric) lowest-height complete block stored\n" " \"pruneheight\": xxxxxx, (numeric) lowest-height complete block stored (only present if pruning is enabled)\n"
" \"automatic_pruning\": xx, (boolean) whether automatic pruning is enabled (only present if pruning is enabled)\n"
" \"prune_target_size\": xxxxxx, (numeric) the target size used by pruning (only present if automatic pruning is enabled)\n"
" \"softforks\": [ (array) status of softforks in progress\n" " \"softforks\": [ (array) status of softforks in progress\n"
" {\n" " {\n"
" \"id\": \"xxxx\", (string) name of softfork\n" " \"id\": \"xxxx\", (string) name of softfork\n"
@ -1181,7 +1184,24 @@ UniValue getblockchaininfo(const JSONRPCRequest& request)
obj.push_back(Pair("mediantime", (int64_t)chainActive.Tip()->GetMedianTimePast())); obj.push_back(Pair("mediantime", (int64_t)chainActive.Tip()->GetMedianTimePast()));
obj.push_back(Pair("verificationprogress", GuessVerificationProgress(Params().TxData(), chainActive.Tip()))); obj.push_back(Pair("verificationprogress", GuessVerificationProgress(Params().TxData(), chainActive.Tip())));
obj.push_back(Pair("chainwork", chainActive.Tip()->nChainWork.GetHex())); obj.push_back(Pair("chainwork", chainActive.Tip()->nChainWork.GetHex()));
obj.push_back(Pair("size_on_disk", CalculateCurrentUsage()));
obj.push_back(Pair("pruned", fPruneMode)); obj.push_back(Pair("pruned", fPruneMode));
if (fPruneMode) {
CBlockIndex* block = chainActive.Tip();
assert(block);
while (block->pprev && (block->pprev->nStatus & BLOCK_HAVE_DATA)) {
block = block->pprev;
}
obj.push_back(Pair("pruneheight", block->nHeight));
// if 0, execution bypasses the whole if block.
bool automatic_pruning = (gArgs.GetArg("-prune", 0) != 1);
obj.push_back(Pair("automatic_pruning", automatic_pruning));
if (automatic_pruning) {
obj.push_back(Pair("prune_target_size", nPruneTarget));
}
}
const Consensus::Params& consensusParams = Params().GetConsensus(); const Consensus::Params& consensusParams = Params().GetConsensus();
CBlockIndex* tip = chainActive.Tip(); CBlockIndex* tip = chainActive.Tip();
@ -1195,14 +1215,6 @@ UniValue getblockchaininfo(const JSONRPCRequest& request)
obj.push_back(Pair("softforks", softforks)); obj.push_back(Pair("softforks", softforks));
obj.push_back(Pair("bip9_softforks", bip9_softforks)); obj.push_back(Pair("bip9_softforks", bip9_softforks));
if (fPruneMode)
{
CBlockIndex *block = chainActive.Tip();
while (block && block->pprev && (block->pprev->nStatus & BLOCK_HAVE_DATA))
block = block->pprev;
obj.push_back(Pair("pruneheight", block->nHeight));
}
obj.push_back(Pair("warnings", GetWarnings("statusbar"))); obj.push_back(Pair("warnings", GetWarnings("statusbar")));
return obj; return obj;
} }

8
src/validation.cpp

@ -3233,8 +3233,10 @@ bool TestBlockValidity(CValidationState& state, const CChainParams& chainparams,
*/ */
/* Calculate the amount of disk space the block & undo files currently use */ /* Calculate the amount of disk space the block & undo files currently use */
static uint64_t CalculateCurrentUsage() uint64_t CalculateCurrentUsage()
{ {
LOCK(cs_LastBlockFile);
uint64_t retval = 0; uint64_t retval = 0;
for (const CBlockFileInfo &file : vinfoBlockFile) { for (const CBlockFileInfo &file : vinfoBlockFile) {
retval += file.nSize + file.nUndoSize; retval += file.nSize + file.nUndoSize;
@ -3245,6 +3247,8 @@ static uint64_t CalculateCurrentUsage()
/* Prune a block file (modify associated database entries)*/ /* Prune a block file (modify associated database entries)*/
void PruneOneBlockFile(const int fileNumber) void PruneOneBlockFile(const int fileNumber)
{ {
LOCK(cs_LastBlockFile);
for (BlockMap::iterator it = mapBlockIndex.begin(); it != mapBlockIndex.end(); ++it) { for (BlockMap::iterator it = mapBlockIndex.begin(); it != mapBlockIndex.end(); ++it) {
CBlockIndex* pindex = it->second; CBlockIndex* pindex = it->second;
if (pindex->nFile == fileNumber) { if (pindex->nFile == fileNumber) {
@ -4247,6 +4251,8 @@ std::string CBlockFileInfo::ToString() const
CBlockFileInfo* GetBlockFileInfo(size_t n) CBlockFileInfo* GetBlockFileInfo(size_t n)
{ {
LOCK(cs_LastBlockFile);
return &vinfoBlockFile.at(n); return &vinfoBlockFile.at(n);
} }

3
src/validation.h

@ -280,6 +280,9 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams);
/** Guess verification progress (as a fraction between 0.0=genesis and 1.0=current tip). */ /** Guess verification progress (as a fraction between 0.0=genesis and 1.0=current tip). */
double GuessVerificationProgress(const ChainTxData& data, CBlockIndex* pindex); double GuessVerificationProgress(const ChainTxData& data, CBlockIndex* pindex);
/** Calculate the amount of disk space the block & undo files currently use */
uint64_t CalculateCurrentUsage();
/** /**
* Mark one block file as pruned. * Mark one block file as pruned.
*/ */

30
test/functional/blockchain.py

@ -24,6 +24,8 @@ import subprocess
from test_framework.test_framework import BitcoinTestFramework from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import ( from test_framework.util import (
assert_equal, assert_equal,
assert_greater_than,
assert_greater_than_or_equal,
assert_raises, assert_raises,
assert_raises_jsonrpc, assert_raises_jsonrpc,
assert_is_hex_string, assert_is_hex_string,
@ -58,21 +60,43 @@ class BlockchainTest(BitcoinTestFramework):
'headers', 'headers',
'mediantime', 'mediantime',
'pruned', 'pruned',
'size_on_disk',
'softforks', 'softforks',
'verificationprogress', 'verificationprogress',
'warnings', 'warnings',
] ]
res = self.nodes[0].getblockchaininfo() res = self.nodes[0].getblockchaininfo()
# result should have pruneheight and default keys if pruning is enabled
assert_equal(sorted(res.keys()), sorted(['pruneheight'] + keys)) # result should have these additional pruning keys if manual pruning is enabled
assert_equal(sorted(res.keys()), sorted(['pruneheight', 'automatic_pruning'] + keys))
# size_on_disk should be > 0
assert_greater_than(res['size_on_disk'], 0)
# pruneheight should be greater or equal to 0 # pruneheight should be greater or equal to 0
assert res['pruneheight'] >= 0 assert_greater_than_or_equal(res['pruneheight'], 0)
# check other pruning fields given that prune=1
assert res['pruned']
assert not res['automatic_pruning']
self.restart_node(0, ['-stopatheight=207']) self.restart_node(0, ['-stopatheight=207'])
res = self.nodes[0].getblockchaininfo() res = self.nodes[0].getblockchaininfo()
# should have exact keys # should have exact keys
assert_equal(sorted(res.keys()), keys) assert_equal(sorted(res.keys()), keys)
self.restart_node(0, ['-stopatheight=207', '-prune=550'])
res = self.nodes[0].getblockchaininfo()
# result should have these additional pruning keys if prune=550
assert_equal(sorted(res.keys()), sorted(['pruneheight', 'automatic_pruning', 'prune_target_size'] + keys))
# check related fields
assert res['pruned']
assert_equal(res['pruneheight'], 0)
assert res['automatic_pruning']
assert_equal(res['prune_target_size'], 576716800)
assert_greater_than(res['size_on_disk'], 0)
def _test_getchaintxstats(self): def _test_getchaintxstats(self):
chaintxstats = self.nodes[0].getchaintxstats(1) chaintxstats = self.nodes[0].getchaintxstats(1)
# 200 txs plus genesis tx # 200 txs plus genesis tx

Loading…
Cancel
Save