|
- package recorder
-
- import (
- "os"
- "path/filepath"
- "sort"
- )
-
- type recInfo struct {
- id string
- path string
- start int64
- size int64
- }
-
- func enforceQuota(root string, maxMB int) {
- if maxMB <= 0 {
- return
- }
- maxBytes := int64(maxMB) * 1024 * 1024
- infos, total := scanRecordings(root)
- if total <= maxBytes {
- return
- }
- // oldest first
- sort.Slice(infos, func(i, j int) bool { return infos[i].start < infos[j].start })
- for _, info := range infos {
- if total <= maxBytes {
- break
- }
- _ = os.RemoveAll(info.path)
- total -= info.size
- }
- }
-
- func scanRecordings(root string) ([]recInfo, int64) {
- entries, err := os.ReadDir(root)
- if err != nil {
- return nil, 0
- }
- infos := make([]recInfo, 0, len(entries))
- var total int64
- for _, e := range entries {
- if !e.IsDir() {
- continue
- }
- id := e.Name()
- path := filepath.Join(root, id)
- size := dirSize(path)
- start := int64(0)
- if meta, err := ReadMeta(filepath.Join(path, "meta.json")); err == nil {
- start = meta.Start.UnixMilli()
- }
- infos = append(infos, recInfo{id: id, path: path, start: start, size: size})
- total += size
- }
- return infos, total
- }
-
- func dirSize(path string) int64 {
- var size int64
- _ = filepath.Walk(path, func(_ string, info os.FileInfo, err error) error {
- if err != nil {
- return nil
- }
- if !info.IsDir() {
- size += info.Size()
- }
- return nil
- })
- return size
- }
|