fix(fullnode): stable overall progress for Sapling witness rebuild
The witness-rebuild bar reset repeatedly because the daemon's "Building Witnesses for block <h> <frac> complete" line reports per-call progress: BuildWitnessCache is re-invoked for each connected block and each call walks from its own start height to the tip, so the fraction restarts every time. The earlier "Setting Initial Sapling Witness for tx <i> of <m>" counter resets per call too, so neither is a usable overall metric. Derive a stable, monotonic percentage from the "<n> remaining" count instead: track the largest "remaining" seen during the phase as the full span and show how far remaining has fallen below it. The longest pass defines 0→100%; the short per-block follow-up passes only nudge the bar near the end rather than resetting it. The "Setting Initial" line now only marks the phase active. Per-phase tracking resets at phase start and every rescan-completion site. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1162,6 +1162,7 @@ void App::refreshCoreData()
|
||||
state_.sync.building_witnesses = false;
|
||||
state_.sync.witness_progress = 0.0f;
|
||||
state_.sync.witness_remaining = 0;
|
||||
witness_rebuild_total_blocks_ = 0;
|
||||
// Notes/witnesses were rebuilt — force a fresh history + balance pull.
|
||||
transactions_dirty_ = true;
|
||||
last_tx_block_height_ = -1;
|
||||
@@ -2596,6 +2597,7 @@ void App::runtimeRescan(int startHeight)
|
||||
state_.sync.building_witnesses = false;
|
||||
state_.sync.witness_progress = 0.0f;
|
||||
state_.sync.witness_remaining = 0;
|
||||
witness_rebuild_total_blocks_ = 0;
|
||||
if (ok) {
|
||||
state_.sync.rescan_progress = 1.0f;
|
||||
transactions_dirty_ = true;
|
||||
|
||||
Reference in New Issue
Block a user