Only deserialize full ticket when filter matches.

This commit is contained in:
Jamie Holdstock 2021-06-01 11:33:41 +08:00 committed by Jamie Holdstock
parent f4adcfeaf0
commit 49af391b0c
2 changed files with 22 additions and 19 deletions

View File

@ -315,8 +315,8 @@ func (vdb *VspDatabase) GetUnconfirmedTickets() ([]Ticket, error) {
vdb.ticketsMtx.RLock()
defer vdb.ticketsMtx.RUnlock()
return vdb.filterTickets(func(t Ticket) bool {
return !t.Confirmed
return vdb.filterTickets(func(t *bolt.Bucket) bool {
return t.Get(confirmedK)[0] == byte(0)
})
}
@ -326,8 +326,8 @@ func (vdb *VspDatabase) GetPendingFees() ([]Ticket, error) {
vdb.ticketsMtx.RLock()
defer vdb.ticketsMtx.RUnlock()
return vdb.filterTickets(func(t Ticket) bool {
return t.Confirmed && t.FeeTxStatus == FeeReceieved
return vdb.filterTickets(func(t *bolt.Bucket) bool {
return t.Get(confirmedK)[0] == byte(1) && FeeStatus(t.Get(feeTxStatusK)) == FeeReceieved
})
}
@ -337,16 +337,16 @@ func (vdb *VspDatabase) GetUnconfirmedFees() ([]Ticket, error) {
vdb.ticketsMtx.RLock()
defer vdb.ticketsMtx.RUnlock()
return vdb.filterTickets(func(t Ticket) bool {
return t.FeeTxStatus == FeeBroadcast
return vdb.filterTickets(func(t *bolt.Bucket) bool {
return FeeStatus(t.Get(feeTxStatusK)) == FeeBroadcast
})
}
// GetVotableTickets returns tickets with a confirmed fee tx and no outcome (ie.
// not expired/voted/missed).
func (vdb *VspDatabase) GetVotableTickets() ([]Ticket, error) {
return vdb.filterTickets(func(t Ticket) bool {
return t.FeeTxStatus == FeeConfirmed && t.Outcome == ""
return vdb.filterTickets(func(t *bolt.Bucket) bool {
return FeeStatus(t.Get(feeTxStatusK)) == FeeConfirmed && TicketOutcome(t.Get(outcomeK)) == ""
})
}
@ -354,18 +354,19 @@ func (vdb *VspDatabase) GetVotableTickets() ([]Ticket, error) {
// database which match the filter.
//
// This function must be called with the lock held.
func (vdb *VspDatabase) filterTickets(filter func(Ticket) bool) ([]Ticket, error) {
func (vdb *VspDatabase) filterTickets(filter func(*bolt.Bucket) bool) ([]Ticket, error) {
var tickets []Ticket
err := vdb.db.View(func(tx *bolt.Tx) error {
ticketBkt := tx.Bucket(vspBktK).Bucket(ticketBktK)
return ticketBkt.ForEach(func(k, v []byte) error {
ticket, err := getTicketFromBkt(ticketBkt.Bucket(k))
if err != nil {
return fmt.Errorf("could not get ticket: %w", err)
}
ticketBkt := ticketBkt.Bucket(k)
if filter(ticket) {
if filter(ticketBkt) {
ticket, err := getTicketFromBkt(ticketBkt)
if err != nil {
return fmt.Errorf("could not get ticket: %w", err)
}
tickets = append(tickets, ticket)
}

View File

@ -9,6 +9,8 @@ import (
"reflect"
"testing"
"time"
bolt "go.etcd.io/bbolt"
)
var seededRand = rand.New(rand.NewSource(time.Now().UnixNano()))
@ -224,7 +226,7 @@ func testFilterTickets(t *testing.T) {
}
// Expect all tickets returned.
retrieved, err := db.filterTickets(func(t Ticket) bool {
retrieved, err := db.filterTickets(func(t *bolt.Bucket) bool {
return true
})
if err != nil {
@ -235,8 +237,8 @@ func testFilterTickets(t *testing.T) {
}
// Only one ticket should be confirmed.
retrieved, err = db.filterTickets(func(t Ticket) bool {
return t.Confirmed
retrieved, err = db.filterTickets(func(t *bolt.Bucket) bool {
return t.Get(confirmedK)[0] == byte(1)
})
if err != nil {
t.Fatalf("error filtering tickets: %v", err)
@ -249,8 +251,8 @@ func testFilterTickets(t *testing.T) {
}
// Expect no tickets with confirmed fee.
retrieved, err = db.filterTickets(func(t Ticket) bool {
return t.FeeTxStatus == FeeConfirmed
retrieved, err = db.filterTickets(func(t *bolt.Bucket) bool {
return FeeStatus(t.Get(feeTxStatusK)) == FeeConfirmed
})
if err != nil {
t.Fatalf("error filtering tickets: %v", err)