Auto merge of #2484 - str4d:block-download-completion, r=daira
Add block download progress to metrics UI
This commit is contained in:
commit
10acd8a1fb
|
@ -92,3 +92,44 @@ TEST(Metrics, GetLocalSolPS) {
|
||||||
SetMockTime(104);
|
SetMockTime(104);
|
||||||
EXPECT_EQ(1, GetLocalSolPS());
|
EXPECT_EQ(1, GetLocalSolPS());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(Metrics, EstimateNetHeightInner) {
|
||||||
|
// Ensure that the (rounded) current height is returned if the tip is current
|
||||||
|
SetMockTime(15000);
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner(100, 14100, 50, 7500, 0, 150));
|
||||||
|
SetMockTime(15150);
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner(101, 14250, 50, 7500, 0, 150));
|
||||||
|
|
||||||
|
// Ensure that correct estimates are returned if the tip is in the past
|
||||||
|
SetMockTime(15300); // Tip is 2 blocks behind
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner(100, 14100, 50, 7500, 0, 150));
|
||||||
|
SetMockTime(15900); // Tip is 6 blocks behind
|
||||||
|
EXPECT_EQ(110, EstimateNetHeightInner(100, 14100, 50, 7500, 0, 150));
|
||||||
|
|
||||||
|
// Check estimates during resync
|
||||||
|
SetMockTime(15000);
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner( 0, 0, 50, 7500, 0, 150));
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner( 7, 600, 50, 7500, 0, 150));
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner( 8, 600, 50, 7500, 0, 150));
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner(10, 750, 50, 7500, 0, 150));
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner(11, 900, 50, 7500, 0, 150));
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner(20, 2100, 50, 7500, 0, 150));
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner(49, 6450, 50, 7500, 0, 150));
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner(50, 6600, 50, 7500, 0, 150));
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner(51, 6750, 50, 7500, 0, 150));
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner(55, 7350, 50, 7500, 0, 150));
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner(56, 7500, 50, 7500, 0, 150));
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner(57, 7650, 50, 7500, 0, 150));
|
||||||
|
EXPECT_EQ(100, EstimateNetHeightInner(75, 10350, 50, 7500, 0, 150));
|
||||||
|
|
||||||
|
// More complex calculations:
|
||||||
|
SetMockTime(20000);
|
||||||
|
// - Checkpoint spacing: 200
|
||||||
|
// -> Average spacing: 175
|
||||||
|
// -> estimated height: 127 -> 130
|
||||||
|
EXPECT_EQ(130, EstimateNetHeightInner(100, 14100, 50, 5250, 0, 150));
|
||||||
|
// - Checkpoint spacing: 50
|
||||||
|
// -> Average spacing: 100
|
||||||
|
// -> estimated height: 153 -> 150
|
||||||
|
EXPECT_EQ(150, EstimateNetHeightInner(100, 14100, 50, 12000, 0, 150));
|
||||||
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "metrics.h"
|
#include "metrics.h"
|
||||||
|
|
||||||
#include "chainparams.h"
|
#include "chainparams.h"
|
||||||
|
#include "checkpoints.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "ui_interface.h"
|
#include "ui_interface.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
@ -103,6 +104,36 @@ double GetLocalSolPS()
|
||||||
return miningTimer.rate(solutionTargetChecks);
|
return miningTimer.rate(solutionTargetChecks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int EstimateNetHeightInner(int height, int64_t tipmediantime,
|
||||||
|
int heightLastCheckpoint, int64_t timeLastCheckpoint,
|
||||||
|
int64_t genesisTime, int64_t targetSpacing)
|
||||||
|
{
|
||||||
|
// We average the target spacing with the observed spacing to the last
|
||||||
|
// checkpoint (either from below or above depending on the current height),
|
||||||
|
// and use that to estimate the current network height.
|
||||||
|
int medianHeight = height > CBlockIndex::nMedianTimeSpan ?
|
||||||
|
height - (1 + ((CBlockIndex::nMedianTimeSpan - 1) / 2)) :
|
||||||
|
height / 2;
|
||||||
|
double checkpointSpacing = medianHeight > heightLastCheckpoint ?
|
||||||
|
(double (tipmediantime - timeLastCheckpoint)) / (medianHeight - heightLastCheckpoint) :
|
||||||
|
(double (timeLastCheckpoint - genesisTime)) / heightLastCheckpoint;
|
||||||
|
double averageSpacing = (targetSpacing + checkpointSpacing) / 2;
|
||||||
|
int netheight = medianHeight + ((GetTime() - tipmediantime) / averageSpacing);
|
||||||
|
// Round to nearest ten to reduce noise
|
||||||
|
return ((netheight + 5) / 10) * 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
int EstimateNetHeight(int height, int64_t tipmediantime, CChainParams chainParams)
|
||||||
|
{
|
||||||
|
auto checkpointData = chainParams.Checkpoints();
|
||||||
|
return EstimateNetHeightInner(
|
||||||
|
height, tipmediantime,
|
||||||
|
Checkpoints::GetTotalBlocksEstimate(checkpointData),
|
||||||
|
checkpointData.nTimeLastCheckpoint,
|
||||||
|
chainParams.GenesisBlock().nTime,
|
||||||
|
chainParams.GetConsensus().nPowTargetSpacing);
|
||||||
|
}
|
||||||
|
|
||||||
void TriggerRefresh()
|
void TriggerRefresh()
|
||||||
{
|
{
|
||||||
*nNextRefresh = GetTime();
|
*nNextRefresh = GetTime();
|
||||||
|
@ -169,17 +200,25 @@ int printStats(bool mining)
|
||||||
int lines = 4;
|
int lines = 4;
|
||||||
|
|
||||||
int height;
|
int height;
|
||||||
|
int64_t tipmediantime;
|
||||||
size_t connections;
|
size_t connections;
|
||||||
int64_t netsolps;
|
int64_t netsolps;
|
||||||
{
|
{
|
||||||
LOCK2(cs_main, cs_vNodes);
|
LOCK2(cs_main, cs_vNodes);
|
||||||
height = chainActive.Height();
|
height = chainActive.Height();
|
||||||
|
tipmediantime = chainActive.Tip()->GetMedianTimePast();
|
||||||
connections = vNodes.size();
|
connections = vNodes.size();
|
||||||
netsolps = GetNetworkHashPS(120, -1);
|
netsolps = GetNetworkHashPS(120, -1);
|
||||||
}
|
}
|
||||||
auto localsolps = GetLocalSolPS();
|
auto localsolps = GetLocalSolPS();
|
||||||
|
|
||||||
std::cout << " " << _("Block height") << " | " << height << std::endl;
|
if (IsInitialBlockDownload()) {
|
||||||
|
int netheight = EstimateNetHeight(height, tipmediantime, Params());
|
||||||
|
int downloadPercent = height * 100 / netheight;
|
||||||
|
std::cout << " " << _("Downloading blocks") << " | " << height << " / ~" << netheight << " (" << downloadPercent << "%)" << std::endl;
|
||||||
|
} else {
|
||||||
|
std::cout << " " << _("Block height") << " | " << height << std::endl;
|
||||||
|
}
|
||||||
std::cout << " " << _("Connections") << " | " << connections << std::endl;
|
std::cout << " " << _("Connections") << " | " << connections << std::endl;
|
||||||
std::cout << " " << _("Network solution rate") << " | " << netsolps << " Sol/s" << std::endl;
|
std::cout << " " << _("Network solution rate") << " | " << netsolps << " Sol/s" << std::endl;
|
||||||
if (mining && miningTimer.running()) {
|
if (mining && miningTimer.running()) {
|
||||||
|
|
|
@ -63,6 +63,9 @@ void TrackMinedBlock(uint256 hash);
|
||||||
|
|
||||||
void MarkStartTime();
|
void MarkStartTime();
|
||||||
double GetLocalSolPS();
|
double GetLocalSolPS();
|
||||||
|
int EstimateNetHeightInner(int height, int64_t tipmediantime,
|
||||||
|
int heightLastCheckpoint, int64_t timeLastCheckpoint,
|
||||||
|
int64_t genesisTime, int64_t targetSpacing);
|
||||||
|
|
||||||
void TriggerRefresh();
|
void TriggerRefresh();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue