From 8a5b489c558ea10c1b8ea5cfca323c251ac3e059 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 16 Oct 2022 10:13:17 +0200 Subject: [PATCH] Add transaction benchmarks for badger --- cmd/benchmarks/db/badger.go | 27 +++++++++++++++++++++++++++ cmd/benchmarks/db/common.go | 6 ++++++ cmd/benchmarks/db/pogreb.go | 4 ++++ cmd/benchmarks/dbbench.go | 32 ++++++++++++++++++++++++++++++-- 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/cmd/benchmarks/db/badger.go b/cmd/benchmarks/db/badger.go index 1487aafc..87bc01a2 100644 --- a/cmd/benchmarks/db/badger.go +++ b/cmd/benchmarks/db/badger.go @@ -11,6 +11,33 @@ type badgerTree struct { db *badger.DB } +type badgerTransaction struct { + spaceId string + id string + txn *badger.Txn +} + +func (b *badgerTransaction) AddChange(key string, value []byte) (err error) { + badgerKey := fmt.Sprintf("space/%s/tree/%s/change/%s", b.spaceId, b.id, key) + return b.txn.Set([]byte(badgerKey), value) +} + +func (b *badgerTransaction) GetChange(key string) (val []byte, err error) { + badgerKey := fmt.Sprintf("space/%s/tree/%s/change/%s", b.spaceId, b.id, key) + it, err := b.txn.Get([]byte(badgerKey)) + if err != nil { + return + } + return it.ValueCopy(val) +} + +func (b *badgerTree) Perform(f func(txn Transaction) error) error { + return b.db.Update(func(txn *badger.Txn) error { + bTxn := &badgerTransaction{b.spaceId, b.id, txn} + return f(bTxn) + }) +} + func (b *badgerTree) Id() string { return b.id } diff --git a/cmd/benchmarks/db/common.go b/cmd/benchmarks/db/common.go index d690473c..0443e3f6 100644 --- a/cmd/benchmarks/db/common.go +++ b/cmd/benchmarks/db/common.go @@ -1,11 +1,17 @@ package db +type Transaction interface { + AddChange(key string, value []byte) (err error) + GetChange(key string) ([]byte, error) +} + 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) + Perform(func(txn Transaction) error) error } type Space interface { diff --git a/cmd/benchmarks/db/pogreb.go b/cmd/benchmarks/db/pogreb.go index 7cc9759a..2edca852 100644 --- a/cmd/benchmarks/db/pogreb.go +++ b/cmd/benchmarks/db/pogreb.go @@ -12,6 +12,10 @@ type pogrebTree struct { db *pogreb.DB } +func (p *pogrebTree) Perform(f func(txn Transaction) error) error { + return f(p) +} + func (p *pogrebTree) Id() string { return p.id } diff --git a/cmd/benchmarks/dbbench.go b/cmd/benchmarks/dbbench.go index c3db3601..faa06943 100644 --- a/cmd/benchmarks/dbbench.go +++ b/cmd/benchmarks/dbbench.go @@ -17,9 +17,9 @@ func main() { fmt.Println(http.ListenAndServe("localhost:6060", nil)) }() opts := options{ - numSpaces: 1000, + numSpaces: 10, numEntriesInSpace: 100, - numChangesInTree: 10, + numChangesInTree: 1000, numHeadUpdates: 100, defValueSize: 1000, lenHeadUpdate: 1000, @@ -105,6 +105,15 @@ func bench(factory db.SpaceCreatorFactory, opts options) { panic(err) } } + //t.Perform(func(txn db.Transaction) error { + // for i := 0; i < opts.numChangesInTree; i++ { + // err := t.AddChange(changeIdKey(i), byteSlice()) + // if err != nil { + // panic(err) + // } + // } + // return nil + //}) for i := 0; i < opts.numHeadUpdates; i++ { err := t.UpdateHead(string(headUpdate())) if err != nil { @@ -116,6 +125,25 @@ func bench(factory db.SpaceCreatorFactory, opts options) { fmt.Println(total, "changes creation, spent ms", time.Now().Sub(now).Milliseconds()) now = time.Now() + // getting some values from tree + for _, t := range trees { + err := t.Perform(func(txn db.Transaction) error { + for i := 0; i < opts.numChangesInTree; i++ { + _, err := t.GetChange(changeIdKey(i)) + if err != nil { + return err + } + } + return nil + }) + if err != nil { + panic(err) + } + } + + fmt.Println(total, "changes getting perform, 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++ {