mirror of
https://github.com/samuelncui/acp.git
synced 2026-01-03 10:05:16 +00:00
feat: disk usage add cache
This commit is contained in:
51
disk_usage.go
Normal file
51
disk_usage.go
Normal file
@@ -0,0 +1,51 @@
|
||||
package acp
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"github.com/samuelncui/godf"
|
||||
)
|
||||
|
||||
const (
|
||||
defaultDiskUsageFreshInterval = 1024 * 1024 * 1024 * 2
|
||||
)
|
||||
|
||||
type diskUsageCache struct {
|
||||
mountPoint string
|
||||
freshInterval int64
|
||||
|
||||
lock sync.Mutex
|
||||
freeSpace int64
|
||||
used int64
|
||||
}
|
||||
|
||||
func newDiskUsageCache(mountPoint string, freshInterval int64) *diskUsageCache {
|
||||
return &diskUsageCache{
|
||||
mountPoint: mountPoint,
|
||||
freshInterval: freshInterval,
|
||||
}
|
||||
}
|
||||
|
||||
func (m *diskUsageCache) check(need int64) error {
|
||||
m.lock.Lock()
|
||||
defer m.lock.Unlock()
|
||||
|
||||
m.used += need
|
||||
if m.used <= m.freeSpace && m.used < m.freshInterval {
|
||||
return nil
|
||||
}
|
||||
|
||||
usage, err := godf.NewDiskUsage(m.mountPoint)
|
||||
if err != nil {
|
||||
return fmt.Errorf("get disk usage fail, mount_point= %s", m.mountPoint)
|
||||
}
|
||||
|
||||
m.freeSpace = int64(usage.Available())
|
||||
m.used = need
|
||||
if m.used > m.freeSpace {
|
||||
return fmt.Errorf("%w, want= %d have= %d", ErrTargetNoSpace, m.used, m.freeSpace)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user