diff --git a/cmd/benchmarks/db/badger.go b/cmd/benchmarks/db/badger.go index 7ddfa6ce..1487aafc 100644 --- a/cmd/benchmarks/db/badger.go +++ b/cmd/benchmarks/db/badger.go @@ -29,6 +29,35 @@ func (b *badgerTree) AddChange(key string, value []byte) (err error) { }) } +func (b *badgerTree) GetChange(key string) (val []byte, err error) { + badgerKey := fmt.Sprintf("space/%s/tree/%s/change/%s", b.spaceId, b.id, key) + err = b.db.View(func(txn *badger.Txn) error { + item, err := txn.Get([]byte(badgerKey)) + if err != nil { + return err + } + val, err = item.ValueCopy(val) + if err != nil { + return err + } + return nil + }) + return +} + +func (b *badgerTree) HasChange(key string) (has bool, err error) { + badgerKey := fmt.Sprintf("space/%s/tree/%s/change/%s", b.spaceId, b.id, key) + err = b.db.View(func(txn *badger.Txn) error { + _, err := txn.Get([]byte(badgerKey)) + return err + }) + if err != nil { + return + } + has = true + return +} + type badgerSpace struct { id string db *badger.DB diff --git a/cmd/benchmarks/db/common.go b/cmd/benchmarks/db/common.go index 12f611aa..d690473c 100644 --- a/cmd/benchmarks/db/common.go +++ b/cmd/benchmarks/db/common.go @@ -4,6 +4,8 @@ type Tree interface { Id() string UpdateHead(head string) (err error) AddChange(key string, value []byte) (err error) + GetChange(key string) ([]byte, error) + HasChange(key string) (has bool, err error) } type Space interface { diff --git a/cmd/benchmarks/db/pogreb.go b/cmd/benchmarks/db/pogreb.go index 7bdf3f0b..6cdde374 100644 --- a/cmd/benchmarks/db/pogreb.go +++ b/cmd/benchmarks/db/pogreb.go @@ -20,7 +20,18 @@ func (p *pogrebTree) UpdateHead(head string) (err error) { } func (p *pogrebTree) AddChange(key string, value []byte) (err error) { - return p.db.Put([]byte(fmt.Sprintf("t/%s/%s", p.id, key)), value) + changeKey := fmt.Sprintf("t/%s/%s", p.id, key) + return p.db.Put([]byte(changeKey), value) +} + +func (p *pogrebTree) GetChange(key string) (val []byte, err error) { + changeKey := fmt.Sprintf("t/%s/%s", p.id, key) + return p.db.Get([]byte(changeKey)) +} + +func (p *pogrebTree) HasChange(key string) (has bool, err error) { + changeKey := fmt.Sprintf("t/%s/%s", p.id, key) + return p.db.Has([]byte(changeKey)) } type pogrebSpace struct { @@ -54,8 +65,7 @@ type pogrebSpaceCreator struct { func (p *pogrebSpaceCreator) CreateSpace(id string) (Space, error) { dbPath := path.Join(p.rootPath, id) db, err := pogreb.Open(dbPath, &pogreb.Options{ - BackgroundSyncInterval: 0, - BackgroundCompactionInterval: 20000, + BackgroundCompactionInterval: 200000, }) if err != nil { return nil, err diff --git a/cmd/benchmarks/dbbench.go b/cmd/benchmarks/dbbench.go index 66314d31..f377c664 100644 --- a/cmd/benchmarks/dbbench.go +++ b/cmd/benchmarks/dbbench.go @@ -3,6 +3,8 @@ package main import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/cmd/benchmarks/db" + "net/http" + _ "net/http/pprof" "os" "os/signal" "syscall" @@ -18,6 +20,9 @@ func main() { // defValueSize: 1000, // lenHeadUpdate: 10, //}) + go func() { + fmt.Println(http.ListenAndServe("localhost:6060", nil)) + }() bench(db.NewPogrebSpaceCreator, options{ numSpaces: 1000, numEntriesInSpace: 100, @@ -108,7 +113,38 @@ func bench(factory db.SpaceCreatorFactory, opts options) { } } } - fmt.Println(opts.numSpaces*opts.numEntriesInSpace*opts.numChangesInTree, "changes creation, spent ms", time.Now().Sub(now).Milliseconds()) + total := opts.numSpaces * opts.numEntriesInSpace * opts.numChangesInTree + fmt.Println(total, "changes creation, spent ms", time.Now().Sub(now).Milliseconds()) + now = time.Now() + + // getting some values from tree + for _, t := range trees { + for i := 0; i < opts.numChangesInTree; i++ { + res, err := t.GetChange(changeIdGetter(i)) + if err != nil { + panic(err) + } + if res == nil { + panic("shouldn't be empty") + } + } + } + fmt.Println(total, "changes getting, spent ms", time.Now().Sub(now).Milliseconds()) + now = time.Now() + + // getting some values from tree + for _, t := range trees { + for i := 0; i < opts.numChangesInTree; i++ { + b, err := t.HasChange(changeIdGetter(i)) + if err != nil { + panic(err) + } + if !b { + panic("should be able to check with has") + } + } + } + fmt.Println(total, "changes checking, spent ms", time.Now().Sub(now).Milliseconds()) exit := make(chan os.Signal, 1) signal.Notify(exit, os.Interrupt, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT)