mirror of
https://github.com/talent-plan/tinykv.git
synced 2025-01-13 13:50:43 +08:00
d975005666
Co-authored-by: Connor <zbk602423539@gmail.com>
84 lines
1.8 KiB
Go
84 lines
1.8 KiB
Go
package engine_util
|
|
|
|
import (
|
|
"os"
|
|
|
|
"github.com/Connor1996/badger"
|
|
"github.com/pingcap-incubator/tinykv/log"
|
|
)
|
|
|
|
// Engines keeps references to and data for the engines used by unistore.
|
|
// All engines are badger key/value databases.
|
|
// the Path fields are the filesystem path to where the data is stored.
|
|
type Engines struct {
|
|
// Data, including data which is committed (i.e., committed across other nodes) and un-committed (i.e., only present
|
|
// locally).
|
|
Kv *badger.DB
|
|
KvPath string
|
|
// Metadata used by Raft.
|
|
Raft *badger.DB
|
|
RaftPath string
|
|
}
|
|
|
|
func NewEngines(kvEngine, raftEngine *badger.DB, kvPath, raftPath string) *Engines {
|
|
return &Engines{
|
|
Kv: kvEngine,
|
|
KvPath: kvPath,
|
|
Raft: raftEngine,
|
|
RaftPath: raftPath,
|
|
}
|
|
}
|
|
|
|
func (en *Engines) WriteKV(wb *WriteBatch) error {
|
|
return wb.WriteToDB(en.Kv)
|
|
}
|
|
|
|
func (en *Engines) WriteRaft(wb *WriteBatch) error {
|
|
return wb.WriteToDB(en.Raft)
|
|
}
|
|
|
|
func (en *Engines) Close() error {
|
|
dbs := []*badger.DB{en.Kv, en.Raft}
|
|
for _, db := range dbs {
|
|
if db == nil {
|
|
continue
|
|
}
|
|
if err := db.Close(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (en *Engines) Destroy() error {
|
|
if err := en.Close(); err != nil {
|
|
return err
|
|
}
|
|
if err := os.RemoveAll(en.KvPath); err != nil {
|
|
return err
|
|
}
|
|
if err := os.RemoveAll(en.RaftPath); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// CreateDB creates a new Badger DB on disk at path.
|
|
func CreateDB(path string, raft bool) *badger.DB {
|
|
opts := badger.DefaultOptions
|
|
if raft {
|
|
// Do not need to write blob for raft engine because it will be deleted soon.
|
|
opts.ValueThreshold = 0
|
|
}
|
|
opts.Dir = path
|
|
opts.ValueDir = opts.Dir
|
|
if err := os.MkdirAll(opts.Dir, os.ModePerm); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
db, err := badger.Open(opts)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
return db
|
|
}
|