Skip to content

Commit

Permalink
Add GetLedgerEntry benchmark and optimize it slightly
Browse files Browse the repository at this point in the history
  • Loading branch information
2opremio committed Aug 24, 2023
1 parent b9c47d9 commit 7ea058e
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 7 deletions.
10 changes: 7 additions & 3 deletions cmd/soroban-rpc/internal/db/ledgerentry.go
Original file line number Diff line number Diff line change
Expand Up @@ -292,9 +292,13 @@ func (l *ledgerEntryReadTx) GetLedgerEntries(includeExpired bool, keys ...xdr.Le

result := make([]LedgerKeyAndEntry, 0, len(rawResult))

latestClosedLedger, err := l.GetLatestLedgerSequence()
if err != nil {
return nil, err
var latestClosedLedger uint32
if !includeExpired {
// We only need the latest ledger when excluding expired entries
latestClosedLedger, err = l.GetLatestLedgerSequence()
if err != nil {
return nil, err
}
}
for encodedKey, key := range encodedKeyToKey {
encodedEntry, ok := rawResult[encodedKey]
Expand Down
63 changes: 59 additions & 4 deletions cmd/soroban-rpc/internal/db/ledgerentry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -736,6 +736,65 @@ forloop:

}

func benchmarkLedgerEntry(b *testing.B, cached bool, includeExpired bool) {
db := NewTestDB(b)
keyUint32 := xdr.Uint32(0)
data := xdr.ContractDataEntry{
Contract: xdr.ScAddress{
Type: xdr.ScAddressTypeScAddressTypeContract,
ContractId: &xdr.Hash{0xca, 0xfe},
},
Key: xdr.ScVal{
Type: xdr.ScValTypeScvU32,
U32: &keyUint32,
},
Durability: xdr.ContractDataDurabilityPersistent,
Body: xdr.ContractDataEntryBody{
BodyType: xdr.ContractEntryBodyTypeDataEntry,
Data: &xdr.ContractDataEntryData{
Val: xdr.ScVal{
Type: xdr.ScValTypeScvU32,
U32: &keyUint32,
},
},
},
ExpirationLedgerSeq: math.MaxUint32,
}
key, entry := getContractDataLedgerEntry(b, data)
tx, err := NewReadWriter(db, 150, 15).NewTx(context.Background())
assert.NoError(b, err)
assert.NoError(b, tx.LedgerEntryWriter().UpsertLedgerEntry(entry))
assert.NoError(b, tx.Commit(2))
reader := NewLedgerEntryReader(db)
const numQueriesPerOp = 15
b.ResetTimer()
b.StopTimer()
for i := 0; i < b.N; i++ {
var readTx LedgerEntryReadTx
var err error
if cached {
readTx, err = reader.NewCachedTx(context.Background())
} else {
readTx, err = reader.NewTx(context.Background())
}
assert.NoError(b, err)
for i := 0; i < numQueriesPerOp; i++ {
b.StartTimer()
found, _, err := GetLedgerEntry(readTx, includeExpired, key)
b.StopTimer()
assert.NoError(b, err)
assert.True(b, found)
}
assert.NoError(b, readTx.Done())
}
}

func BenchmarkGetLedgerEntry(b *testing.B) {
b.Run("With cache, include expired", func(b *testing.B) { benchmarkLedgerEntry(b, true, true) })
b.Run("With cache, exclude expired", func(b *testing.B) { benchmarkLedgerEntry(b, true, false) })
b.Run("Without cache, exclude expired", func(b *testing.B) { benchmarkLedgerEntry(b, false, false) })
}

func BenchmarkLedgerUpdate(b *testing.B) {
db := NewTestDB(b)
keyUint32 := xdr.Uint32(0)
Expand Down Expand Up @@ -773,7 +832,6 @@ func BenchmarkLedgerUpdate(b *testing.B) {
}
assert.NoError(b, tx.Commit(uint32(i+1)))
}
b.StopTimer()
}

func NewTestDB(tb testing.TB) *DB {
Expand All @@ -783,9 +841,6 @@ func NewTestDB(tb testing.TB) *DB {
if err != nil {
assert.NoError(tb, db.Close())
}
var ver []string
assert.NoError(tb, db.SelectRaw(context.Background(), &ver, "SELECT sqlite_version()"))
tb.Logf("using sqlite version: %v", ver)
tb.Cleanup(func() {
assert.NoError(tb, db.Close())
})
Expand Down

0 comments on commit 7ea058e

Please sign in to comment.