mirror of
https://github.com/minio/minio.git
synced 2025-11-09 05:34:56 -05:00
Fix diskinfo race (#12857)
Fixes share info struct.
```
WARNING: DATA RACE
Read at 0x00c011780618 by goroutine 419:
github.com/minio/minio/cmd.(*DiskMetrics).DecodeMsg()
c:/gopath/src/github.com/minio/minio/cmd/storage-datatypes_gen.go:331 +0x247
github.com/minio/minio/cmd.(*DiskInfo).DecodeMsg()
c:/gopath/src/github.com/minio/minio/cmd/storage-datatypes_gen.go:76 +0x5ec
github.com/tinylib/msgp/msgp.Decode()
c:/gopath/pkg/mod/github.com/tinylib/msgp@v1.1.6-0.20210521143832-0becd170c402/msgp/read.go:105 +0x70
github.com/minio/minio/cmd.(*storageRESTClient).DiskInfo.func1.1()
c:/gopath/src/github.com/minio/minio/cmd/storage-rest-client.go:288 +0x235
github.com/minio/minio/cmd.(*timedValue).Get()
c:/gopath/src/github.com/minio/minio/cmd/utils.go:886 +0x77
github.com/minio/minio/cmd.(*storageRESTClient).DiskInfo()
c:/gopath/src/github.com/minio/minio/cmd/storage-rest-client.go:297 +0xf9
github.com/minio/minio/cmd.getDiskInfos()
c:/gopath/src/github.com/minio/minio/cmd/object-api-utils.go:962 +0x1a8
github.com/minio/minio/cmd.(*erasureServerPools).getServerPoolsAvailableSpace.func1()
c:/gopath/src/github.com/minio/minio/cmd/erasure-server-pool.go:241 +0x27c
github.com/minio/minio/internal/sync/errgroup.(*Group).Go.func1()
c:/gopath/src/github.com/minio/minio/internal/sync/errgroup/errgroup.go:123 +0xd7
Previous write at 0x00c011780618 by goroutine 423:
github.com/minio/minio/cmd.(*DiskMetrics).DecodeMsg()
c:/gopath/src/github.com/minio/minio/cmd/storage-datatypes_gen.go:332 +0x6e4
github.com/minio/minio/cmd.(*DiskInfo).DecodeMsg()
c:/gopath/src/github.com/minio/minio/cmd/storage-datatypes_gen.go:76 +0x5ec
github.com/tinylib/msgp/msgp.Decode()
c:/gopath/pkg/mod/github.com/tinylib/msgp@v1.1.6-0.20210521143832-0becd170c402/msgp/read.go:105 +0x70
github.com/minio/minio/cmd.(*storageRESTClient).DiskInfo.func1.1()
c:/gopath/src/github.com/minio/minio/cmd/storage-rest-client.go:288 +0x235
github.com/minio/minio/cmd.(*timedValue).Get()
c:/gopath/src/github.com/minio/minio/cmd/utils.go:886 +0x77
github.com/minio/minio/cmd.(*storageRESTClient).DiskInfo()
c:/gopath/src/github.com/minio/minio/cmd/storage-rest-client.go:297 +0xf9
github.com/minio/minio/cmd.getDiskInfos()
c:/gopath/src/github.com/minio/minio/cmd/object-api-utils.go:962 +0x1a8
github.com/minio/minio/cmd.(*erasureServerPools).getServerPoolsAvailableSpace.func1()
c:/gopath/src/github.com/minio/minio/cmd/erasure-server-pool.go:241 +0x27c
github.com/minio/minio/internal/sync/errgroup.(*Group).Go.func1()
c:/gopath/src/github.com/minio/minio/internal/sync/errgroup/errgroup.go:123 +0xd7
```
This commit is contained in:
@@ -328,7 +328,13 @@ func waitForFormatErasure(firstDisk bool, endpoints Endpoints, poolCount, setCou
|
||||
continue
|
||||
case errErasureReadQuorum:
|
||||
// no quorum available continue to wait for minimum number of servers.
|
||||
logger.Info("Waiting for a minimum of %d disks to come online (elapsed %s)\n", len(endpoints)/2, getElapsedTime())
|
||||
logger.Info("Waiting for a minimum of %d disks to come online (elapsed %s)\n",
|
||||
len(endpoints)/2, getElapsedTime())
|
||||
continue
|
||||
case errErasureWriteQuorum:
|
||||
// no quorum available continue to wait for minimum number of servers.
|
||||
logger.Info("Waiting for a minimum of %d disks to come online (elapsed %s)\n",
|
||||
(len(endpoints)/2)+1, getElapsedTime())
|
||||
continue
|
||||
case errErasureV3ThisEmpty:
|
||||
// need to wait for this error to be healed, so continue.
|
||||
|
||||
@@ -265,6 +265,24 @@ func (client *storageRESTClient) SetDiskID(id string) {
|
||||
client.diskID = id
|
||||
}
|
||||
|
||||
func (client *storageRESTClient) diskInfo() (interface{}, error) {
|
||||
var info DiskInfo
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
defer cancel()
|
||||
respBody, err := client.call(ctx, storageRESTMethodDiskInfo, nil, nil, -1)
|
||||
if err != nil {
|
||||
return info, err
|
||||
}
|
||||
defer xhttp.DrainBody(respBody)
|
||||
if err = msgp.Decode(respBody, &info); err != nil {
|
||||
return info, err
|
||||
}
|
||||
if info.Error != "" {
|
||||
return info, toStorageErr(errors.New(info.Error))
|
||||
}
|
||||
return info, nil
|
||||
}
|
||||
|
||||
// DiskInfo - fetch disk information for a remote disk.
|
||||
func (client *storageRESTClient) DiskInfo(ctx context.Context) (info DiskInfo, err error) {
|
||||
if !client.IsOnline() {
|
||||
@@ -277,22 +295,7 @@ func (client *storageRESTClient) DiskInfo(ctx context.Context) (info DiskInfo, e
|
||||
}
|
||||
client.diskInfoCache.Once.Do(func() {
|
||||
client.diskInfoCache.TTL = time.Second
|
||||
client.diskInfoCache.Update = func() (interface{}, error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
defer cancel()
|
||||
respBody, err := client.call(ctx, storageRESTMethodDiskInfo, nil, nil, -1)
|
||||
if err != nil {
|
||||
return info, err
|
||||
}
|
||||
defer xhttp.DrainBody(respBody)
|
||||
if err = msgp.Decode(respBody, &info); err != nil {
|
||||
return info, err
|
||||
}
|
||||
if info.Error != "" {
|
||||
return info, toStorageErr(errors.New(info.Error))
|
||||
}
|
||||
return info, nil
|
||||
}
|
||||
client.diskInfoCache.Update = client.diskInfo
|
||||
})
|
||||
val, err := client.diskInfoCache.Get()
|
||||
if err == nil {
|
||||
|
||||
Reference in New Issue
Block a user