Skip to content

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 quand current_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 variable count_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.

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information