From 95c9561e97d9127b4232f077cb6a61e3d32a6d0d Mon Sep 17 00:00:00 2001 From: greatroar <61184462+greatroar@users.noreply.github.com> Date: Mon, 31 May 2021 09:50:21 +0200 Subject: [PATCH] lib/db: Clean up Timer and wait for logging before return in GC (#7720) --- lib/db/lowlevel.go | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) 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()