Only deserialize full ticket when filter matches.
This commit is contained in:
parent
f4adcfeaf0
commit
49af391b0c
@ -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 err != nil {
|
|
||||||
return fmt.Errorf("could not get ticket: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
tickets = append(tickets, ticket)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user