**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>
5.3 KiB
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
- Appel RPC sans timeout : L'appel
listunspentn'avait pas de timeout, pouvant bloquer indéfiniment - Pas de vérification préalable : Le script ne vérifiait pas si bitcoind était disponible avant de faire l'appel lourd
- Pas de retry avec backoff : En cas d'échec temporaire, le script échouait immédiatement
- Limite trop élevée :
maximumCount: 9999999pouvait charger des centaines de milliers d'UTXOs en mémoire d'un coup - 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
listunspentavec 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
maximumCountde 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
- Ajout de
-
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
-
Vérifier que les scripts sont exécutables :
chmod +x data/sync-utxos-cron.sh -
Tester manuellement :
./data/sync-utxos-cron.sh -
Vérifier les logs :
tail -f data/sync-utxos.log -
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
maximumCountou 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)