**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>
136 lines
5.3 KiB
Markdown
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)
|