123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- package util
- import (
- "errors"
- "fmt"
- "github.com/chrislusf/seaweedfs/weed/glog"
- "strconv"
- "strings"
- )
- // MinFreeSpaceType is the type of MinFreeSpace.
- type MinFreeSpaceType int
- const (
- // AsPercent set the MinFreeSpaceType to a percentage value from 0 to 100.
- AsPercent MinFreeSpaceType = iota
- // AsBytes set the MinFreeSpaceType to a absolute value bytes.
- AsBytes
- )
- // MinFreeSpace is type that defines the limit for the minimum free space.
- type MinFreeSpace struct {
- Type MinFreeSpaceType
- Bytes uint64
- Percent float32
- Raw string
- }
- // IsLow tells whether the free space is low or not.
- func (s MinFreeSpace) IsLow(freeBytes uint64, freePercent float32) (yes bool, desc string) {
- switch s.Type {
- case AsPercent:
- yes = freePercent < s.Percent
- op := IfElse(yes, "<", ">=")
- return yes, fmt.Sprintf("disk free %.2f%% %s required %.2f%%", freePercent, op, s.Percent)
- case AsBytes:
- yes = freeBytes < s.Bytes
- op := IfElse(yes, "<", ">=")
- return yes, fmt.Sprintf("disk free %s %s required %s",
- BytesToHumanReadable(freeBytes), op, BytesToHumanReadable(s.Bytes))
- }
- return false, ""
- }
- // String returns a string representation of MinFreeSpace.
- func (s MinFreeSpace) String() string {
- switch s.Type {
- case AsPercent:
- return fmt.Sprintf("%.2f%%", s.Percent)
- default:
- return s.Raw
- }
- }
- // MustParseMinFreeSpace parses comma-separated argument for min free space setting.
- // minFreeSpace has the high priority than minFreeSpacePercent if it is set.
- func MustParseMinFreeSpace(minFreeSpace string, minFreeSpacePercent string) (spaces []MinFreeSpace) {
- ss := strings.Split(EmptyTo(minFreeSpace, minFreeSpacePercent), ",")
- for _, freeString := range ss {
- if vv, e := ParseMinFreeSpace(freeString); e == nil {
- spaces = append(spaces, *vv)
- } else {
- glog.Fatalf("The value specified in -minFreeSpace not a valid value %s", freeString)
- }
- }
- return spaces
- }
- var ErrMinFreeSpaceBadValue = errors.New("minFreeSpace is invalid")
- // ParseMinFreeSpace parses min free space expression s as percentage like 1,10 or human readable size like 10G
- func ParseMinFreeSpace(s string) (*MinFreeSpace, error) {
- if percent, e := strconv.ParseFloat(s, 32); e == nil {
- if percent < 0 || percent > 100 {
- return nil, ErrMinFreeSpaceBadValue
- }
- return &MinFreeSpace{Type: AsPercent, Percent: float32(percent), Raw: s}, nil
- }
- if directSize, e := ParseBytes(s); e == nil {
- if directSize <= 100 {
- return nil, ErrMinFreeSpaceBadValue
- }
- return &MinFreeSpace{Type: AsBytes, Bytes: directSize, Raw: s}, nil
- }
- return nil, ErrMinFreeSpaceBadValue
- }
|