in lib/store/cleanup.go [204:261]
func (m *cleanupManager) customPolicyBasedCleanup(op base.FileOp, config CleanupConfig, customPolicy func(a, b fInfo) int, diskUsageFn diskUsageFn) (usage int64, err error) {
names, err := op.ListNames()
if err != nil {
return 0, fmt.Errorf("list names: %s", err)
}
var fInfos []fInfo
var totalUsage int64
for _, name := range names {
fStat, err := op.GetFileStat(name)
if err != nil {
log.With("name", name).Errorf("Error getting file stat: %s", err)
continue
}
fInfo := fInfo{
name: name,
downloadTime: fStat.ModTime(),
size: fStat.Size(),
}
totalUsage += fStat.Size()
var accessTime metadata.LastAccessTime
err = op.GetFileMetadata(name, &accessTime)
if os.IsNotExist(err) {
continue
}
if err != nil {
log.With("name", name).Errorf("Error getting file metadata: %s", err)
continue
}
fInfo.accessTime = accessTime.Time
fInfos = append(fInfos, fInfo)
}
slices.SortFunc(fInfos, customPolicy)
dInfo, err := diskUsageFn()
if err != nil {
return 0, fmt.Errorf("get disk usage info %s: %s", op, err)
}
minBytes := dInfo.TotalBytes * uint64(config.AggressiveLowerThreshold) / 100
remainDeleteBytes := int64(dInfo.TotalBytes) - int64(minBytes)
for _, file := range fInfos {
if remainDeleteBytes <= 0 {
break
}
err := op.DeleteFile(file.name)
if err != nil && err != base.ErrFilePersisted {
log.With("name", file.name).Errorf("Error deleting expired file: %s", err)
}
if err == nil {
remainDeleteBytes -= file.size
}
}
return totalUsage, nil
}