**Motivations:** - Synchronisation des modifications sur l'API anchorage, les services et le website skeleton - Ajout de scripts de monitoring et de diagnostic pour l'API anchorage - Documentation des problèmes de mutex et de provisioning UTXO **Root causes:** - N/A (commit de synchronisation) **Correctifs:** - N/A (commit de synchronisation) **Evolutions:** - Ajout de scripts de monitoring et de diagnostic pour l'API anchorage - Amélioration de la gestion des mutex et des UTXOs - Mise à jour de la documentation **Pages affectées:** - api-anchorage/src/bitcoin-rpc.js - api-anchorage/src/routes/anchor.js - api-anchorage/src/routes/health.js - api-anchorage/src/server.js - api-anchorage/README-MONITORING.md - api-anchorage/cleanup-stale-locks.mjs - api-anchorage/diagnose.mjs - api-anchorage/unlock-utxos.mjs - service-login-verify/src/persistentNonceCache.ts - signet-dashboard/src/server.js - signet-dashboard/public/* - userwallet/src/hooks/useChannel.ts - userwallet/src/services/relayNotificationService.ts - userwallet/src/utils/defaultContract.ts - website-skeleton/src/* - docs/DOMAINS_AND_PORTS.md - docs/INTERFACES.md - features/* - fixKnowledge/*
6.9 KiB
Correction: Mutex bloqué causant des timeouts dans l'API d'ancrage
Date: 2026-01-28 Auteur: Équipe 4NK
Problème
L'API d'ancrage Bitcoin ne répondait plus correctement. Toutes les requêtes d'ancrage échouaient avec des erreurs de timeout de mutex après 180 secondes (3 minutes).
Machine concernée : 192.168.1.105 (bitcoin) Domaine externe : https://anchorage.certificator.4nkweb.com Service : anchorage-api (port 3010)
Symptômes
- Erreurs répétées: Des centaines d'erreurs
Mutex acquisition timeout after 180000msdans les logs - UTXOs verrouillés: 22 UTXOs restaient verrouillés dans la base de données (
is_locked_in_mutex = 1) - API non fonctionnelle: Les requêtes d'ancrage échouaient systématiquement
- Blocage du mutex: Le mutex était bloqué depuis une requête d'ancrage à 12:29:40 qui n'avait jamais libéré le mutex
Impact
- Indisponibilité: L'API d'ancrage ne pouvait plus traiter de nouvelles requêtes
- UTXOs inutilisables: 22 UTXOs étaient verrouillés et non disponibles pour de nouvelles transactions
- Requêtes en attente: Toutes les nouvelles requêtes attendaient le timeout de 3 minutes avant d'échouer
Root cause
Une requête d'ancrage reçue à 12:29:40 (test-deploy-1769599785) a acquis le mutex mais s'est bloquée avant d'atteindre le bloc finally qui libère le mutex. Le mutex est resté bloqué indéfiniment, empêchant toutes les requêtes suivantes de s'exécuter.
Causes possibles:
- Appel RPC Bitcoin bloqué: Un appel RPC vers Bitcoin Core n'a jamais répondu (timeout ou blocage réseau)
- Opération asynchrone non résolue: Une Promise n'a jamais été résolue ou rejetée
- Erreur non gérée: Une erreur s'est produite avant d'atteindre le bloc
finally
Code concerné:
api-anchorage/src/bitcoin-rpc.js: MéthodecreateAnchorTransaction()ligne 230- Le mutex est acquis ligne 232 avec
await this.acquireUtxoMutex() - Le mutex devrait être libéré dans le bloc
finallyligne 908-914, mais si l'opération se bloque avant, lefinallyn'est jamais atteint
Correctifs
Solution immédiate (appliquée)
-
Redémarrage du service: Redémarrage forcé du service
anchorage-apipour libérer le mutex en mémoiresudo systemctl restart anchorage-api -
Déverrouillage des UTXOs dans la base de données: Le redémarrage libère le mutex en mémoire, mais les UTXOs restent verrouillés dans la base de données. Il faut les déverrouiller manuellement :
cd /home/ncantu/Bureau/code/bitcoin/api-anchorage node unlock-utxos.mjsOu directement avec SQL :
UPDATE utxos SET is_locked_in_mutex = 0 WHERE is_locked_in_mutex = 1; -
Vérification: Après redémarrage et déverrouillage, l'API répond correctement et les UTXOs sont disponibles
Solutions préventives à implémenter
- Timeout sur les appels RPC Bitcoin: Ajouter des timeouts explicites sur tous les appels RPC pour éviter les blocages indéfinis
- Libération forcée du mutex: Implémenter un mécanisme de libération automatique du mutex après un certain délai même si l'opération est en cours
- Monitoring des opérations longues: Logger les opérations qui prennent plus de 30 secondes pour identifier les blocages potentiels
- Health check amélioré: Vérifier l'état du mutex dans le health check et signaler si des UTXOs sont verrouillés depuis trop longtemps
Modifications
Fichiers concernés
api-anchorage/src/bitcoin-rpc.js: MéthodecreateAnchorTransaction()et gestion du mutexapi-anchorage/src/routes/anchor.js: Gestion des erreurs et timeouts
Modifications recommandées (à implémenter)
-
Ajouter des timeouts sur les appels RPC:
// Dans bitcoin-rpc.js, ajouter des timeouts sur tous les appels RPC const rpcCallWithTimeout = async (method, params, timeoutMs = 30000) => { return Promise.race([ this.client[method](...params), new Promise((_, reject) => setTimeout(() => reject(new Error(`RPC timeout: ${method}`)), timeoutMs) ) ]); }; -
Libération automatique du mutex:
// Dans createAnchorTransaction, ajouter un timer de sécurité const mutexTimeout = setTimeout(() => { logger.error('Mutex held for too long, forcing release', { hash }); releaseMutex(); }, 300000); // 5 minutes max try { // ... opération ... } finally { clearTimeout(mutexTimeout); releaseMutex(); } -
Déverrouillage automatique des UTXOs:
// Script de maintenance pour déverrouiller les UTXOs verrouillés depuis plus de 10 minutes // À exécuter périodiquement via cron
Modalités de déploiement
Vérification de l'état actuel
# Vérifier que le service est actif
sudo systemctl status anchorage-api
# Vérifier que l'API répond
curl http://localhost:3010/health
# Vérifier les UTXOs verrouillés
curl http://localhost:3010/api/anchor/locked-utxos
# Vérifier les logs récents
sudo journalctl -u anchorage-api -n 50 --no-pager
En cas de nouveau blocage
-
Identifier le problème:
# Vérifier les UTXOs verrouillés curl http://localhost:3010/api/anchor/locked-utxos # Vérifier les logs pour identifier la requête bloquée sudo journalctl -u anchorage-api --since "10 minutes ago" | grep "Anchor request" -
Redémarrer le service:
sudo systemctl restart anchorage-api -
Déverrouiller les UTXOs dans la base de données:
cd /home/ncantu/Bureau/code/bitcoin/api-anchorage node unlock-utxos.mjs -
Vérifier la récupération:
sleep 3 curl http://localhost:3010/health curl http://localhost:3010/api/anchor/locked-utxos # Le count doit être 0
Modalités d'analyse
Logs à surveiller
-
Erreurs de timeout de mutex:
sudo journalctl -u anchorage-api | grep "Mutex acquisition timeout" -
Requêtes d'ancrage:
sudo journalctl -u anchorage-api | grep "Anchor request received" -
UTXOs verrouillés:
curl http://localhost:3010/api/anchor/locked-utxos | jq '.count'
Métriques à surveiller
- Nombre d'UTXOs verrouillés: Doit être 0 en temps normal
- Durée des opérations d'ancrage: Ne devrait pas dépasser 30 secondes
- Erreurs de timeout: Ne devrait pas se produire en fonctionnement normal
Alertes recommandées
- UTXOs verrouillés > 5: Alerte warning
- UTXOs verrouillés > 10: Alerte critique
- Timeout de mutex: Alerte critique immédiate
Pages affectées
api-anchorage/src/bitcoin-rpc.js: Gestion du mutex et des timeoutsapi-anchorage/src/routes/anchor.js: Gestion des erreursfixKnowledge/api-anchorage-mutex-timeout-blocked.md: Documentation (nouveau)