ollie/cmd/olliesrv/internal/fs/cache.go

59 lines
1.0 KiB
Go

package fs
import (
"context"
"strings"
"sync"
"ollie/cmd/olliesrv/internal/backend"
)
// ModelCache caches the model list from all backends.
// Created by NewRoot and used by the /models handler.
// Also invalidated by root-level /ctl.
type ModelCache struct {
mu sync.Mutex
data []byte
fetched bool
}
func NewModelCache() *ModelCache { return &ModelCache{} }
func (c *ModelCache) Get() []byte {
c.mu.Lock()
if !c.fetched {
c.mu.Unlock()
c.refresh()
c.mu.Lock()
}
defer c.mu.Unlock()
return c.data
}
func (c *ModelCache) Invalidate() {
c.mu.Lock()
c.fetched = false
c.data = nil
c.mu.Unlock()
}
func (c *ModelCache) refresh() {
var sb strings.Builder
for _, name := range backend.Backends() {
b, err := backend.NewWithName(name)
if err != nil {
continue
}
for _, m := range b.Models(context.Background()) {
sb.WriteString(name)
sb.WriteByte('\t')
sb.WriteString(m)
sb.WriteByte('\n')
}
}
c.mu.Lock()
c.data = []byte(sb.String())
c.fetched = true
c.mu.Unlock()
}