From 2f8aaf96adbc73ffbeb2632b99ef127e5a1a8479 Mon Sep 17 00:00:00 2001 From: Mohammed Sohail Date: Thu, 4 Apr 2024 16:44:55 +0800 Subject: [PATCH] db: switch to bbolt implementation --- internal/db/blocks.go | 92 +++++++++++++++++++------------------------ internal/db/db.go | 38 ++++++++++-------- 2 files changed, 63 insertions(+), 67 deletions(-) diff --git a/internal/db/blocks.go b/internal/db/blocks.go index f8f1c92..74522cf 100644 --- a/internal/db/blocks.go +++ b/internal/db/blocks.go @@ -4,7 +4,7 @@ import ( "bytes" "github.com/bits-and-blooms/bitset" - "github.com/dgraph-io/badger/v4" + bolt "go.etcd.io/bbolt" ) func (d *DB) SetLowerBound(v uint64) error { @@ -40,7 +40,7 @@ func (d *DB) GetMissingValuesBitSet(lowerBound uint64, upperBound uint64) (*bits b bitset.BitSet ) - err := d.db.View(func(txn *badger.Txn) error { + err := d.db.View(func(tx *bolt.Tx) error { var ( lowerRaw = marshalUint64(lowerBound) upperRaw = marshalUint64(upperBound) @@ -50,19 +50,9 @@ func (d *DB) GetMissingValuesBitSet(lowerBound uint64, upperBound uint64) (*bits b.Set(uint(i)) } - opts := badger.DefaultIteratorOptions - opts.PrefetchValues = false - - iter := txn.NewIterator(opts) - defer iter.Close() - - for iter.Seek(lowerRaw); iter.Valid(); iter.Next() { - k := iter.Item().Key() - - if bytes.Compare(k, upperRaw) > 0 { - return nil - } + c := tx.Bucket([]byte("blocks")).Cursor() + for k, _ := c.Seek(lowerRaw); k != nil && bytes.Compare(k, upperRaw) <= 0; k, _ = c.Next() { b.Clear(uint(unmarshalUint64(k))) } @@ -75,51 +65,51 @@ func (d *DB) GetMissingValuesBitSet(lowerBound uint64, upperBound uint64) (*bits return &b, nil } -func (d *DB) Cleanup() error { - var ( - safeToDeleteKeys [][]byte - ) +// func (d *DB) Cleanup() error { +// var ( +// safeToDeleteKeys [][]byte +// ) - err := d.db.View(func(txn *badger.Txn) error { - lowerBound, err := d.get(lowerBoundKey) - if err != nil { - return err - } +// err := d.db.View(func(txn *badger.Txn) error { +// lowerBound, err := d.get(lowerBoundKey) +// if err != nil { +// return err +// } - lowerBound = marshalUint64(unmarshalUint64(lowerBound) - 1) +// lowerBound = marshalUint64(unmarshalUint64(lowerBound) - 1) - opts := badger.DefaultIteratorOptions - opts.PrefetchValues = false +// opts := badger.DefaultIteratorOptions +// opts.PrefetchValues = false - it := txn.NewIterator(opts) - defer it.Close() +// it := txn.NewIterator(opts) +// defer it.Close() - for it.Rewind(); it.Valid(); it.Next() { - k := it.Item().Key() +// for it.Rewind(); it.Valid(); it.Next() { +// k := it.Item().Key() - if bytes.Compare(k, lowerBound) > 0 { - return nil - } +// if bytes.Compare(k, lowerBound) > 0 { +// return nil +// } - safeToDeleteKeys = append(safeToDeleteKeys, it.Item().KeyCopy(nil)) - } +// safeToDeleteKeys = append(safeToDeleteKeys, it.Item().KeyCopy(nil)) +// } - return nil - }) - if err != nil { - return err - } +// return nil +// }) +// if err != nil { +// return err +// } - wb := d.db.NewWriteBatch() - for _, k := range safeToDeleteKeys { - if err := wb.Delete(k); err != nil { - return nil - } - } +// wb := d.db.NewWriteBatch() +// for _, k := range safeToDeleteKeys { +// if err := wb.Delete(k); err != nil { +// return nil +// } +// } - if err := wb.Flush(); err != nil { - return err - } +// if err := wb.Flush(); err != nil { +// return err +// } - return nil -} +// return nil +// } diff --git a/internal/db/db.go b/internal/db/db.go index 86681c9..1926cd0 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -2,9 +2,10 @@ package db import ( "encoding/binary" + "fmt" "log/slog" - "github.com/dgraph-io/badger/v4" + bolt "go.etcd.io/bbolt" ) type ( @@ -13,7 +14,7 @@ type ( } DB struct { - db *badger.DB + db *bolt.DB logg *slog.Logger } ) @@ -30,13 +31,19 @@ var ( ) func New(o DBOpts) (*DB, error) { - opts := badger.DefaultOptions(dbFolderName) - opts.Logger = nil - db, err := badger.Open(opts) + db, err := bolt.Open(dbFolderName, 0600, nil) if err != nil { return nil, err } + db.Update(func(tx *bolt.Tx) error { + _, err := tx.CreateBucketIfNotExists([]byte("blocks")) + if err != nil { + return fmt.Errorf("create bucket: %s", err) + } + return nil + }) + return &DB{ db: db, logg: o.Logg, @@ -49,13 +56,10 @@ func (d *DB) Close() error { func (d *DB) get(k string) ([]byte, error) { var v []byte - err := d.db.View(func(txn *badger.Txn) error { - item, err := txn.Get([]byte(k)) - if err != nil { - return err - } - v, err = item.ValueCopy(nil) - return err + err := d.db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("blocks")) + v = b.Get([]byte(k)) + return nil }) if err != nil { @@ -66,8 +70,9 @@ func (d *DB) get(k string) ([]byte, error) { } func (d *DB) setUint64(k string, v uint64) error { - err := d.db.Update(func(txn *badger.Txn) error { - return txn.Set([]byte(k), marshalUint64(v)) + err := d.db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("blocks")) + return b.Put([]byte(k), marshalUint64(v)) }) if err != nil { return err @@ -76,8 +81,9 @@ func (d *DB) setUint64(k string, v uint64) error { } func (d *DB) setUint64AsKey(v uint64) error { - err := d.db.Update(func(txn *badger.Txn) error { - return txn.Set(marshalUint64(v), nil) + err := d.db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("blocks")) + return b.Put(marshalUint64(v), nil) }) if err != nil { return err