diff --git a/lib/db/lowlevel.go b/lib/db/lowlevel.go index ba6f4b48b..51608dc49 100644 --- a/lib/db/lowlevel.go +++ b/lib/db/lowlevel.go @@ -693,20 +693,19 @@ func (db *Lowlevel) gcIndirect(ctx context.Context) (err error) { var discardedBlocks, matchedBlocks, discardedVersions, matchedVersions int - internalCtx, cancel := context.WithCancel(ctx) - defer cancel() - go func() { - // Only print something if the process takes more than "a moment". - select { - case <-internalCtx.Done(): - case <-time.After(10 * time.Second): - l.Infoln("Database GC started - many Syncthing operations will be unresponsive until it's finished") - <-internalCtx.Done() - if err != nil || ctx.Err() != nil { - return - } - l.Infof("Database GC done (discarded/remaining: %v/%v blocks, %v/%v versions)", discardedBlocks, matchedBlocks, discardedVersions, matchedVersions) + // Only print something if the process takes more than "a moment". + logWait := make(chan struct{}) + logTimer := time.AfterFunc(10*time.Second, func() { + l.Infoln("Database GC started - many Syncthing operations will be unresponsive until it's finished") + close(logWait) + }) + defer func() { + if logTimer.Stop() || err != nil { + return } + <-logWait // Make sure messages are sent in order. + l.Infof("Database GC done (discarded/remaining: %v/%v blocks, %v/%v versions)", + discardedBlocks, matchedBlocks, discardedVersions, matchedVersions) }() t, err := db.newReadWriteTransaction()