sync print 1 block apply when no blocks applied
La formule actuelle utilisée pour calculer le nombre de blocs appliqués est :
(ligne 211 de lib/modules/blockchain/blockchain/src/sync/mod.rs
)
let count_blocks = target_blockstamp.id.0 + 1 - current_blockstamp.id.0;
let count_chunks = if count_blocks % 250 > 0 {
(count_blocks / 250) + 1
} else {
count_blocks / 250
};
Pour target_blockstamp.id.0 == current_blockstamp.id.0
cela affiche une barre de progrès qui dit avoir appliqué un bloc (et un chunk) alors qu'aucun n'est appliqué.
Ma proposition était de remplacer par
let count_blocks = target_blockstamp.id.0 - current_blockstamp.id.0;
let count_chunks = count_blocks / 250 + 1;
mais cela ne résout pas le problème :
Non le bloc n°0 compte, donc si j'ai 250 blocs a sync, ça va du n°0 au n°249 = un seul chunk. En fait j'avais pensé la formule pour une sync initiale sans blockchain. Et du coup
current_blockstamp.id
vaut zéro alors qu'on a zéro block, il devrait donc valoir -1 ou None mais du coup on ne pourrait plus utiliser un u32. Il faut remettre le +1 dans les cas ou le nœud n'a aucun block (cad quandcurrent_blockstamp == Blockstamp::default()
).En fait, c'est même pire que ça, ça dépend de la valeur de
current_blockstamp
. Par exemple si je suis au bloc 200 et que le target est 550 j'ai 3 chunks a récupérer : les chunks 0, 1 et 2 ! En fait il faudrait étudier comment est utilisé la variablecount_chunks
pour voir ce qui est exactement attendu actuellement. Mais en tout les cas a terme un récupérera des chunks fixes donc faudra changer la formule de calcul.
De plus, il n'est pas vérifié que
target_blockstamp.id.0 >= current_blockstamp.id.0
@librelois j'ai fermé ma MR qui n'apportait pas de réponse à ce problème et ouvert une issue à la place pour pouvoir en parler si nécessaire.