mirror of
https://github.com/octoleo/syncthing.git
synced 2025-01-03 15:17:25 +00:00
lib/model: Close connections when model is stopped (#5733)
This commit is contained in:
parent
5d35b2c540
commit
64518b0f7e
@ -180,6 +180,7 @@ var (
|
|||||||
// errors about why a connection is closed
|
// errors about why a connection is closed
|
||||||
errIgnoredFolderRemoved = errors.New("folder no longer ignored")
|
errIgnoredFolderRemoved = errors.New("folder no longer ignored")
|
||||||
errReplacingConnection = errors.New("replacing connection")
|
errReplacingConnection = errors.New("replacing connection")
|
||||||
|
errStopped = errors.New("Syncthing is being stopped")
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewModel creates and starts a new model. The model starts in read-only mode,
|
// NewModel creates and starts a new model. The model starts in read-only mode,
|
||||||
@ -225,6 +226,25 @@ func NewModel(cfg config.Wrapper, id protocol.DeviceID, clientName, clientVersio
|
|||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *model) Stop() {
|
||||||
|
m.Supervisor.Stop()
|
||||||
|
devs := m.cfg.Devices()
|
||||||
|
ids := make([]protocol.DeviceID, 0, len(devs))
|
||||||
|
for id := range devs {
|
||||||
|
ids = append(ids, id)
|
||||||
|
}
|
||||||
|
m.pmut.RLock()
|
||||||
|
closed := make([]chan struct{}, 0, len(m.closed))
|
||||||
|
for _, c := range m.closed {
|
||||||
|
closed = append(closed, c)
|
||||||
|
}
|
||||||
|
m.pmut.RUnlock()
|
||||||
|
m.closeConns(ids, errStopped)
|
||||||
|
for _, c := range closed {
|
||||||
|
<-c
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// StartDeadlockDetector starts a deadlock detector on the models locks which
|
// StartDeadlockDetector starts a deadlock detector on the models locks which
|
||||||
// causes panics in case the locks cannot be acquired in the given timeout
|
// causes panics in case the locks cannot be acquired in the given timeout
|
||||||
// period.
|
// period.
|
||||||
|
@ -862,15 +862,6 @@ func TestIssue5063(t *testing.T) {
|
|||||||
m := newState(defaultAutoAcceptCfg)
|
m := newState(defaultAutoAcceptCfg)
|
||||||
defer cleanupModel(m)
|
defer cleanupModel(m)
|
||||||
|
|
||||||
m.pmut.Lock()
|
|
||||||
for _, c := range m.conn {
|
|
||||||
conn := c.(*fakeConnection)
|
|
||||||
conn.mut.Lock()
|
|
||||||
conn.closeFn = func(_ error) {}
|
|
||||||
conn.mut.Unlock()
|
|
||||||
}
|
|
||||||
m.pmut.Unlock()
|
|
||||||
|
|
||||||
wg := sync.WaitGroup{}
|
wg := sync.WaitGroup{}
|
||||||
|
|
||||||
addAndVerify := func(id string) {
|
addAndVerify := func(id string) {
|
||||||
@ -3267,12 +3258,7 @@ func TestSanitizePath(t *testing.T) {
|
|||||||
func TestConnCloseOnRestart(t *testing.T) {
|
func TestConnCloseOnRestart(t *testing.T) {
|
||||||
w, fcfg := tmpDefaultWrapper()
|
w, fcfg := tmpDefaultWrapper()
|
||||||
m := setupModel(w)
|
m := setupModel(w)
|
||||||
defer func() {
|
defer cleanupModelAndRemoveDir(m, fcfg.Filesystem().URI())
|
||||||
m.Stop()
|
|
||||||
m.db.Close()
|
|
||||||
os.RemoveAll(fcfg.Filesystem().URI())
|
|
||||||
os.Remove(w.ConfigPath())
|
|
||||||
}()
|
|
||||||
|
|
||||||
br := &testutils.BlockingRW{}
|
br := &testutils.BlockingRW{}
|
||||||
nw := &testutils.NoopRW{}
|
nw := &testutils.NoopRW{}
|
||||||
@ -3291,6 +3277,7 @@ func TestConnCloseOnRestart(t *testing.T) {
|
|||||||
t.Fatal("Timed out before folder restart returned")
|
t.Fatal("Timed out before folder restart returned")
|
||||||
}
|
}
|
||||||
m.pmut.RLock()
|
m.pmut.RLock()
|
||||||
|
defer m.pmut.RUnlock()
|
||||||
if len(m.conn) != 0 {
|
if len(m.conn) != 0 {
|
||||||
t.Errorf("Conn wasn't removed on restart (len(m.conn) == %v)", len(m.conn))
|
t.Errorf("Conn wasn't removed on restart (len(m.conn) == %v)", len(m.conn))
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user