database: protect access with a mutex (#150)

This commit is contained in:
David Hill 2020-07-06 09:06:43 +00:00 committed by GitHub
parent 08be1fa55a
commit 4f0c980aca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 0 deletions

View File

@ -19,6 +19,8 @@ import (
// convenience functions.
type VspDatabase struct {
db *bolt.DB
ticketsMtx sync.RWMutex
}
// The keys used in the database.

View File

@ -63,6 +63,9 @@ var (
)
func (vdb *VspDatabase) InsertNewTicket(ticket Ticket) error {
defer vdb.ticketsMtx.Unlock()
vdb.ticketsMtx.Lock()
return vdb.db.Update(func(tx *bolt.Tx) error {
ticketBkt := tx.Bucket(vspBktK).Bucket(ticketBktK)
@ -104,6 +107,9 @@ func (vdb *VspDatabase) InsertNewTicket(ticket Ticket) error {
}
func (vdb *VspDatabase) DeleteTicket(ticket Ticket) error {
defer vdb.ticketsMtx.Unlock()
vdb.ticketsMtx.Lock()
return vdb.db.Update(func(tx *bolt.Tx) error {
ticketBkt := tx.Bucket(vspBktK).Bucket(ticketBktK)
@ -116,6 +122,9 @@ func (vdb *VspDatabase) DeleteTicket(ticket Ticket) error {
})
}
func (vdb *VspDatabase) UpdateTicket(ticket Ticket) error {
defer vdb.ticketsMtx.Unlock()
vdb.ticketsMtx.Lock()
return vdb.db.Update(func(tx *bolt.Tx) error {
ticketBkt := tx.Bucket(vspBktK).Bucket(ticketBktK)
@ -135,6 +144,9 @@ func (vdb *VspDatabase) UpdateTicket(ticket Ticket) error {
}
func (vdb *VspDatabase) GetTicketByHash(ticketHash string) (Ticket, bool, error) {
defer vdb.ticketsMtx.RUnlock()
vdb.ticketsMtx.RLock()
var ticket Ticket
var found bool
err := vdb.db.View(func(tx *bolt.Tx) error {
@ -159,6 +171,9 @@ func (vdb *VspDatabase) GetTicketByHash(ticketHash string) (Ticket, bool, error)
}
func (vdb *VspDatabase) CountTickets() (int, int, error) {
defer vdb.ticketsMtx.RUnlock()
vdb.ticketsMtx.RLock()
var total, feePaid int
err := vdb.db.View(func(tx *bolt.Tx) error {
ticketBkt := tx.Bucket(vspBktK).Bucket(ticketBktK)
@ -184,6 +199,9 @@ func (vdb *VspDatabase) CountTickets() (int, int, error) {
// GetUnconfirmedTickets returns tickets which are not yet confirmed.
func (vdb *VspDatabase) GetUnconfirmedTickets() ([]Ticket, error) {
defer vdb.ticketsMtx.RUnlock()
vdb.ticketsMtx.RLock()
return vdb.filterTickets(func(t Ticket) bool {
return !t.Confirmed
})
@ -192,6 +210,9 @@ func (vdb *VspDatabase) GetUnconfirmedTickets() ([]Ticket, error) {
// GetPendingFees returns tickets which are confirmed and have a fee tx which is
// not yet broadcast.
func (vdb *VspDatabase) GetPendingFees() ([]Ticket, error) {
defer vdb.ticketsMtx.RUnlock()
vdb.ticketsMtx.RLock()
return vdb.filterTickets(func(t Ticket) bool {
return t.Confirmed && t.FeeTxStatus == FeeReceieved
})
@ -200,6 +221,9 @@ func (vdb *VspDatabase) GetPendingFees() ([]Ticket, error) {
// GetUnconfirmedFees returns tickets with a fee tx that is broadcast but not
// confirmed yet.
func (vdb *VspDatabase) GetUnconfirmedFees() ([]Ticket, error) {
defer vdb.ticketsMtx.RUnlock()
vdb.ticketsMtx.RLock()
return vdb.filterTickets(func(t Ticket) bool {
return t.FeeTxStatus == FeeBroadcast
})
@ -207,6 +231,8 @@ func (vdb *VspDatabase) GetUnconfirmedFees() ([]Ticket, error) {
// filterTickets accepts a filter function and returns all tickets from the
// database which match the filter.
//
// This function must be called with the lock held.
func (vdb *VspDatabase) filterTickets(filter func(Ticket) bool) ([]Ticket, error) {
var tickets []Ticket
err := vdb.db.View(func(tx *bolt.Tx) error {