restic-nats-server/internal/cache/cache.go

103 lines
2.2 KiB
Go

// +build !nocacheserver
package cache
import (
"bytes"
"context"
stdlog "log"
"time"
"github.com/Fishwaldo/go-logadapter"
"github.com/Fishwaldo/restic-nats-server/internal"
"github.com/buraksezer/olric"
"github.com/buraksezer/olric/config"
"github.com/spf13/viper"
)
var CacheDM *olric.DMap
var db *olric.Olric
var log logadapter.Logger
func init() {
log = internal.Log.New("olric")
viper.SetDefault("start-cache-server", true)
}
func Start() {
if !viper.GetBool("start-cache-server") {
log.Info("Not Starting Cache Server")
return
}
// Deployment scenario: embedded-member
// This creates a single-node Olric cluster. It's good enough for experimenting.
// config.New returns a new config.Config with sane defaults. Available values for env:
// local, lan, wan
c := config.New("lan")
c.Logger = stdlog.New(&olrisLogger{log: log}, "" /* prefix */, 0 /* flags */)
// Callback function. It's called when this node is ready to accept connections.
ctx, cancel := context.WithCancel(context.Background())
c.Started = func() {
defer cancel()
log.Info("Olric is ready to accept connections")
}
var err error
db, err = olric.New(c)
if err != nil {
log.Fatal("Failed to create Olric instance: %v", err)
}
go func() {
// Call Start at background. It's a blocker call.
err = db.Start()
if err != nil {
log.Fatal("olric.Start returned an error: %v", err)
}
}()
<-ctx.Done()
CacheDM, err = db.NewDMap("bucket-of-arbitrary-items")
if err != nil {
log.Fatal("olric.NewDMap returned an error: %v", err)
}
}
func Shutdown() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
err := db.Shutdown(ctx)
if err != nil {
log.Fatal("Failed to shutdown Olric: %v", err)
}
cancel()
}
type olrisLogger struct {
log logadapter.Logger
}
func (ol olrisLogger) Write(message []byte) (int, error) {
message = bytes.TrimSpace(message)
size := len(message)
if size < 2 {
ol.log.Info(string(message))
} else {
switch message[1] {
case 'I':
ol.log.Info(string(message[7:]))
case 'W':
ol.log.Warn(string(message[7:]))
case 'D':
ol.log.Debug(string(message[8:]))
default:
ol.log.Info(string(message))
}
}
return size, nil
}