From bb375b1affadb00cdeaf419ce0dc252610c031ec Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Fri, 14 Feb 2020 08:11:54 +0100 Subject: [PATCH] lib/model: Stop summary sender faster (ref #6319) (#6341) One of the causes of "panic: database is closed" is that we try to send summaries after it's been closed. Calculating summaries can take a long time and if we have a lot of folders it's not unreasonable to think that we might be stopped in this loop, so prepare to bail here. * push --- lib/model/folder_summary.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/model/folder_summary.go b/lib/model/folder_summary.go index 0c210b491..2bc193769 100644 --- a/lib/model/folder_summary.go +++ b/lib/model/folder_summary.go @@ -270,7 +270,12 @@ func (c *folderSummaryService) calculateSummaries(ctx context.Context) { case <-pump.C: t0 := time.Now() for _, folder := range c.foldersToHandle() { - c.sendSummary(folder) + select { + case <-ctx.Done(): + return + default: + } + c.sendSummary(ctx, folder) } // We don't want to spend all our time calculating summaries. Lets @@ -280,7 +285,7 @@ func (c *folderSummaryService) calculateSummaries(ctx context.Context) { pump.Reset(wait) case folder := <-c.immediate: - c.sendSummary(folder) + c.sendSummary(ctx, folder) case <-ctx.Done(): return @@ -313,7 +318,7 @@ func (c *folderSummaryService) foldersToHandle() []string { } // sendSummary send the summary events for a single folder -func (c *folderSummaryService) sendSummary(folder string) { +func (c *folderSummaryService) sendSummary(ctx context.Context, folder string) { // The folder summary contains how many bytes, files etc // are in the folder and how in sync we are. data, err := c.Summary(folder) @@ -326,6 +331,12 @@ func (c *folderSummaryService) sendSummary(folder string) { }) for _, devCfg := range c.cfg.Folders()[folder].Devices { + select { + case <-ctx.Done(): + return + default: + } + if devCfg.DeviceID.Equals(c.id) { // We already know about ourselves. continue