Fix TestDataUpdateTracker hanging (#10302)

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
master
Klaus Post 4 years ago committed by GitHub
parent 59352d0ac2
commit 8e6787a302
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      cmd/data-update-tracker.go
  2. 2
      cmd/erasure-zones.go
  3. 2
      cmd/fs-v1.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 {

@ -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
}

@ -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

Loading…
Cancel
Save