Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit ea58e24

Browse files
committedFeb 28, 2023
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 3094e36 commit ea58e24

File tree

2 files changed

+95
-4
lines changed

2 files changed

+95
-4
lines changed
 

‎src/qml/nodemodel.cpp

+73-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,18 @@ 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+
if (!m_in_header_sync && !m_in_pre_header_sync) {
123+
if (new_progress != m_verification_progress) {
124+
setRemainingSyncTime(new_progress);
81125

82-
m_verification_progress = new_progress;
126+
m_verification_progress = new_progress + m_header_sync_progress + m_pre_header_sync_progress;
127+
Q_EMIT verificationProgressChanged();
128+
}
129+
} else {
130+
m_verification_progress = new_progress + m_header_sync_progress + m_pre_header_sync_progress;
83131
Q_EMIT verificationProgressChanged();
84132
}
85133
}
@@ -135,12 +183,33 @@ void NodeModel::ConnectToBlockTipSignal()
135183
QMetaObject::invokeMethod(this, [=] {
136184
setBlockTipHeight(tip.block_height);
137185
setVerificationProgress(verification_progress);
138-
186+
setInHeaderSync(false);
187+
setInPreHeaderSync(false);
139188
Q_EMIT setTimeRatioList(tip.block_time);
140189
});
141190
});
142191
}
143192

193+
void NodeModel::ConnectToHeaderTipSignal()
194+
{
195+
assert(!m_handler_notify_header_tip);
196+
197+
m_handler_notify_header_tip = m_node.handleNotifyHeaderTip(
198+
[this](SynchronizationState sync_state, interfaces::BlockTip tip, bool presync) {
199+
QMetaObject::invokeMethod(this, [=] {
200+
if (presync) {
201+
setInHeaderSync(false);
202+
setInPreHeaderSync(true);
203+
setPreHeaderSyncProgress(tip.block_height, QDateTime::fromSecsSinceEpoch(tip.block_time));
204+
} else {
205+
setInHeaderSync(true);
206+
setInPreHeaderSync(false);
207+
setHeaderSyncProgress(tip.block_height, QDateTime::fromSecsSinceEpoch(tip.block_time));
208+
}
209+
});
210+
});
211+
}
212+
144213
void NodeModel::ConnectToNumConnectionsChangedSignal()
145214
{
146215
assert(!m_handler_notify_num_peers_changed);

‎src/qml/nodemodel.h

+22
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ class NodeModel : public QObject
2727
Q_PROPERTY(int blockTipHeight READ blockTipHeight NOTIFY blockTipHeightChanged)
2828
Q_PROPERTY(int numOutboundPeers READ numOutboundPeers NOTIFY numOutboundPeersChanged)
2929
Q_PROPERTY(int maxNumOutboundPeers READ maxNumOutboundPeers CONSTANT)
30+
Q_PROPERTY(bool inHeaderSync READ inHeaderSync WRITE setInHeaderSync NOTIFY inHeaderSyncChanged)
31+
Q_PROPERTY(double headerSyncProgress READ headerSyncProgress NOTIFY headerSyncProgressChanged)
32+
Q_PROPERTY(bool inPreHeaderSync READ inPreHeaderSync WRITE setInPreHeaderSync NOTIFY inPreHeaderSyncChanged)
33+
Q_PROPERTY(double preHeaderSyncProgress READ preHeaderSyncProgress NOTIFY preHeaderSyncProgressChanged)
3034
Q_PROPERTY(int remainingSyncTime READ remainingSyncTime NOTIFY remainingSyncTimeChanged)
3135
Q_PROPERTY(double verificationProgress READ verificationProgress NOTIFY verificationProgressChanged)
3236
Q_PROPERTY(bool pause READ pause WRITE setPause NOTIFY pauseChanged)
@@ -39,6 +43,14 @@ class NodeModel : public QObject
3943
int numOutboundPeers() const { return m_num_outbound_peers; }
4044
void setNumOutboundPeers(int new_num);
4145
int maxNumOutboundPeers() const { return m_max_num_outbound_peers; }
46+
bool inHeaderSync() const { return m_in_header_sync; }
47+
void setInHeaderSync(bool new_in_header_sync);
48+
double headerSyncProgress() const { return m_header_sync_progress; }
49+
void setHeaderSyncProgress(int64_t header_height, const QDateTime& block_date);
50+
bool inPreHeaderSync() const { return m_in_pre_header_sync; }
51+
void setInPreHeaderSync(bool new_in_pre_header_sync);
52+
double preHeaderSyncProgress() const { return m_pre_header_sync_progress; }
53+
void setPreHeaderSyncProgress(int64_t header_height, const QDateTime& block_date);
4254
int remainingSyncTime() const { return m_remaining_sync_time; }
4355
void setRemainingSyncTime(double new_progress);
4456
double verificationProgress() const { return m_verification_progress; }
@@ -57,6 +69,10 @@ public Q_SLOTS:
5769
Q_SIGNALS:
5870
void blockTipHeightChanged();
5971
void numOutboundPeersChanged();
72+
void inHeaderSyncChanged();
73+
void headerSyncProgressChanged();
74+
void inPreHeaderSyncChanged();
75+
void preHeaderSyncProgressChanged();
6076
void remainingSyncTimeChanged();
6177
void requestedInitialize();
6278
void requestedShutdown();
@@ -74,6 +90,10 @@ public Q_SLOTS:
7490
int m_block_tip_height{0};
7591
int m_num_outbound_peers{0};
7692
static constexpr int m_max_num_outbound_peers{MAX_OUTBOUND_FULL_RELAY_CONNECTIONS + MAX_BLOCK_RELAY_ONLY_CONNECTIONS};
93+
bool m_in_header_sync;
94+
double m_header_sync_progress;
95+
bool m_in_pre_header_sync;
96+
double m_pre_header_sync_progress;
7797
int m_remaining_sync_time{0};
7898
double m_verification_progress{0.0};
7999
bool m_pause{false};
@@ -84,9 +104,11 @@ public Q_SLOTS:
84104

85105
interfaces::Node& m_node;
86106
std::unique_ptr<interfaces::Handler> m_handler_notify_block_tip;
107+
std::unique_ptr<interfaces::Handler> m_handler_notify_header_tip;
87108
std::unique_ptr<interfaces::Handler> m_handler_notify_num_peers_changed;
88109

89110
void ConnectToBlockTipSignal();
111+
void ConnectToHeaderTipSignal();
90112
void ConnectToNumConnectionsChangedSignal();
91113
};
92114

0 commit comments

Comments
 (0)
Please sign in to comment.