anchorage_layer_simple/fixKnowledge/sync-utxos-rpc-optimization.md
ncantu e0ce7a9d83 Optimize sync-utxos RPC calls and document bitcoind crash issues
**Motivations:**
- Prevent bitcoind crashes caused by heavy RPC calls without timeout
- Document bitcoind crash and wallet loading stuck issues
- Clean up obsolete files (configure-nginx-proxy.sh, userwallet components, website-skeleton, old fixKnowledge docs)

**Root causes:**
- RPC calls without timeout causing bitcoind crashes
- No pre-check of bitcoind health before heavy operations
- Large wallet (315MB) causing long loading times and potential hangs
- Missing retry mechanism for transient errors

**Correctifs:**
- Add timeouts on RPC calls (5 minutes for listunspent, 10 seconds for healthcheck)
- Add bitcoind health check before synchronization
- Implement retry with exponential backoff
- Reduce maximumCount limit from 9999999 to 500000 UTXOs
- Improve cron script with pre-checks and better error handling
- Add container status verification before script execution

**Evolutions:**
- New check-services-status.sh script for service diagnostics
- Documentation of crash issues in fixKnowledge
- Improved logging with timestamps
- Better error messages and handling

**Pages affectées:**
- data/sync-utxos-spent-status.mjs
- data/sync-utxos-cron.sh
- data/restart-services-cron.sh
- data/check-services-status.sh (new)
- fixKnowledge/sync-utxos-rpc-optimization.md (new)
- fixKnowledge/signet-bitcoind-crash-mining-stopped.md (new)
- fixKnowledge/signet-bitcoind-crash-wallet-loading-stuck.md (new)
- Removed obsolete files: configure-nginx-proxy.sh, userwallet components, website-skeleton files, old fixKnowledge docs

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-08 08:18:26 +01:00

136 lines
5.3 KiB
Markdown

# Optimisation du script sync-utxos pour éviter les crashes RPC
**Date:** 2026-02-08
**Auteur:** Équipe 4NK
## Problème
Le script `sync-utxos-cron.sh` s'exécute toutes les heures (à 3h00 notamment) et fait un appel RPC très lourd (`listunspent` avec `maximumCount: 9999999`). Avec un wallet volumineux (315MB) et potentiellement des centaines de milliers d'UTXOs, cet appel peut :
- Consommer beaucoup de mémoire
- Prendre beaucoup de temps (plusieurs minutes)
- Causer un crash de bitcoind si la mémoire est insuffisante ou si bitcoind est déjà dans un état fragile
- Bloquer le RPC pendant plusieurs minutes, empêchant les autres services de fonctionner
### Symptômes observés
- Crash silencieux de bitcoind vers 3h08 (après l'exécution du script à 3h00)
- Erreurs "socket hang up" et "read ECONNRESET" dans les logs du dashboard
- Bitcoind bloqué en chargement de wallet après redémarrage
- Wallet volumineux (315MB) causant des chargements longs
## Root causes
1. **Appel RPC sans timeout** : L'appel `listunspent` n'avait pas de timeout, pouvant bloquer indéfiniment
2. **Pas de vérification préalable** : Le script ne vérifiait pas si bitcoind était disponible avant de faire l'appel lourd
3. **Pas de retry avec backoff** : En cas d'échec temporaire, le script échouait immédiatement
4. **Limite trop élevée** : `maximumCount: 9999999` pouvait charger des centaines de milliers d'UTXOs en mémoire d'un coup
5. **Pas de gestion d'erreurs** : Les erreurs n'étaient pas gérées de manière gracieuse
## Correctifs appliqués
### 1. Ajout de timeout sur les appels RPC
**Fichier** : `data/sync-utxos-spent-status.mjs`
- **Timeout de 5 minutes** (300000ms) pour l'appel `listunspent` avec gros wallet
- **Timeout de 10 secondes** pour le healthcheck `getblockchaininfo`
- Les timeouts sont configurables via les paramètres de la fonction `rpcCall`
### 2. Vérification de santé de bitcoind avant synchronisation
**Fichier** : `data/sync-utxos-spent-status.mjs`
- Ajout de la fonction `checkBitcoindHealth()` qui vérifie que bitcoind répond avant de commencer
- Si bitcoind n'est pas disponible, le script s'arrête immédiatement sans faire d'appel RPC lourd
### 3. Retry avec backoff exponentiel
**Fichier** : `data/sync-utxos-spent-status.mjs`
- Ajout de retry automatique avec backoff exponentiel (1s, 2s, 4s, max 10s)
- Maximum 3 tentatives pour les erreurs de timeout/connexion
- Maximum 2 tentatives pour l'appel `listunspent` (pour éviter de surcharger bitcoind)
### 4. Réduction de la limite maximumCount
**Fichier** : `data/sync-utxos-spent-status.mjs`
- Réduction de `maximumCount` de 9999999 à 500000 UTXOs
- Limite la consommation mémoire et réduit le temps de traitement
- Si vous avez plus de 500000 UTXOs, il faudra augmenter cette limite ou optimiser l'approche
### 5. Amélioration du script cron
**Fichier** : `data/sync-utxos-cron.sh`
- Vérification que le conteneur bitcoind est actif avant d'exécuter le script Node.js
- Vérification que le RPC bitcoind répond avant de commencer
- Logs améliorés avec timestamps
- Gestion des codes de sortie pour permettre la détection d'échecs
### 6. Gestion d'erreurs améliorée
**Fichier** : `data/sync-utxos-spent-status.mjs`
- Distinction entre erreurs temporaires (timeout, connexion) et erreurs permanentes
- Messages d'erreur plus informatifs
- Le script ne fait pas échouer le cron si c'est un problème temporaire de bitcoind
## Modifications
**Fichiers modifiés :**
- `data/sync-utxos-spent-status.mjs` :
- Ajout de `rpcCall()` avec timeout et retry
- Ajout de `rpcCallOnce()` avec timeout HTTP
- Ajout de `checkBitcoindHealth()`
- Réduction de `maximumCount` à 500000
- Timeout de 5 minutes pour `listunspent`
- Gestion d'erreurs améliorée
- `data/sync-utxos-cron.sh` :
- Vérification de disponibilité de bitcoind avant exécution
- Logs améliorés avec timestamps
- Gestion des codes de sortie
## Modalités de déploiement
1. **Vérifier que les scripts sont exécutables** :
```bash
chmod +x data/sync-utxos-cron.sh
```
2. **Tester manuellement** :
```bash
./data/sync-utxos-cron.sh
```
3. **Vérifier les logs** :
```bash
tail -f data/sync-utxos.log
```
4. **Surveiller la prochaine exécution** (à 3h00) pour vérifier que le problème est résolu
## Modalités d'analyse
- **Logs du script** : `data/sync-utxos.log` (100 dernières lignes conservées)
- **Vérifier les timeouts** : Chercher "timeout" dans les logs
- **Vérifier les retries** : Chercher "Tentative" dans les logs
- **Vérifier les erreurs** : Chercher "❌" dans les logs
## Prévention / suivi
- **Surveillance** : Surveiller les logs après chaque exécution pour détecter les problèmes
- **Ajustement** : Si vous avez plus de 500000 UTXOs, augmenter `maximumCount` ou optimiser l'approche
- **Timeout** : Si le timeout de 5 minutes est insuffisant, l'augmenter progressivement
- **Investigation** : En cas de répétition des problèmes, investiguer la mémoire disponible pour bitcoind
## Pages affectées
- `data/sync-utxos-spent-status.mjs` (script de synchronisation amélioré)
- `data/sync-utxos-cron.sh` (script cron amélioré)
- `fixKnowledge/sync-utxos-rpc-optimization.md` (ce document)
- `fixKnowledge/signet-bitcoind-crash-wallet-loading-stuck.md` (documentation du problème)