diff --git a/cmd/data-update-tracker.go b/cmd/data-update-tracker.go index 7202b54a9..397aecd39 100644 --- a/cmd/data-update-tracker.go +++ b/cmd/data-update-tracker.go @@ -181,6 +181,8 @@ func (d *dataUpdateTracker) start(ctx context.Context, drives ...string) { } d.load(ctx, drives...) go d.startCollector(ctx) + // startSaver will unlock. + d.mu.Lock() go d.startSaver(ctx, dataUpdateTrackerSaveInterval, drives) } @@ -214,17 +216,17 @@ func (d *dataUpdateTracker) load(ctx context.Context, drives ...string) { } // startSaver will start a saver that will write d to all supplied drives at specific intervals. +// 'd' must be write locked when started and will be unlocked. // The saver will save and exit when supplied context is closed. func (d *dataUpdateTracker) startSaver(ctx context.Context, interval time.Duration, drives []string) { - t := time.NewTicker(interval) - defer t.Stop() - var buf bytes.Buffer - d.mu.Lock() saveNow := d.save exited := make(chan struct{}) d.saveExited = exited d.mu.Unlock() + t := time.NewTicker(interval) + defer t.Stop() defer close(exited) + var buf bytes.Buffer for { var exit bool select { diff --git a/cmd/erasure-zones.go b/cmd/erasure-zones.go index 83a5fa743..749b5c140 100644 --- a/cmd/erasure-zones.go +++ b/cmd/erasure-zones.go @@ -80,7 +80,7 @@ func newErasureZones(ctx context.Context, endpointZones EndpointZones) (ObjectLa } } - go intDataUpdateTracker.start(GlobalContext, localDrives...) + go intDataUpdateTracker.start(ctx, localDrives...) return z, nil } diff --git a/cmd/fs-v1.go b/cmd/fs-v1.go index b64264ff9..bac35f6ae 100644 --- a/cmd/fs-v1.go +++ b/cmd/fs-v1.go @@ -179,7 +179,7 @@ func NewFSObjectLayer(fsPath string) (ObjectLayer, error) { fs.fsFormatRlk = rlk go fs.cleanupStaleMultipartUploads(ctx, GlobalMultipartCleanupInterval, GlobalMultipartExpiry) - go intDataUpdateTracker.start(GlobalContext, fsPath) + go intDataUpdateTracker.start(ctx, fsPath) // Return successfully initialized object layer. return fs, nil