mirror of
https://github.com/octoleo/syncthing.git
synced 2024-09-19 21:29:01 +00:00
Verify locking and correct update order for global
This commit is contained in:
parent
528cbf62ec
commit
c7dde9499f
@ -8,6 +8,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"sort"
|
"sort"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/syncthing/syncthing/files"
|
"github.com/syncthing/syncthing/files"
|
||||||
"github.com/syncthing/syncthing/lamport"
|
"github.com/syncthing/syncthing/lamport"
|
||||||
@ -592,3 +593,62 @@ func TestLocalVersion(t *testing.T) {
|
|||||||
t.Fatal("Local version number should be unchanged")
|
t.Fatal("Local version number should be unchanged")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var gf protocol.FileInfo
|
||||||
|
|
||||||
|
func TestStressGlobalVersion(t *testing.T) {
|
||||||
|
dur := 15 * time.Second
|
||||||
|
if testing.Short() {
|
||||||
|
dur = 1 * time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
set1 := []protocol.FileInfo{
|
||||||
|
protocol.FileInfo{Name: "a", Version: 1000},
|
||||||
|
protocol.FileInfo{Name: "b", Version: 1000},
|
||||||
|
}
|
||||||
|
set2 := []protocol.FileInfo{
|
||||||
|
protocol.FileInfo{Name: "b", Version: 1001},
|
||||||
|
protocol.FileInfo{Name: "c", Version: 1000},
|
||||||
|
}
|
||||||
|
|
||||||
|
db, err := leveldb.OpenFile("testdata/global.db", nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
m := files.NewSet("test", db)
|
||||||
|
|
||||||
|
done := make(chan struct{})
|
||||||
|
go stressWriter(m, remoteNode, set1, nil, done)
|
||||||
|
go stressWriter(m, protocol.LocalNodeID, set2, nil, done)
|
||||||
|
|
||||||
|
t0 := time.Now()
|
||||||
|
for time.Since(t0) < dur {
|
||||||
|
m.WithGlobal(func(f protocol.FileInfo) bool {
|
||||||
|
gf = f
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
close(done)
|
||||||
|
}
|
||||||
|
|
||||||
|
func stressWriter(s *files.Set, id protocol.NodeID, set1, set2 []protocol.FileInfo, done chan struct{}) {
|
||||||
|
one := true
|
||||||
|
i := 0
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-done:
|
||||||
|
return
|
||||||
|
|
||||||
|
default:
|
||||||
|
if one {
|
||||||
|
s.Replace(id, set1)
|
||||||
|
} else {
|
||||||
|
s.Replace(id, set2)
|
||||||
|
}
|
||||||
|
one = !one
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user