mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-20 05:28:15 +02:00
Le flux de reponse coupe ne s'arrete plus en silence (issue #19)
sc.Scan() rend false aussi bien a la fin normale d'un flux qu'a la premiere erreur de lecture, et sc.Err() n'etait JAMAIS consulte. Une connexion reinitialisee en plein milieu, ou une ligne plus longue que le tampon, etait donc indiscernable d'une fin propre : le tour s'arretait sans un mot pendant que le journal de llama-server affichait un « stop processing » parfaitement normal. C'est le symptome rapporte — l'agent enchaine quelques commandes puis rend la main sans avoir termine ni commente. Pire : des appels d'outils accumules a moitie auraient ete EXECUTES avec des arguments tronques. On abandonne desormais le tour en nommant la cause, le texte deja recu reste affiche, et un stop volontaire reste silencieux. Trois tests couvrent les trois cas ; celui du flux coupe echoue bien sur l'ancien code. Tampon du scanner porte de 1 a 8 Mio au passage : la cause la plus probable d'une ligne trop longue est un appel d'outil demesure, et jusqu'ici il partait dans le meme silence. Sans rapport, trouve en faisant tourner la suite : renameAside tirait son nom du seul UnixNano, dont la granularite Windows peut rendre deux fois la meme valeur — deux ecartements se disputaient alors le meme nom, le second ecrasant le binaire mis de cote par le premier. Un compteur atomique les departage.
This commit is contained in:
1 parent
4a66b27227
commit
42cdb2cda3
3 files changed
+178
-3
No files matched your search
@@ -12,6 +12,7 @@ import (
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"golang.org/x/mod/semver"
|
||||
@@ -380,8 +381,14 @@ func replaceBinary(exe, tmp string) error {
|
||||
// permet de remplacer l'image d'un exécutable en cours d'exécution. Reproduit
|
||||
// puis vérifié corrigé sur banc d'essai, deux processus vivants sur les deux
|
||||
// noms : avec un suffixe unique le renommage passe.
|
||||
// asideSeq départage deux écartements rapprochés. UnixNano seul ne suffit PAS :
|
||||
// la granularité de l'horloge Windows peut rendre la même valeur à deux appels
|
||||
// consécutifs, et les deux écartements se disputaient alors le même nom — le
|
||||
// second renommage écrasant le premier, donc le binaire précédent perdu.
|
||||
var asideSeq atomic.Uint64
|
||||
|
||||
func renameAside(path string) (string, error) {
|
||||
aside := fmt.Sprintf("%s.old-%d", path, time.Now().UnixNano())
|
||||
aside := fmt.Sprintf("%s.old-%d-%d", path, time.Now().UnixNano(), asideSeq.Add(1))
|
||||
if err := os.Rename(path, aside); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user