initial code (#6)

* initial code commit
This commit is contained in:
l3uddz
2021-02-14 16:18:26 +00:00
committed by GitHub
parent 3f55336fbd
commit ce3807b819
53 changed files with 3694 additions and 0 deletions

86
cache/cache.go vendored Normal file
View File

@@ -0,0 +1,86 @@
package cache
import (
"context"
"fmt"
"github.com/l3uddz/nabarr/logger"
"github.com/lefelys/state"
"github.com/rs/zerolog"
"github.com/xujiajun/nutsdb"
"time"
)
type Client struct {
log zerolog.Logger
st state.State
db *nutsdb.DB
}
func New(path string) (*Client, error) {
db, err := nutsdb.Open(nutsdb.Options{
Dir: path,
EntryIdxMode: nutsdb.HintKeyValAndRAMIdxMode,
SegmentSize: 8 * 1024 * 1024,
NodeNum: 1,
RWMode: nutsdb.FileIO,
SyncEnable: true,
StartFileLoadingMode: nutsdb.MMap,
})
if err != nil {
return nil, fmt.Errorf("open: %w", err)
}
log := logger.New("trace").With().Logger()
// start cleaner
st, tail := state.WithShutdown()
ticker := time.NewTicker(24 * time.Hour)
go func() {
for {
select {
case <-tail.End():
ticker.Stop()
tail.Done()
return
case <-ticker.C:
// clean cache
err := db.Update(func(tx *nutsdb.Tx) error {
return db.Merge()
})
switch {
case err == nil:
log.Info().Msg("Cleaned cache")
case err.Error() == "the number of files waiting to be merged is at least 2":
// there were no data files to be merged
default:
// unexpected error
log.Error().
Err(err).
Msg("Failed cleaning cache")
}
}
}
}()
return &Client{
log: log,
st: st,
db: db,
}, nil
}
func (c *Client) Close() error {
// shutdown cleaner
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()
}

15
cache/delete.go vendored Normal file
View File

@@ -0,0 +1,15 @@
package cache
import (
"fmt"
"github.com/xujiajun/nutsdb"
)
func (c *Client) Delete(bucket string, key string) error {
if err := c.db.Update(func(tx *nutsdb.Tx) error {
return tx.Delete(bucket, []byte(key))
}); err != nil {
return fmt.Errorf("%v: %v; delete: %w", bucket, key, err)
}
return nil
}

22
cache/get.go vendored Normal file
View File

@@ -0,0 +1,22 @@
package cache
import (
"fmt"
"github.com/xujiajun/nutsdb"
)
func (c *Client) Get(bucket string, key string) ([]byte, error) {
var value []byte
if err := c.db.View(func(tx *nutsdb.Tx) error {
e, err := tx.Get(bucket, []byte(key))
if err != nil {
return fmt.Errorf("%v: %v; get: %w", bucket, key, err)
}
value = e.Value
return nil
}); err != nil {
return nil, err
}
return value, nil
}

16
cache/put.go vendored Normal file
View File

@@ -0,0 +1,16 @@
package cache
import (
"fmt"
"github.com/xujiajun/nutsdb"
"time"
)
func (c *Client) Put(bucket string, key string, val []byte, ttl time.Duration) error {
if err := c.db.Update(func(tx *nutsdb.Tx) error {
return tx.Put(bucket, []byte(key), val, uint32(ttl.Seconds()))
}); err != nil {
return fmt.Errorf("%v: %v; put: %w", bucket, key, err)
}
return nil
}