1
0
mirror of https://github.com/taigrr/bitcask synced 2025-01-18 04:03:17 -08:00

Use an Adaptive Radix Tree (#71)

This commit is contained in:
James Mills 2019-08-30 08:13:24 +10:00 committed by GitHub
parent 55459a5c93
commit b3d6f734b6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 13 deletions

View File

@ -12,8 +12,8 @@ import (
"path/filepath"
"sync"
"github.com/derekparker/trie"
"github.com/gofrs/flock"
"github.com/plar/go-adaptive-radix-tree"
"github.com/prologic/bitcask/internal"
)
@ -53,7 +53,7 @@ type Bitcask struct {
curr *internal.Datafile
keydir *internal.Keydir
datafiles map[int]*internal.Datafile
trie *trie.Trie
trie art.Tree
}
// Stats is a struct returned by Stats() on an open Bitcask instance
@ -165,7 +165,7 @@ func (b *Bitcask) Put(key, value []byte) error {
item := b.keydir.Add(key, b.curr.FileID(), offset, n)
if b.config.greedyScan {
b.trie.Add(string(key), item)
b.trie.Insert(key, item)
}
return nil
@ -182,7 +182,7 @@ func (b *Bitcask) Delete(key []byte) error {
b.keydir.Delete(key)
if b.config.greedyScan {
b.trie.Remove(string(key))
b.trie.Delete(key)
}
return nil
@ -193,12 +193,12 @@ func (b *Bitcask) Delete(key []byte) error {
// no further keys are processed and the first error returned.
func (b *Bitcask) Scan(prefix []byte, f func(key []byte) error) error {
if b.config.greedyScan {
keys := b.trie.PrefixSearch(string(prefix))
for _, key := range keys {
if err := f([]byte(key)); err != nil {
return err
b.trie.ForEachPrefix(prefix, func(node art.Node) bool {
if err := f(node.Key()); err != nil {
return false
}
}
return true
})
return nil
}
@ -316,9 +316,9 @@ func (b *Bitcask) reopen() error {
keydir := internal.NewKeydir()
var t *trie.Trie
var t art.Tree
if b.config.greedyScan {
t = trie.New()
t = art.New()
}
if internal.Exists(path.Join(b.path, "index")) {
@ -328,7 +328,7 @@ func (b *Bitcask) reopen() error {
for key := range keydir.Keys() {
item, _ := keydir.Get(key)
if b.config.greedyScan {
t.Add(string(key), item)
t.Insert(key, item)
}
}
} else {
@ -350,7 +350,7 @@ func (b *Bitcask) reopen() error {
item := keydir.Add(e.Key, ids[i], e.Offset, n)
if b.config.greedyScan {
t.Add(string(e.Key), item)
t.Insert(e.Key, item)
}
}
}

1
go.mod
View File

@ -9,6 +9,7 @@ require (
github.com/magiconair/properties v1.8.1 // indirect
github.com/pelletier/go-toml v1.4.0 // indirect
github.com/pkg/errors v0.8.1
github.com/plar/go-adaptive-radix-tree v1.0.1
github.com/sirupsen/logrus v1.4.2
github.com/spf13/afero v1.2.2 // indirect
github.com/spf13/cobra v0.0.5

2
go.sum
View File

@ -80,6 +80,8 @@ github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUr
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/plar/go-adaptive-radix-tree v1.0.1 h1:J+2qrXaKWLACw59s8SlTVYYxWjlUr/BlCsfkAzn96/0=
github.com/plar/go-adaptive-radix-tree v1.0.1/go.mod h1:Ot8d28EII3i7Lv4PSvBlF8ejiD/CtRYDuPsySJbSaK8=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=