You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							90 lines
						
					
					
						
							2.5 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							90 lines
						
					
					
						
							2.5 KiB
						
					
					
				
								package util
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"errors"
							 | 
						|
									"fmt"
							 | 
						|
									"github.com/seaweedfs/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
							 | 
						|
								}
							 |