Detect deadlock in model and panic

This commit is contained in:
Jakob Borg 2014-06-21 09:43:12 +02:00
parent 8e8a579bb2
commit 4ab4816556
4 changed files with 32 additions and 1 deletions

2
Godeps/Godeps.json generated
View File

@ -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",

View File

@ -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)

View File

@ -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
} }

View File

@ -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")
}
}
}()
}