mirror of
https://github.com/octoleo/syncthing.git
synced 2024-11-08 22:31:04 +00:00
Detect deadlock in model and panic
This commit is contained in:
parent
8e8a579bb2
commit
4ab4816556
2
Godeps/Godeps.json
generated
2
Godeps/Godeps.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"ImportPath": "github.com/calmh/syncthing",
|
"ImportPath": "github.com/calmh/syncthing",
|
||||||
"GoVersion": "go1.2.2",
|
"GoVersion": "go1.3",
|
||||||
"Packages": [
|
"Packages": [
|
||||||
"./cmd/syncthing",
|
"./cmd/syncthing",
|
||||||
"./cmd/assets",
|
"./cmd/assets",
|
||||||
|
@ -25,6 +25,7 @@ func reportData(m *model.Model) map[string]interface{} {
|
|||||||
res := make(map[string]interface{})
|
res := make(map[string]interface{})
|
||||||
res["uniqueID"] = strings.ToLower(certID([]byte(myID)))[:6]
|
res["uniqueID"] = strings.ToLower(certID([]byte(myID)))[:6]
|
||||||
res["version"] = Version
|
res["version"] = Version
|
||||||
|
res["longVersion"] = LongVersion
|
||||||
res["platform"] = runtime.GOOS + "-" + runtime.GOARCH
|
res["platform"] = runtime.GOOS + "-" + runtime.GOARCH
|
||||||
res["numRepos"] = len(cfg.Repositories)
|
res["numRepos"] = len(cfg.Repositories)
|
||||||
res["numNodes"] = len(cfg.Nodes)
|
res["numNodes"] = len(cfg.Nodes)
|
||||||
|
@ -15,6 +15,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/calmh/syncthing/cid"
|
"github.com/calmh/syncthing/cid"
|
||||||
"github.com/calmh/syncthing/config"
|
"github.com/calmh/syncthing/config"
|
||||||
"github.com/calmh/syncthing/files"
|
"github.com/calmh/syncthing/files"
|
||||||
@ -96,6 +97,9 @@ func NewModel(indexDir string, cfg *config.Configuration, clientName, clientVers
|
|||||||
sup: suppressor{threshold: int64(cfg.Options.MaxChangeKbps)},
|
sup: suppressor{threshold: int64(cfg.Options.MaxChangeKbps)},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deadlockDetect(&m.rmut, 60*time.Second)
|
||||||
|
deadlockDetect(&m.smut, 60*time.Second)
|
||||||
|
deadlockDetect(&m.pmut, 60*time.Second)
|
||||||
go m.broadcastIndexLoop()
|
go m.broadcastIndexLoop()
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,8 @@ package model
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/calmh/syncthing/protocol"
|
"github.com/calmh/syncthing/protocol"
|
||||||
"github.com/calmh/syncthing/scanner"
|
"github.com/calmh/syncthing/scanner"
|
||||||
@ -90,3 +92,27 @@ func compareClusterConfig(local, remote protocol.ClusterConfigMessage) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func deadlockDetect(mut sync.Locker, timeout time.Duration) {
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
time.Sleep(timeout / 4)
|
||||||
|
ok := make(chan bool, 2)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
mut.Lock()
|
||||||
|
mut.Unlock()
|
||||||
|
ok <- true
|
||||||
|
}()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
time.Sleep(timeout)
|
||||||
|
ok <- false
|
||||||
|
}()
|
||||||
|
|
||||||
|
if r := <-ok; !r {
|
||||||
|
panic("deadlock detected")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user