0xMiden / 0xMiden/note-transport-service
Legacy-cursor reset never converges (rcursor computed from original cursor)
- Langage dominant
- Rust
- Étoiles
- 3
- Forks
- 10
- Merge moyen
- 2 h 23 min
- PR mergées (30 j)
- 4
Description
Severity: high (correctness bug).
### Summary
The DB layer treats a cursor > 10^12 (pre-`seq` microsecond timestamps) as 0 (`crates/node/src/database/sqlite/mod.rs:160-166`), but the gRPC handler computes the response cursor from the **original** request cursor: `let mut rcursor = cursor;` then `max` with the returned seqs (`crates/node/src/node/grpc/mod.rs:261`).
### Impact
A client sending a legacy cursor (~1.7e15) gets the oldest 500 notes plus `rcursor ≈ 1.7e15`; its next fetch sends the same cursor, gets the same 500 notes again — forever. It never advances past the first batch and permanently re-downloads duplicates.
### Recommendation
Perform the legacy reset in the handler (or return the effective cursor from the DB layer) so `rcursor = max(effective_cursor, max_seq)`.
Related: #101.
---
Part of #114.
Guide de contribution
Ouvrir le guide de contribution
Piste de recherche
Le bogue se trouve dans crates/node/src/database/sqlite/mod.rs lignes 160-166 où les curseurs hérités sont réinitialisés, et dans crates/node/src/node/grpc/mod.rs ligne 261 où le curseur de réponse est calculé. Commencez par lire la gestion des curseurs de la couche base de données et la logique du gestionnaire gRPC. Vérifiez la correction en vous assurant que le curseur effectif (après toute réinitialisation) est utilisé pour la réponse. Exécutez tous les tests existants liés à la pagination par curseur pour confirmer que la correction fonctionne.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Domaine
- backend, databases
- Type d'issue
- Bug
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- Active
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 65/100