github.com/fiagdao/tendermint@v0.32.11-0.20220824195748-2087fcc480c1/state/txindex/kv/kv_bench_test.go (about)

     1  package kv
     2  
     3  import (
     4  	"context"
     5  	"crypto/rand"
     6  	"fmt"
     7  	"io/ioutil"
     8  	"testing"
     9  
    10  	dbm "github.com/tendermint/tm-db"
    11  
    12  	abci "github.com/tendermint/tendermint/abci/types"
    13  	"github.com/tendermint/tendermint/libs/kv"
    14  	"github.com/tendermint/tendermint/libs/pubsub/query"
    15  	"github.com/tendermint/tendermint/types"
    16  )
    17  
    18  func BenchmarkTxSearch(b *testing.B) {
    19  	dbDir, err := ioutil.TempDir("", "benchmark_tx_search_test")
    20  	if err != nil {
    21  		b.Errorf("failed to create temporary directory: %s", err)
    22  	}
    23  
    24  	db, err := dbm.NewGoLevelDB("benchmark_tx_search_test", dbDir)
    25  	if err != nil {
    26  		b.Errorf("failed to create database: %s", err)
    27  	}
    28  
    29  	allowedKeys := []string{"transfer.address", "transfer.amount"}
    30  	indexer := NewTxIndex(db, IndexEvents(allowedKeys))
    31  
    32  	for i := 0; i < 35000; i++ {
    33  		events := []abci.Event{
    34  			{
    35  				Type: "transfer",
    36  				Attributes: []kv.Pair{
    37  					{Key: []byte("address"), Value: []byte(fmt.Sprintf("address_%d", i%100))},
    38  					{Key: []byte("amount"), Value: []byte("50")},
    39  				},
    40  			},
    41  		}
    42  
    43  		txBz := make([]byte, 8)
    44  		if _, err := rand.Read(txBz); err != nil {
    45  			b.Errorf("failed produce random bytes: %s", err)
    46  		}
    47  
    48  		txResult := &types.TxResult{
    49  			Height: int64(i),
    50  			Index:  0,
    51  			Tx:     types.Tx(string(txBz)),
    52  			Result: abci.ResponseDeliverTx{
    53  				Data:   []byte{0},
    54  				Code:   abci.CodeTypeOK,
    55  				Log:    "",
    56  				Events: events,
    57  			},
    58  		}
    59  
    60  		if err := indexer.Index(txResult); err != nil {
    61  			b.Errorf("failed to index tx: %s", err)
    62  		}
    63  	}
    64  
    65  	txQuery := query.MustParse("transfer.address = 'address_43' AND transfer.amount = 50")
    66  
    67  	b.ResetTimer()
    68  
    69  	ctx := context.Background()
    70  
    71  	for i := 0; i < b.N; i++ {
    72  		if _, err := indexer.Search(ctx, txQuery); err != nil {
    73  			b.Errorf("failed to query for txs: %s", err)
    74  		}
    75  	}
    76  }