293 lines
7.4 KiB
Markdown
293 lines
7.4 KiB
Markdown
# Correctifs Finaux - 14 décembre 2025, 03:00
|
|
|
|
## 🔧 Problèmes Résolus
|
|
|
|
### Problème #1: CPU Cores = 0 dans le Payload JSON
|
|
|
|
**Symptôme** : Le benchmark affichait `✓ Cores: 24%, Threads: 24` et le payload JSON contenait `"cores": 0`.
|
|
|
|
**Cause** : Le parsing de `lscpu` capturait des caractères non-numériques (ex: `%` de "CPU scaling MHz: 118%").
|
|
|
|
**Solution** : Ajout de `gsub(/[^0-9]/,"",$2)` pour ne garder que les chiffres.
|
|
|
|
**Fichier modifié** : [scripts/bench.sh:243-250](scripts/bench.sh#L243-L250)
|
|
|
|
```bash
|
|
# AVANT
|
|
cores_per_socket=$(lscpu | awk -F: '/Core\(s\) per socket/ {gsub(/^[ \t]+/,"",$2); print $2}')
|
|
sockets=$(lscpu | awk -F: '/Socket\(s\)/ {gsub(/^[ \t]+/,"",$2); print $2}')
|
|
cores=$((${cores_per_socket:-1} * ${sockets:-1}))
|
|
|
|
# APRÈS
|
|
cores_per_socket=$(lscpu | awk -F: '/Core\(s\) per socket/ {gsub(/^[ \t]+/,"",$2); gsub(/[^0-9]/,"",$2); print $2}')
|
|
sockets=$(lscpu | awk -F: '/Socket\(s\)/ {gsub(/^[ \t]+/,"",$2); gsub(/[^0-9]/,"",$2); print $2}')
|
|
|
|
# S'assurer que les valeurs sont des nombres valides
|
|
[[ -z "$cores_per_socket" || "$cores_per_socket" == "0" ]] && cores_per_socket=1
|
|
[[ -z "$sockets" || "$sockets" == "0" ]] && sockets=1
|
|
|
|
cores=$((cores_per_socket * sockets))
|
|
```
|
|
|
|
**Résultat attendu** :
|
|
- Ryzen 9 5900X : `cores = 12` ✅ (au lieu de 0)
|
|
- Intel i5-2400 : `cores = 2` ✅ (au lieu de 0)
|
|
|
|
---
|
|
|
|
### Problème #2: Backend ne met pas à jour le Hardware Snapshot
|
|
|
|
**Symptôme** : Les données du benchmark étaient envoyées (HTTP 200) mais ne s'affichaient pas dans le frontend. Les champs `ram_used_mb`, `ram_free_mb`, `bios_version` restaient null ou anciens.
|
|
|
|
**Cause** : Le backend **créait TOUJOURS un nouveau `HardwareSnapshot`** au lieu de mettre à jour le snapshot existant du device.
|
|
|
|
**Code problématique** ([benchmark.py:54](backend/app/api/benchmark.py#L54)) :
|
|
```python
|
|
snapshot = HardwareSnapshot( # Toujours nouveau!
|
|
device_id=device.id,
|
|
captured_at=datetime.utcnow(),
|
|
# ... tous les champs
|
|
)
|
|
db.add(snapshot)
|
|
```
|
|
|
|
**Solution** : Récupérer le snapshot existant et le mettre à jour.
|
|
|
|
**Fichier modifié** : [backend/app/api/benchmark.py:52-132](backend/app/api/benchmark.py#L52-L132)
|
|
|
|
```python
|
|
# 2. Get or create hardware snapshot
|
|
hw = payload.hardware
|
|
|
|
# Check if we have an existing snapshot for this device
|
|
existing_snapshot = db.query(HardwareSnapshot).filter(
|
|
HardwareSnapshot.device_id == device.id
|
|
).order_by(HardwareSnapshot.captured_at.desc()).first()
|
|
|
|
# If we have an existing snapshot, update it instead of creating a new one
|
|
if existing_snapshot:
|
|
snapshot = existing_snapshot
|
|
snapshot.captured_at = datetime.utcnow() # Update timestamp
|
|
else:
|
|
# Create new snapshot if none exists
|
|
snapshot = HardwareSnapshot(
|
|
device_id=device.id,
|
|
captured_at=datetime.utcnow()
|
|
)
|
|
|
|
# Update all fields (whether new or existing snapshot)
|
|
snapshot.cpu_cores = hw.cpu.cores if hw.cpu else None
|
|
snapshot.ram_used_mb = hw.ram.used_mb if hw.ram else None
|
|
snapshot.ram_free_mb = hw.ram.free_mb if hw.ram else None
|
|
snapshot.bios_version = hw.motherboard.bios_version if hw.motherboard else None
|
|
# ... tous les autres champs
|
|
|
|
# Add to session only if it's a new snapshot
|
|
if not existing_snapshot:
|
|
db.add(snapshot)
|
|
|
|
db.flush()
|
|
```
|
|
|
|
**Comportement** :
|
|
- **Premier benchmark** : Crée un nouveau snapshot
|
|
- **Benchmarks suivants** : Met à jour le snapshot existant avec les nouvelles données
|
|
|
|
**Avantages** :
|
|
- ✅ RAM utilisée/libre toujours à jour
|
|
- ✅ Température disques mise à jour
|
|
- ✅ BIOS version conservée après le premier benchmark
|
|
- ✅ Un seul snapshot par device (plus simple)
|
|
|
|
---
|
|
|
|
## 📊 Impact des Correctifs
|
|
|
|
### Avant les Correctifs
|
|
|
|
**Payload JSON envoyé** :
|
|
```json
|
|
{
|
|
"hardware": {
|
|
"cpu": {
|
|
"cores": 0, ← BUG
|
|
"threads": 24
|
|
},
|
|
"ram": {
|
|
"used_mb": 13478,
|
|
"free_mb": 10864
|
|
},
|
|
"motherboard": {
|
|
"bios_version": "F65e"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Base de données** :
|
|
```json
|
|
{
|
|
"cpu_cores": 0, ← Ancien
|
|
"ram_used_mb": null, ← Non mis à jour
|
|
"ram_free_mb": null, ← Non mis à jour
|
|
"bios_version": null ← Non mis à jour
|
|
}
|
|
```
|
|
|
|
**Frontend** :
|
|
```
|
|
Cores: ? (0 affiché comme N/A)
|
|
RAM Utilisée: N/A
|
|
BIOS: N/A
|
|
```
|
|
|
|
### Après les Correctifs
|
|
|
|
**Payload JSON envoyé** :
|
|
```json
|
|
{
|
|
"hardware": {
|
|
"cpu": {
|
|
"cores": 12, ← CORRIGÉ
|
|
"threads": 24
|
|
},
|
|
"ram": {
|
|
"used_mb": 13478,
|
|
"free_mb": 10864
|
|
},
|
|
"motherboard": {
|
|
"bios_version": "F65e"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Base de données** :
|
|
```json
|
|
{
|
|
"cpu_cores": 12, ← Mis à jour
|
|
"ram_used_mb": 13478, ← Mis à jour
|
|
"ram_free_mb": 10864, ← Mis à jour
|
|
"bios_version": "F65e" ← Mis à jour
|
|
}
|
|
```
|
|
|
|
**Frontend** :
|
|
```
|
|
Cores: 12
|
|
RAM Utilisée: 13 GB (28%)
|
|
BIOS: F65e
|
|
```
|
|
|
|
---
|
|
|
|
## 🧪 Tests à Effectuer
|
|
|
|
### 1. Relancer le Benchmark
|
|
|
|
```bash
|
|
cd /home/gilles/Documents/vscode/serv_benchmark
|
|
sudo bash scripts/bench.sh
|
|
```
|
|
|
|
**Vérifications** :
|
|
- ✅ Console affiche `Cores: 12, Threads: 24` (sans `%`)
|
|
- ✅ Payload JSON contient `"cores": 12`
|
|
- ✅ HTTP 200 OK
|
|
|
|
### 2. Vérifier les Données dans la DB
|
|
|
|
```bash
|
|
curl -s http://localhost:8007/api/devices/2 | jq '.last_hardware_snapshot | {
|
|
cpu_cores,
|
|
cpu_threads,
|
|
ram_used_mb,
|
|
ram_free_mb,
|
|
bios_version,
|
|
bios_date
|
|
}'
|
|
```
|
|
|
|
**Résultat attendu** :
|
|
```json
|
|
{
|
|
"cpu_cores": 12,
|
|
"cpu_threads": 24,
|
|
"ram_used_mb": 13478,
|
|
"ram_free_mb": 10864,
|
|
"bios_version": "F65e",
|
|
"bios_date": "09/20/2023"
|
|
}
|
|
```
|
|
|
|
### 3. Vérifier le Frontend
|
|
|
|
```
|
|
http://localhost:8087/device_detail.html?id=2
|
|
```
|
|
|
|
**Sections à vérifier** :
|
|
- ⚡ Carte Mère : Gigabyte B450 AORUS ELITE + BIOS F65e
|
|
- 🔲 CPU : 12 cores, 24 threads
|
|
- 💾 RAM : 47 GB total, 13 GB utilisée (28%)
|
|
- 💿 Stockage : 7 disques détectés
|
|
- 🎮 GPU : NVIDIA GeForce RTX 3060
|
|
- 🌐 Réseau : eno1 (10.0.1.109)
|
|
- 📊 Benchmarks : Score global 145.82
|
|
|
|
---
|
|
|
|
## 📁 Fichiers Modifiés
|
|
|
|
| Fichier | Lignes | Changement |
|
|
|---------|--------|------------|
|
|
| [scripts/bench.sh](scripts/bench.sh) | 243-250 | Parsing robuste cores CPU + validation |
|
|
| [backend/app/api/benchmark.py](backend/app/api/benchmark.py) | 52-132 | Update snapshot existant au lieu de créer nouveau |
|
|
|
|
---
|
|
|
|
## 🎯 Prochaines Étapes
|
|
|
|
1. ✅ Scripts correctifs appliqués
|
|
2. ✅ Backend redémarré
|
|
3. ⏳ **Relancer le benchmark sur aorus** (action requise)
|
|
4. ⏳ Vérifier que toutes les données s'affichent
|
|
5. ⏳ Tester sur d'autres devices si disponibles
|
|
|
|
---
|
|
|
|
## 📝 Notes Techniques
|
|
|
|
### Pourquoi mettre à jour au lieu de créer ?
|
|
|
|
**Avantages** :
|
|
- Un seul snapshot par device = requêtes plus rapides
|
|
- RAM usage toujours à jour
|
|
- Historique conservé dans les `Benchmark` records
|
|
|
|
**Compromis** :
|
|
- Si le hardware change physiquement (nouveau CPU, nouvelle RAM), le snapshot sera écrasé
|
|
- Pour un vrai historique hardware, il faudrait créer un nouveau snapshot seulement quand le hardware change significativement
|
|
|
|
### Alternative Future
|
|
|
|
Implémenter une logique de détection de changement hardware :
|
|
```python
|
|
def hardware_changed_significantly(old_snapshot, new_hardware):
|
|
# Compare CPU, RAM total, GPU, nombre de disques
|
|
return (
|
|
old_snapshot.cpu_model != new_hardware.cpu.model or
|
|
old_snapshot.ram_total_mb != new_hardware.ram.total_mb or
|
|
old_snapshot.gpu_model != new_hardware.gpu.model
|
|
)
|
|
```
|
|
|
|
Si `hardware_changed_significantly() == True` → Créer nouveau snapshot
|
|
Sinon → Mettre à jour snapshot existant
|
|
|
|
---
|
|
|
|
**Version** : Frontend 2.0.2 / Backend 1.1.1 / Script 1.2.1
|
|
**Date** : 14 décembre 2025, 03:00
|
|
**Status** : ✅ Correctifs appliqués, prêt pour test
|