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.
65 lines
1.9 KiB
65 lines
1.9 KiB
//go:build !windows |
|
|
|
// Package storage provides storage management functionality including filesystem |
|
// space detection, access tracking for events, and garbage collection based on |
|
// access patterns. |
|
package storage |
|
|
|
import ( |
|
"syscall" |
|
) |
|
|
|
// FilesystemStats holds information about filesystem space usage. |
|
type FilesystemStats struct { |
|
Total uint64 // Total bytes on filesystem |
|
Available uint64 // Available bytes (for unprivileged users) |
|
Used uint64 // Used bytes |
|
} |
|
|
|
// GetFilesystemStats returns filesystem space information for the given path. |
|
// The path should be a directory within the filesystem to check. |
|
func GetFilesystemStats(path string) (stats FilesystemStats, err error) { |
|
var stat syscall.Statfs_t |
|
if err = syscall.Statfs(path, &stat); err != nil { |
|
return |
|
} |
|
stats.Total = stat.Blocks * uint64(stat.Bsize) |
|
stats.Available = stat.Bavail * uint64(stat.Bsize) |
|
stats.Used = stats.Total - stats.Available |
|
return |
|
} |
|
|
|
// CalculateMaxStorage calculates the maximum storage limit for the relay. |
|
// If configuredMax > 0, it returns that value directly. |
|
// Otherwise, it returns 80% of the available filesystem space. |
|
func CalculateMaxStorage(dataDir string, configuredMax int64) (int64, error) { |
|
if configuredMax > 0 { |
|
return configuredMax, nil |
|
} |
|
|
|
stats, err := GetFilesystemStats(dataDir) |
|
if err != nil { |
|
return 0, err |
|
} |
|
|
|
// Return 80% of available space |
|
maxBytes := int64(float64(stats.Available) * 0.8) |
|
|
|
// Also ensure we don't exceed 80% of total filesystem |
|
maxTotal := int64(float64(stats.Total) * 0.8) |
|
if maxBytes > maxTotal { |
|
maxBytes = maxTotal |
|
} |
|
|
|
return maxBytes, nil |
|
} |
|
|
|
// GetCurrentStorageUsage calculates the current storage usage of the data directory. |
|
// This is an approximation based on filesystem stats for the given path. |
|
func GetCurrentStorageUsage(dataDir string) (int64, error) { |
|
stats, err := GetFilesystemStats(dataDir) |
|
if err != nil { |
|
return 0, err |
|
} |
|
return int64(stats.Used), err |
|
}
|
|
|