lib/db: Clean up Timer and wait for logging before return in GC (#7720)

This commit is contained in:
greatroar 2021-05-31 09:50:21 +02:00 committed by GitHub
parent fcb19518c7
commit 95c9561e97
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 12 additions and 13 deletions

View File

@ -693,20 +693,19 @@ func (db *Lowlevel) gcIndirect(ctx context.Context) (err error) {
var discardedBlocks, matchedBlocks, discardedVersions, matchedVersions int 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". // Only print something if the process takes more than "a moment".
select { logWait := make(chan struct{})
case <-internalCtx.Done(): logTimer := time.AfterFunc(10*time.Second, func() {
case <-time.After(10 * time.Second):
l.Infoln("Database GC started - many Syncthing operations will be unresponsive until it's finished") l.Infoln("Database GC started - many Syncthing operations will be unresponsive until it's finished")
<-internalCtx.Done() close(logWait)
if err != nil || ctx.Err() != nil { })
defer func() {
if logTimer.Stop() || err != nil {
return return
} }
l.Infof("Database GC done (discarded/remaining: %v/%v blocks, %v/%v versions)", discardedBlocks, matchedBlocks, discardedVersions, matchedVersions) <-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() t, err := db.newReadWriteTransaction()