lib/model: Handle index sender terminating due to error (fixes #7231) (#7232)

This commit is contained in:
Simon Frei
2020-12-30 09:59:11 +01:00
committed by GitHub
parent 3d1edd2492
commit 0f8290485e
+6 -3
View File
@@ -30,6 +30,7 @@ type indexSender struct {
prevSequence int64 prevSequence int64
evLogger events.Logger evLogger events.Logger
connClosed chan struct{} connClosed chan struct{}
done chan struct{}
token suture.ServiceToken token suture.ServiceToken
pauseChan chan struct{} pauseChan chan struct{}
resumeChan chan *db.FileSet resumeChan chan *db.FileSet
@@ -38,6 +39,7 @@ type indexSender struct {
func (s *indexSender) Serve(ctx context.Context) (err error) { func (s *indexSender) Serve(ctx context.Context) (err error) {
l.Debugf("Starting indexSender for %s to %s at %s (slv=%d)", s.folder, s.conn.ID(), s.conn, s.prevSequence) l.Debugf("Starting indexSender for %s to %s at %s (slv=%d)", s.folder, s.conn.ID(), s.conn, s.prevSequence)
defer func() { defer func() {
close(s.done)
err = svcutil.NoRestartErr(err) err = svcutil.NoRestartErr(err)
l.Debugf("Exiting indexSender for %s to %s at %s: %v", s.folder, s.conn.ID(), s.conn, err) l.Debugf("Exiting indexSender for %s to %s at %s: %v", s.folder, s.conn.ID(), s.conn, err)
}() }()
@@ -101,14 +103,14 @@ func (s *indexSender) Serve(ctx context.Context) (err error) {
func (s *indexSender) resume(fset *db.FileSet) { func (s *indexSender) resume(fset *db.FileSet) {
select { select {
case <-s.connClosed: case <-s.done:
case s.resumeChan <- fset: case s.resumeChan <- fset:
} }
} }
func (s *indexSender) pause() { func (s *indexSender) pause() {
select { select {
case <-s.connClosed: case <-s.done:
case s.pauseChan <- struct{}{}: case s.pauseChan <- struct{}{}:
} }
} }
@@ -314,6 +316,7 @@ func (r *indexSenderRegistry) addLocked(folder config.FolderConfiguration, fset
is := &indexSender{ is := &indexSender{
conn: r.conn, conn: r.conn,
connClosed: r.closed, connClosed: r.closed,
done: make(chan struct{}),
folder: folder.ID, folder: folder.ID,
folderIsReceiveEncrypted: folder.Type == config.FolderTypeReceiveEncrypted, folderIsReceiveEncrypted: folder.Type == config.FolderTypeReceiveEncrypted,
fset: fset, fset: fset,
@@ -366,7 +369,7 @@ func (r *indexSenderRegistry) removeAllExcept(except map[string]struct{}) {
delete(r.indexSenders, folder) delete(r.indexSenders, folder)
} }
} }
for folder := range r.indexSenders { for folder := range r.startInfos {
if _, ok := except[folder]; !ok { if _, ok := except[folder]; !ok {
delete(r.startInfos, folder) delete(r.startInfos, folder)
} }