mirror of
https://github.com/Fishwaldo/restic-nats-server.git
synced 2025-03-16 03:51:38 +00:00
103 lines
2.2 KiB
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
|
|
}
|
|
|