Merge pull request #5695 from cd1989/macos-volume-capacity

Fix volume capacity when run in MacOS
This commit is contained in:
Wenkai Yin 2018-08-27 18:17:03 +08:00 committed by GitHub
commit 93a073ff64
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 3 deletions

View File

@ -17,7 +17,7 @@ package imagestorage
// GlobalDriver is a global image storage driver
var GlobalDriver Driver
// Capacity holds information about capaticy of image storage
// Capacity holds information about capacity of image storage
type Capacity struct {
// total size(byte)
Total uint64 `json:"total"`

View File

@ -16,6 +16,7 @@ package filesystem
import (
"os"
"reflect"
"syscall"
storage "github.com/goharbor/harbor/src/adminserver/systeminfo/imagestorage"
@ -56,8 +57,23 @@ func (d *driver) Cap() (*storage.Capacity, error) {
return nil, err
}
// When container is run in MacOS, `bsize` obtained by `statfs` syscall is not the fundamental block size,
// but the `iosize` (optimal transfer block size) instead, it's usually 1024 times larger than the `bsize`.
// for example `4096 * 1024`. To get the correct block size, we should use `frsize`. But `frsize` isn't
// guaranteed to be supported everywhere, so we need to check whether it's supported before use it.
// For more details, please refer to: https://github.com/docker/for-mac/issues/2136
bSize := uint64(stat.Bsize)
field := reflect.ValueOf(&stat).Elem().FieldByName("Frsize")
if field.IsValid() {
if field.Kind() == reflect.Uint64 {
bSize = field.Uint()
} else {
bSize = uint64(field.Int())
}
}
return &storage.Capacity{
Total: stat.Blocks * uint64(stat.Bsize),
Free: stat.Bavail * uint64(stat.Bsize),
Total: stat.Blocks * bSize,
Free: stat.Bavail * bSize,
}, nil
}