Browse Source

node/db: Add benchmark

tbjump 2 years ago
parent
commit
d2abd90c0e
1 changed files with 71 additions and 0 deletions
  1. 71 0
      node/pkg/db/db_test.go

+ 71 - 0
node/pkg/db/db_test.go

@@ -3,8 +3,14 @@ package db
 import (
 import (
 	"crypto/ecdsa"
 	"crypto/ecdsa"
 	"crypto/rand"
 	"crypto/rand"
+	"fmt"
+	math_rand "math/rand"
 	"os"
 	"os"
+	"runtime"
+	"sync"
+	"sync/atomic"
 
 
+	"github.com/dgraph-io/badger/v3"
 	"github.com/ethereum/go-ethereum/crypto"
 	"github.com/ethereum/go-ethereum/crypto"
 	"github.com/wormhole-foundation/wormhole/sdk/vaa"
 	"github.com/wormhole-foundation/wormhole/sdk/vaa"
 
 
@@ -12,6 +18,7 @@ import (
 	"time"
 	"time"
 
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
 )
 )
 
 
 func getVAA() vaa.VAA {
 func getVAA() vaa.VAA {
@@ -164,3 +171,67 @@ func TestFindEmitterSequenceGap(t *testing.T) {
 	assert.Equal(t, uint64(0x1), lastSeq)
 	assert.Equal(t, uint64(0x1), lastSeq)
 	assert.NoError(t, err)
 	assert.NoError(t, err)
 }
 }
+
+// BenchmarkVaaLookup benchmarks db.GetSignedVAABytes
+// You need to set the environment variable WH_DBPATH to a path with a populated BadgerDB.
+// You may want to play with the CONCURRENCY parameter.
+func BenchmarkVaaLookup(b *testing.B) {
+	CONCURRENCY := runtime.NumCPU()
+	dbPath := os.Getenv("WH_DBPATH")
+	require.NotEqual(b, dbPath, "")
+
+	// open DB
+	optionsDB := badger.DefaultOptions(dbPath)
+	optionsDB.Logger = nil
+	badgerDb, err := badger.Open(optionsDB)
+	require.NoError(b, err)
+	db := &Database{
+		db: badgerDb,
+	}
+
+	if err != nil {
+		b.Error("failed to open database")
+	}
+	defer db.Close()
+
+	vaaIds := make(chan *VAAID, b.N)
+
+	for i := 0; i < b.N; i++ {
+		randId := math_rand.Intn(250000) //nolint
+		randId = 250000 - (i / 18)
+		vaaId, err := VaaIDFromString(fmt.Sprintf("4/000000000000000000000000b6f6d86a8f9879a9c87f643768d9efc38c1da6e7/%d", randId))
+		assert.NoError(b, err)
+		vaaIds <- vaaId
+	}
+
+	b.ResetTimer()
+
+	// actual timed code
+	var errCtr atomic.Int32
+	var wg sync.WaitGroup
+
+	for i := 0; i < CONCURRENCY; i++ {
+		wg.Add(1)
+		go func() {
+			for {
+				select {
+				case vaaId := <-vaaIds:
+					_, err = db.GetSignedVAABytes(*vaaId)
+					if err != nil {
+						fmt.Printf("error retrieving %s/%s/%d: %s\n", vaaId.EmitterChain, vaaId.EmitterAddress, vaaId.Sequence, err)
+						errCtr.Add(1)
+					}
+				default:
+					wg.Done()
+					return
+				}
+			}
+		}()
+	}
+
+	wg.Wait()
+
+	if int(errCtr.Load()) > b.N/3 {
+		b.Error("More than 1/3 of GetSignedVAABytes failed.")
+	}
+}