mirror of
https://github.com/dashpay/dash.git
synced 2024-12-26 04:22:55 +01:00
[rpc] getblockchaininfo: add size_on_disk, prune_target_size, automatic_pruning
Fix pruneheight help text. Move fPruneMode block to match output ordering with help text. Add functional tests for new fields in getblockchaininfo.
This commit is contained in:
parent
ff4cd6075b
commit
b7dfc6c4b8
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
@ -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…
Reference in New Issue
Block a user