Browse Source

Merge pull request #1607 from syncthing/deadlock

Don't run deadlock detection in release mode unless asked to (fixes #1536)
Jakob Borg 10 years ago
parent
commit
2a48fb8e87
2 changed files with 19 additions and 10 deletions
  1. 11 0
      cmd/syncthing/main.go
  2. 8 10
      internal/model/model.go

+ 11 - 0
cmd/syncthing/main.go

@@ -50,6 +50,7 @@ var (
 	BuildHost   = "unknown"
 	BuildUser   = "unknown"
 	IsRelease   bool
+	IsBeta      bool
 	LongVersion string
 )
 
@@ -80,6 +81,7 @@ func init() {
 	// Check for a clean release build.
 	exp := regexp.MustCompile(`^v\d+\.\d+\.\d+(-beta[\d\.]+)?$`)
 	IsRelease = exp.MatchString(Version)
+	IsBeta = strings.Contains(Version, "beta")
 
 	stamp, _ := strconv.Atoi(BuildStamp)
 	BuildDate = time.Unix(int64(stamp), 0)
@@ -510,6 +512,15 @@ func syncthingMain() {
 
 	m := model.NewModel(cfg, myID, myName, "syncthing", Version, ldb)
 
+	if t := os.Getenv("STDEADLOCKTIMEOUT"); len(t) > 0 {
+		it, err := strconv.Atoi(t)
+		if err == nil {
+			m.StartDeadlockDetector(time.Duration(it) * time.Second)
+		}
+	} else if !IsRelease || IsBeta {
+		m.StartDeadlockDetector(20 * 60 * time.Second)
+	}
+
 	// GUI
 
 	setupGUI(cfg, m)

+ 8 - 10
internal/model/model.go

@@ -17,7 +17,6 @@ import (
 	"net"
 	"os"
 	"path/filepath"
-	"strconv"
 	"strings"
 	"sync"
 	"time"
@@ -118,18 +117,17 @@ func NewModel(cfg *config.Wrapper, id protocol.DeviceID, deviceName, clientName,
 		go m.progressEmitter.Serve()
 	}
 
-	var timeout = 20 * 60 // seconds
-	if t := os.Getenv("STDEADLOCKTIMEOUT"); len(t) > 0 {
-		it, err := strconv.Atoi(t)
-		if err == nil {
-			timeout = it
-		}
-	}
-	deadlockDetect(&m.fmut, time.Duration(timeout)*time.Second)
-	deadlockDetect(&m.pmut, time.Duration(timeout)*time.Second)
 	return m
 }
 
+// Starts deadlock detector on the models locks which causes panics in case
+// the locks cannot be acquired in the given timeout period.
+func (m *Model) StartDeadlockDetector(timeout time.Duration) {
+	l.Infof("Starting deadlock detector with %v timeout", timeout)
+	deadlockDetect(&m.fmut, timeout)
+	deadlockDetect(&m.pmut, timeout)
+}
+
 // StartRW starts read/write processing on the current model. When in
 // read/write mode the model will attempt to keep in sync with the cluster by
 // pulling needed files from peer devices.