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

View File

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