config: add server.cache_priority for configurable /nix-cache-info Priority

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: Ibe9c357ea2c56a967c75be04c2099f536a6a6964
This commit is contained in:
raf 2026-03-06 22:42:57 +03:00
commit a35b3216ec
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
3 changed files with 30 additions and 7 deletions

View file

@ -157,7 +157,7 @@ func main() {
srv := &http.Server{ srv := &http.Server{
Addr: cfg.Server.Listen, Addr: cfg.Server.Listen,
Handler: server.New(r, p, db, cfg.Upstreams, 30), Handler: server.New(r, p, db, cfg.Upstreams, cfg.Server.CachePriority),
ReadTimeout: cfg.Server.ReadTimeout.Duration, ReadTimeout: cfg.Server.ReadTimeout.Duration,
WriteTimeout: cfg.Server.WriteTimeout.Duration, WriteTimeout: cfg.Server.WriteTimeout.Duration,
} }

View file

@ -43,9 +43,10 @@ type UpstreamConfig struct {
} }
type ServerConfig struct { type ServerConfig struct {
Listen string `yaml:"listen"` Listen string `yaml:"listen"`
ReadTimeout Duration `yaml:"read_timeout"` ReadTimeout Duration `yaml:"read_timeout"`
WriteTimeout Duration `yaml:"write_timeout"` WriteTimeout Duration `yaml:"write_timeout"`
CachePriority int `yaml:"cache_priority"`
} }
type CacheConfig struct { type CacheConfig struct {
@ -86,9 +87,10 @@ type Config struct {
func defaults() Config { func defaults() Config {
return Config{ return Config{
Server: ServerConfig{ Server: ServerConfig{
Listen: ":8080", Listen: ":8080",
ReadTimeout: Duration{30 * time.Second}, ReadTimeout: Duration{30 * time.Second},
WriteTimeout: Duration{30 * time.Second}, WriteTimeout: Duration{30 * time.Second},
CachePriority: 30,
}, },
Upstreams: []UpstreamConfig{ Upstreams: []UpstreamConfig{
{URL: "https://cache.nixos.org", Priority: 10}, {URL: "https://cache.nixos.org", Priority: 10},
@ -130,6 +132,9 @@ func (c *Config) Validate() error {
if c.Server.Listen == "" { if c.Server.Listen == "" {
return fmt.Errorf("server.listen is empty") return fmt.Errorf("server.listen is empty")
} }
if c.Server.CachePriority < 1 {
return fmt.Errorf("server.cache_priority must be >= 1, got %d", c.Server.CachePriority)
}
if c.Cache.LatencyAlpha <= 0 || c.Cache.LatencyAlpha >= 1 { if c.Cache.LatencyAlpha <= 0 || c.Cache.LatencyAlpha >= 1 {
return fmt.Errorf("cache.latency_alpha must be between 0 and 1 exclusive, got %f", c.Cache.LatencyAlpha) return fmt.Errorf("cache.latency_alpha must be between 0 and 1 exclusive, got %f", c.Cache.LatencyAlpha)
} }

View file

@ -178,6 +178,24 @@ func TestValidateUpstreamBadPublicKey(t *testing.T) {
} }
} }
func TestCachePriorityDefault(t *testing.T) {
cfg, err := config.Load("")
if err != nil {
t.Fatal(err)
}
if cfg.Server.CachePriority != 30 {
t.Errorf("default CachePriority = %d, want 30", cfg.Server.CachePriority)
}
}
func TestCachePriorityValidation(t *testing.T) {
cfg, _ := config.Load("")
cfg.Server.CachePriority = 0
if err := cfg.Validate(); err == nil {
t.Error("expected error for CachePriority = 0")
}
}
func TestInvalidDuration(t *testing.T) { func TestInvalidDuration(t *testing.T) {
yamlContent := ` yamlContent := `
server: server: