-
Notifications
You must be signed in to change notification settings - Fork 0
/
badger.go
102 lines (89 loc) · 2.37 KB
/
badger.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package objectstore
import (
"encoding"
"fmt"
"log"
"github.com/dgraph-io/badger/v4"
)
// badgerObjectStore is a type implementing the objectstore.ObjectStore interface with a permanent storage backend
// based on BadgerDB.
type badgerObjectStore struct {
db *badger.DB
bytesStored int
}
// NewBadgerObjectStore creates a new ObjectStore instance.
func NewBadgerObjectStore(conf Config) (ks *badgerObjectStore, err error) {
// SynchWrites writes any change to disk immediately.
// Maximum size of a single log file = 10MB
// Maximum size of memtable table = 5MB
// Value Threshold for an entry to be stored in the log file = 0.5MB
opt := badger.DefaultOptions(conf.DBPath).WithValueLogFileSize(10 * (1 << 20)).WithMemTableSize(5 * (1 << 20)).WithValueThreshold(1 << 19)
opt.Logger = nil
db, err := badger.Open(opt)
if err != nil {
return nil, fmt.Errorf("could not instantiate BadgerDB: %s", err)
}
return &badgerObjectStore{db: db, bytesStored: 0}, nil
}
func (objstore *badgerObjectStore) Store(objectID string, object encoding.BinaryMarshaler) error {
encodedObject, err := object.MarshalBinary()
if err != nil {
return err
}
objstore.bytesStored += len(encodedObject)
err = objstore.db.Update(func(txn *badger.Txn) error {
err := txn.Set([]byte(objectID), encodedObject)
if err != nil {
return err
}
return err
})
if err != nil {
return err
}
return nil
}
func (objstore *badgerObjectStore) Load(objectID string, object encoding.BinaryUnmarshaler) error {
var encodedObject []byte
err := objstore.db.View(func(txn *badger.Txn) error {
item, err := txn.Get([]byte(objectID))
if err != nil {
return err
}
encodedObject, err = item.ValueCopy(nil)
if err != nil {
return err
}
return err
})
if err != nil {
return err
}
err = object.UnmarshalBinary(encodedObject)
if err != nil {
return err
}
return err
}
func (objstore *badgerObjectStore) IsPresent(objectID string) (bool, error) {
present := false
err := objstore.db.View(func(txn *badger.Txn) error {
_, err := txn.Get([]byte(objectID))
if err == badger.ErrKeyNotFound {
return nil
}
if err != nil {
return err
}
present = true
return nil
})
if err != nil {
return present, err
}
return present, nil
}
func (objstore *badgerObjectStore) Close() error {
log.Printf("Total bytes stored: %dB\n", objstore.bytesStored)
return objstore.db.Close()
}