From 8e6787a302ce943dfd72b0006921b2cfc57feea6 Mon Sep 17 00:00:00 2001 From: Klaus Post Date: Thu, 20 Aug 2020 13:17:42 -0700 Subject: [PATCH] Fix TestDataUpdateTracker hanging (#10302) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keep dataUpdateTracker while goroutine is starting. This will ensure the object is updated one `start` returns Tested with ``` λ go test -cpu=1,2,4,8 -test.run TestDataUpdateTracker -count=1000 PASS ok github.com/minio/minio/cmd 8.913s ``` Fixes #10295 --- cmd/data-update-tracker.go | 10 ++++++---- cmd/erasure-zones.go | 2 +- cmd/fs-v1.go | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) 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