Fix dashboard home blocked by startup initialization
**Motivations:** - La page home rame et ne s'affiche pas - Les requêtes API timeout, la page reste blanche **Root causes:** - initializeFiles() au démarrage appelle getHashList() et getUtxoList() - Cache UTXO obsolète force une mise à jour complète (37k+ UTXOs) - Ces opérations bloquent la boucle d'événements Node.js **Correctifs:** - Suppression de l'initialisation au démarrage (initializeFiles) - Suppression de la fonction initializeFiles (code mort) - Mise à jour des fichiers à la demande via /api/hash/list et /api/utxo/list **Evolutions:** - Le serveur répond immédiatement au démarrage - La home s'affiche correctement **Pages affectées:** - signet-dashboard/src/server.js - fixKnowledge/dashboard-home-blocked-by-startup-init.md
This commit is contained in:
parent
548eb220da
commit
8158f833cf
46
fixKnowledge/dashboard-home-blocked-by-startup-init.md
Normal file
46
fixKnowledge/dashboard-home-blocked-by-startup-init.md
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# Page home bloquée par l'initialisation au démarrage
|
||||||
|
|
||||||
|
**Auteur** : Équipe 4NK
|
||||||
|
**Date** : 2026-01-26
|
||||||
|
**Version** : 1.0
|
||||||
|
|
||||||
|
## Problème
|
||||||
|
|
||||||
|
La page home rame et ne s'affiche pas. Les requêtes API (blockchain/info, utxo/count, anchor/count, etc.) timeout.
|
||||||
|
|
||||||
|
## Symptômes
|
||||||
|
|
||||||
|
- La page home ne se charge pas ou reste blanche
|
||||||
|
- Erreurs "Failed to fetch" dans la console
|
||||||
|
- Les appels `curl` vers les APIs timeout (10s+)
|
||||||
|
|
||||||
|
## Root causes
|
||||||
|
|
||||||
|
1. **Initialisation au démarrage** : Le serveur appelle `initializeFiles()` au démarrage, qui exécute `getHashList()` et `getUtxoList()` en parallèle.
|
||||||
|
2. **Cache UTXO obsolète** : Si `utxo_list_cache.txt` a l'ancien format (1 partie au lieu de 2), une mise à jour complète est déclenchée (37k+ UTXOs).
|
||||||
|
3. **Blocage du serveur** : Ces opérations (lectures/écritures sync, nombreux appels RPC) saturent la boucle d’événements Node.js. Le serveur ne peut plus traiter les requêtes HTTP.
|
||||||
|
|
||||||
|
## Correctifs
|
||||||
|
|
||||||
|
1. **Suppression de l’initialisation au démarrage** : Ne plus appeler `initializeFiles()` au démarrage du serveur.
|
||||||
|
2. **Suppression de la fonction `initializeFiles`** : Code mort supprimé.
|
||||||
|
3. **Mise à jour à la demande** : Les fichiers sont mis à jour lors des appels à `/api/hash/list` et `/api/utxo/list` (pages Liste des Hash, Liste des UTXO).
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
- La home utilise `/api/blockchain/info`, `/api/anchor/count`, `/api/utxo/count`, etc., qui lisent les fichiers existants ou font des appels RPC légers. Aucune mise à jour complète n’est déclenchée au chargement de la home.
|
||||||
|
- Les pages Liste des Hash et Liste des UTXO peuvent être lentes au premier chargement (mise à jour des fichiers), mais le serveur reste réactif pour les autres requêtes.
|
||||||
|
|
||||||
|
## Modalités de déploiement
|
||||||
|
|
||||||
|
1. Redémarrer le service : `sudo systemctl restart signet-dashboard.service`
|
||||||
|
2. Vérifier que les APIs répondent : `curl -s -o /dev/null -w "%{http_code}\n" http://localhost:3020/api/blockchain/info` (attendu : 200)
|
||||||
|
|
||||||
|
## Modalités d'analyse
|
||||||
|
|
||||||
|
- Vérifier les logs : `sudo journalctl -u signet-dashboard.service -f`
|
||||||
|
- Tester les APIs : `curl http://localhost:3020/api/blockchain/info`, `curl http://localhost:3020/api/utxo/count`, `curl http://localhost:3020/api/anchor/count`
|
||||||
|
|
||||||
|
## Pages affectées
|
||||||
|
|
||||||
|
- `signet-dashboard/src/server.js` : suppression de `initializeFiles` et de son appel au démarrage
|
||||||
@ -274,6 +274,7 @@ app.get('/api/hash/list.txt', async (req, res) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Route optimisée pour obtenir uniquement les counts UTXO (sans charger toute la liste)
|
// Route optimisée pour obtenir uniquement les counts UTXO (sans charger toute la liste)
|
||||||
|
// Lit directement depuis le fichier texte pour être très rapide
|
||||||
app.get('/api/utxo/count', async (req, res) => {
|
app.get('/api/utxo/count', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const { readFileSync, existsSync } = await import('fs');
|
const { readFileSync, existsSync } = await import('fs');
|
||||||
@ -298,16 +299,18 @@ app.get('/api/utxo/count', async (req, res) => {
|
|||||||
|
|
||||||
for (const line of lines) {
|
for (const line of lines) {
|
||||||
const parts = line.split(';');
|
const parts = line.split(';');
|
||||||
if (parts.length >= 7) {
|
// Format: category;txid;vout;amount;confirmations;isAnchorChange;blockTime
|
||||||
|
if (parts.length >= 5) {
|
||||||
const category = parts[0];
|
const category = parts[0];
|
||||||
const amount = parseFloat(parts[3]) || 0;
|
const amount = parseFloat(parts[3]) || 0;
|
||||||
const confirmations = parseInt(parts[4], 10) || 0;
|
const confirmations = parseInt(parts[4], 10) || 0;
|
||||||
const isAnchorChange = parts[5] === 'true';
|
|
||||||
|
|
||||||
|
// Compter les UTXOs de type anchor avec les critères minimum
|
||||||
if (category === 'anchor' && amount >= minAnchorAmount && confirmations > 0) {
|
if (category === 'anchor' && amount >= minAnchorAmount && confirmations > 0) {
|
||||||
anchors++;
|
anchors++;
|
||||||
// On assume que les UTXOs dans le fichier ne sont pas dépensés (isSpentOnchain serait dans un autre champ)
|
// Note: On ne peut pas savoir depuis le fichier si l'UTXO est dépensé
|
||||||
// Pour être sûr, on vérifie seulement les confirmations
|
// On compte tous les UTXOs avec confirmations > 0 comme disponibles
|
||||||
|
// C'est une approximation mais beaucoup plus rapide que de charger toute la liste
|
||||||
availableForAnchor++;
|
availableForAnchor++;
|
||||||
if (confirmations >= 6) {
|
if (confirmations >= 6) {
|
||||||
confirmedAvailableForAnchor++;
|
confirmedAvailableForAnchor++;
|
||||||
@ -909,24 +912,6 @@ app.use((req, res) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Initialisation des fichiers au démarrage
|
|
||||||
async function initializeFiles() {
|
|
||||||
try {
|
|
||||||
logger.info('Initializing hash and UTXO lists...');
|
|
||||||
await Promise.all([
|
|
||||||
bitcoinRPC.getHashList().catch((error) => {
|
|
||||||
logger.warn('Error initializing hash list', { error: error.message });
|
|
||||||
}),
|
|
||||||
bitcoinRPC.getUtxoList().catch((error) => {
|
|
||||||
logger.warn('Error initializing UTXO list', { error: error.message });
|
|
||||||
}),
|
|
||||||
]);
|
|
||||||
logger.info('Hash and UTXO lists initialized');
|
|
||||||
} catch (error) {
|
|
||||||
logger.error('Error initializing files', { error: error.message });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Démarrage du serveur
|
// Démarrage du serveur
|
||||||
const server = app.listen(PORT, HOST, async () => {
|
const server = app.listen(PORT, HOST, async () => {
|
||||||
logger.info(`Dashboard Bitcoin Signet démarré`, {
|
logger.info(`Dashboard Bitcoin Signet démarré`, {
|
||||||
@ -935,10 +920,10 @@ const server = app.listen(PORT, HOST, async () => {
|
|||||||
environment: process.env.NODE_ENV || 'production',
|
environment: process.env.NODE_ENV || 'production',
|
||||||
});
|
});
|
||||||
|
|
||||||
// Initialiser les fichiers en arrière-plan
|
// Ne pas initialiser les fichiers au démarrage : getHashList/getUtxoList
|
||||||
initializeFiles().catch((error) => {
|
// bloquent le serveur (mise à jour complète si cache obsolète) et empêchent
|
||||||
logger.error('Error during file initialization', { error: error.message });
|
// la page de s'afficher. Les fichiers sont mis à jour à la demande via
|
||||||
});
|
// /api/hash/list et /api/utxo/list.
|
||||||
});
|
});
|
||||||
|
|
||||||
// Gestion de l'arrêt propre
|
// Gestion de l'arrêt propre
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user