Files
nabarr/cache/cache.go

76 lines
1.2 KiB
Go
Raw Normal View History

package cache
import (
2021-02-19 22:20:02 +00:00
"context"
"fmt"
2021-02-19 22:20:02 +00:00
"github.com/dgraph-io/badger/v3"
"github.com/l3uddz/nabarr/logger"
2021-02-19 22:20:02 +00:00
"github.com/lefelys/state"
"github.com/rs/zerolog"
2021-02-19 22:20:02 +00:00
"time"
)
type Client struct {
log zerolog.Logger
2021-02-19 22:20:02 +00:00
st state.State
2021-02-19 22:20:02 +00:00
db *badger.DB
}
func New(path string) (*Client, error) {
2021-02-19 22:20:02 +00:00
opts := badger.DefaultOptions(path)
opts.Logger = nil
db, err := badger.Open(opts)
if err != nil {
return nil, fmt.Errorf("open: %w", err)
}
log := logger.New("trace").With().Logger()
2021-02-19 22:20:02 +00:00
// start cleaner
st, tail := state.WithShutdown()
ticker := time.NewTicker(6 * time.Hour)
go func() {
for {
select {
case <-tail.End():
ticker.Stop()
tail.Done()
return
case <-ticker.C:
// clean cache
for {
if db.RunValueLogGC(0.5) == nil {
continue
}
break
}
log.Debug().Msg("Cleaned cache")
}
}
}()
return &Client{
log: log,
2021-02-19 22:20:02 +00:00
st: st,
db: db,
}, nil
}
func (c *Client) Close() error {
2021-02-19 22:20:02 +00:00
// shutdown cleaner
if c.st != nil {
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
defer cancel()
if err := c.st.Shutdown(ctx); err != nil {
c.log.Error().
Err(err).
Msg("Failed shutting down cache cleaner gracefully")
}
}
// close cache
return c.db.Close()
}