mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-11 17:26:57 +02:00
bbolt pose un verrou exclusif sur son fichier : le service de lien, qui tourne en permanence, empechait toute commande CLI de s'executer a cote. La base est desormais ouverte pour la duree d'une operation puis refermee, et les buckets ne sont crees qu'a l'ecriture (une lecture ne coute plus un fsync : 3,8 ms -> 0,55 ms). Test de concurrence a l'appui.
36 lines
764 B
Go
36 lines
764 B
Go
package ajean
|
|
|
|
import (
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// Deux « process » logiques qui martèlent la base en parallèle ne doivent ni
|
|
// s'exclure ni perdre d'écriture : c'est le scénario du serveur, où le service
|
|
// de lien tourne pendant qu'on tape des commandes.
|
|
func TestAccesConcurrent(t *testing.T) {
|
|
testHome(t)
|
|
var wg sync.WaitGroup
|
|
for i := 0; i < 8; i++ {
|
|
wg.Add(1)
|
|
go func(n int) {
|
|
defer wg.Done()
|
|
for j := 0; j < 20; j++ {
|
|
_ = SetConfigKey("K", "v")
|
|
_ = ReadConfig()
|
|
}
|
|
}(i)
|
|
}
|
|
done := make(chan struct{})
|
|
go func() { wg.Wait(); close(done) }()
|
|
select {
|
|
case <-done:
|
|
case <-time.After(30 * time.Second):
|
|
t.Fatal("blocage sous accès concurrent")
|
|
}
|
|
if ReadConfig()["K"] != "v" {
|
|
t.Fatal("écriture perdue")
|
|
}
|
|
}
|