bisync: fix memory leak when running via the rc
Before this change, `fastCopy` created a cancellable context for the sync and stored its cancel func on the `bisyncRun`, but only ever called it when gracefully shutting down. On a normal run, it was never called, and until it is cancelled, a context from `context.WithCancel` stays registered with its nearest cancellable ancestor. For an rc job, that ancestor is the job's own context, which the job registry retains for `--rc-job-expire-duration`. The sync context carries bisync's `LoggerOpt`, whose `LoggerFn` is a method value on `*bisyncRun`, so a finished run was kept alive -- including the Path1 and Path2 listings -- for as long as the job was. This change fixes the issue by cancelling the sync context when `fastCopy` returns. The cancel func is still stored on the `bisyncRun`, so a graceful shutdown can still interrupt a sync that is in progress.
This commit is contained in:
+3
-1
@@ -247,7 +247,9 @@ func (b *bisyncRun) fastCopy(ctx context.Context, fsrc, fdst fs.Fs, files bilib.
|
||||
|
||||
b.SyncCI = fs.GetConfig(ctxCopy) // allows us to request graceful shutdown
|
||||
accounting.Stats(ctxCopy).SetMaxCompletedTransfers(-1) // we need a complete list in the event of graceful shutdown
|
||||
ctxCopy, b.CancelSync = context.WithCancel(ctxCopy)
|
||||
ctxCopy, cancel := context.WithCancel(ctxCopy)
|
||||
defer cancel()
|
||||
b.CancelSync = cancel
|
||||
b.testFn()
|
||||
err := sync.Sync(ctxCopy, fdst, fsrc, b.opt.CreateEmptySrcDirs)
|
||||
prettyprint(b.queueOpt.logger, "b.queueOpt.logger", fs.LogLevelDebug)
|
||||
|
||||
Reference in New Issue
Block a user