Skip to content

Commit 8df54fe

Browse files
committed
qml: handle pre & header sync, move verification progress along
This connects us to the header tip signal so that we can handle when the node is in pre & or headers sync. This calculates the progress of the pre or headers sync and adds it to our verification progress. Pre and headers sync take up 1% of verification progress each, then IBD begins at 2% progress as displayed on the block clock.
1 parent abd3ba1 commit 8df54fe

File tree

2 files changed

+96
-4
lines changed

2 files changed

+96
-4
lines changed

src/qml/models/nodemodel.cpp

+74-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ NodeModel::NodeModel(interfaces::Node& node)
2020
: m_node{node}
2121
{
2222
ConnectToBlockTipSignal();
23+
ConnectToHeaderTipSignal();
2324
ConnectToNumConnectionsChangedSignal();
2425
}
2526

@@ -39,6 +40,47 @@ void NodeModel::setNumOutboundPeers(int new_num)
3940
}
4041
}
4142

43+
void NodeModel::setInHeaderSync(bool new_in_header_sync)
44+
{
45+
if (new_in_header_sync != m_in_header_sync) {
46+
m_in_header_sync = new_in_header_sync;
47+
Q_EMIT inHeaderSyncChanged();
48+
}
49+
}
50+
51+
void NodeModel::setHeaderSyncProgress(int64_t header_height, const QDateTime& block_date)
52+
{
53+
int estimated_headers_left = block_date.secsTo(QDateTime::currentDateTime()) / Params().GetConsensus().nPowTargetSpacing;
54+
double new_header_sync_progress = (100.0 / (header_height + estimated_headers_left) * header_height) / 10000;
55+
56+
if (new_header_sync_progress != m_header_sync_progress) {
57+
m_header_sync_progress = new_header_sync_progress;
58+
setVerificationProgress(0.0);
59+
Q_EMIT headerSyncProgressChanged();
60+
}
61+
}
62+
63+
void NodeModel::setInPreHeaderSync(bool new_in_pre_header_sync)
64+
{
65+
if (new_in_pre_header_sync != m_in_pre_header_sync) {
66+
m_in_pre_header_sync = new_in_pre_header_sync;
67+
Q_EMIT inPreHeaderSyncChanged();
68+
}
69+
}
70+
71+
void NodeModel::setPreHeaderSyncProgress(int64_t header_height, const QDateTime& block_date)
72+
{
73+
int estimated_headers_left = block_date.secsTo(QDateTime::currentDateTime()) / Params().GetConsensus().nPowTargetSpacing;
74+
double new_pre_header_sync_progress = (100.0 / (header_height + estimated_headers_left) * header_height) / 10000;
75+
76+
if (new_pre_header_sync_progress != m_pre_header_sync_progress) {
77+
m_pre_header_sync_progress = new_pre_header_sync_progress;
78+
setVerificationProgress(0.0);
79+
Q_EMIT preHeaderSyncProgressChanged();
80+
81+
}
82+
}
83+
4284
void NodeModel::setRemainingSyncTime(double new_progress)
4385
{
4486
int currentTime = QDateTime::currentDateTime().toMSecsSinceEpoch();
@@ -74,12 +116,19 @@ void NodeModel::setRemainingSyncTime(double new_progress)
74116
}
75117
}
76118
}
119+
77120
void NodeModel::setVerificationProgress(double new_progress)
78121
{
79-
if (new_progress != m_verification_progress) {
80-
setRemainingSyncTime(new_progress);
122+
double header_progress = m_header_sync_progress + m_pre_header_sync_progress;
123+
if (!m_in_header_sync && !m_in_pre_header_sync) {
124+
if (new_progress != m_verification_progress) {
125+
setRemainingSyncTime(new_progress);
81126

82-
m_verification_progress = new_progress;
127+
m_verification_progress = header_progress + (new_progress - header_progress);
128+
Q_EMIT verificationProgressChanged();
129+
}
130+
} else {
131+
m_verification_progress = header_progress;
83132
Q_EMIT verificationProgressChanged();
84133
}
85134
}
@@ -140,12 +189,33 @@ void NodeModel::ConnectToBlockTipSignal()
140189
QMetaObject::invokeMethod(this, [=] {
141190
setBlockTipHeight(tip.block_height);
142191
setVerificationProgress(verification_progress);
143-
192+
setInHeaderSync(false);
193+
setInPreHeaderSync(false);
144194
Q_EMIT setTimeRatioList(tip.block_time);
145195
});
146196
});
147197
}
148198

199+
void NodeModel::ConnectToHeaderTipSignal()
200+
{
201+
assert(!m_handler_notify_header_tip);
202+
203+
m_handler_notify_header_tip = m_node.handleNotifyHeaderTip(
204+
[this](SynchronizationState sync_state, interfaces::BlockTip tip, bool presync) {
205+
QMetaObject::invokeMethod(this, [=] {
206+
if (presync) {
207+
setInHeaderSync(false);
208+
setInPreHeaderSync(true);
209+
setPreHeaderSyncProgress(tip.block_height, QDateTime::fromSecsSinceEpoch(tip.block_time));
210+
} else {
211+
setInHeaderSync(true);
212+
setInPreHeaderSync(false);
213+
setHeaderSyncProgress(tip.block_height, QDateTime::fromSecsSinceEpoch(tip.block_time));
214+
}
215+
});
216+
});
217+
}
218+
149219
void NodeModel::ConnectToNumConnectionsChangedSignal()
150220
{
151221
assert(!m_handler_notify_num_peers_changed);

src/qml/models/nodemodel.h

+22
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ class NodeModel : public QObject
3030
Q_PROPERTY(QString fullClientVersion READ fullClientVersion CONSTANT)
3131
Q_PROPERTY(int numOutboundPeers READ numOutboundPeers NOTIFY numOutboundPeersChanged)
3232
Q_PROPERTY(int maxNumOutboundPeers READ maxNumOutboundPeers CONSTANT)
33+
Q_PROPERTY(bool inHeaderSync READ inHeaderSync WRITE setInHeaderSync NOTIFY inHeaderSyncChanged)
34+
Q_PROPERTY(double headerSyncProgress READ headerSyncProgress NOTIFY headerSyncProgressChanged)
35+
Q_PROPERTY(bool inPreHeaderSync READ inPreHeaderSync WRITE setInPreHeaderSync NOTIFY inPreHeaderSyncChanged)
36+
Q_PROPERTY(double preHeaderSyncProgress READ preHeaderSyncProgress NOTIFY preHeaderSyncProgressChanged)
3337
Q_PROPERTY(int remainingSyncTime READ remainingSyncTime NOTIFY remainingSyncTimeChanged)
3438
Q_PROPERTY(double verificationProgress READ verificationProgress NOTIFY verificationProgressChanged)
3539
Q_PROPERTY(bool pause READ pause WRITE setPause NOTIFY pauseChanged)
@@ -43,6 +47,14 @@ class NodeModel : public QObject
4347
int numOutboundPeers() const { return m_num_outbound_peers; }
4448
void setNumOutboundPeers(int new_num);
4549
int maxNumOutboundPeers() const { return m_max_num_outbound_peers; }
50+
bool inHeaderSync() const { return m_in_header_sync; }
51+
void setInHeaderSync(bool new_in_header_sync);
52+
double headerSyncProgress() const { return m_header_sync_progress; }
53+
void setHeaderSyncProgress(int64_t header_height, const QDateTime& block_date);
54+
bool inPreHeaderSync() const { return m_in_pre_header_sync; }
55+
void setInPreHeaderSync(bool new_in_pre_header_sync);
56+
double preHeaderSyncProgress() const { return m_pre_header_sync_progress; }
57+
void setPreHeaderSyncProgress(int64_t header_height, const QDateTime& block_date);
4658
int remainingSyncTime() const { return m_remaining_sync_time; }
4759
void setRemainingSyncTime(double new_progress);
4860
double verificationProgress() const { return m_verification_progress; }
@@ -65,6 +77,10 @@ public Q_SLOTS:
6577
Q_SIGNALS:
6678
void blockTipHeightChanged();
6779
void numOutboundPeersChanged();
80+
void inHeaderSyncChanged();
81+
void headerSyncProgressChanged();
82+
void inPreHeaderSyncChanged();
83+
void preHeaderSyncProgressChanged();
6884
void remainingSyncTimeChanged();
6985
void requestedInitialize();
7086
void requestedShutdown();
@@ -82,6 +98,10 @@ public Q_SLOTS:
8298
int m_block_tip_height{0};
8399
int m_num_outbound_peers{0};
84100
static constexpr int m_max_num_outbound_peers{MAX_OUTBOUND_FULL_RELAY_CONNECTIONS + MAX_BLOCK_RELAY_ONLY_CONNECTIONS};
101+
bool m_in_header_sync;
102+
double m_header_sync_progress;
103+
bool m_in_pre_header_sync;
104+
double m_pre_header_sync_progress;
85105
int m_remaining_sync_time{0};
86106
double m_verification_progress{0.0};
87107
bool m_pause{false};
@@ -92,9 +112,11 @@ public Q_SLOTS:
92112

93113
interfaces::Node& m_node;
94114
std::unique_ptr<interfaces::Handler> m_handler_notify_block_tip;
115+
std::unique_ptr<interfaces::Handler> m_handler_notify_header_tip;
95116
std::unique_ptr<interfaces::Handler> m_handler_notify_num_peers_changed;
96117

97118
void ConnectToBlockTipSignal();
119+
void ConnectToHeaderTipSignal();
98120
void ConnectToNumConnectionsChangedSignal();
99121
};
100122

0 commit comments

Comments
 (0)