Only marshal DB record when needed (#214)

* Only marshal DB record when needed

* Lock mutex before deferring Unlock.
This commit is contained in:
Jamie Holdstock 2020-12-27 15:20:46 +00:00 committed by GitHub
parent 6474f0ea4c
commit 057b89e2f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 15 deletions

View File

@ -82,8 +82,8 @@ var (
) )
func (vdb *VspDatabase) InsertNewTicket(ticket Ticket) error { func (vdb *VspDatabase) InsertNewTicket(ticket Ticket) error {
defer vdb.ticketsMtx.Unlock()
vdb.ticketsMtx.Lock() vdb.ticketsMtx.Lock()
defer vdb.ticketsMtx.Unlock()
return vdb.db.Update(func(tx *bolt.Tx) error { return vdb.db.Update(func(tx *bolt.Tx) error {
ticketBkt := tx.Bucket(vspBktK).Bucket(ticketBktK) ticketBkt := tx.Bucket(vspBktK).Bucket(ticketBktK)
@ -126,8 +126,8 @@ func (vdb *VspDatabase) InsertNewTicket(ticket Ticket) error {
} }
func (vdb *VspDatabase) DeleteTicket(ticket Ticket) error { func (vdb *VspDatabase) DeleteTicket(ticket Ticket) error {
defer vdb.ticketsMtx.Unlock()
vdb.ticketsMtx.Lock() vdb.ticketsMtx.Lock()
defer vdb.ticketsMtx.Unlock()
return vdb.db.Update(func(tx *bolt.Tx) error { return vdb.db.Update(func(tx *bolt.Tx) error {
ticketBkt := tx.Bucket(vspBktK).Bucket(ticketBktK) ticketBkt := tx.Bucket(vspBktK).Bucket(ticketBktK)
@ -142,8 +142,8 @@ func (vdb *VspDatabase) DeleteTicket(ticket Ticket) error {
} }
func (vdb *VspDatabase) UpdateTicket(ticket Ticket) error { func (vdb *VspDatabase) UpdateTicket(ticket Ticket) error {
defer vdb.ticketsMtx.Unlock()
vdb.ticketsMtx.Lock() vdb.ticketsMtx.Lock()
defer vdb.ticketsMtx.Unlock()
return vdb.db.Update(func(tx *bolt.Tx) error { return vdb.db.Update(func(tx *bolt.Tx) error {
ticketBkt := tx.Bucket(vspBktK).Bucket(ticketBktK) ticketBkt := tx.Bucket(vspBktK).Bucket(ticketBktK)
@ -164,8 +164,8 @@ func (vdb *VspDatabase) UpdateTicket(ticket Ticket) error {
} }
func (vdb *VspDatabase) GetTicketByHash(ticketHash string) (Ticket, bool, error) { func (vdb *VspDatabase) GetTicketByHash(ticketHash string) (Ticket, bool, error) {
defer vdb.ticketsMtx.RUnlock()
vdb.ticketsMtx.RLock() vdb.ticketsMtx.RLock()
defer vdb.ticketsMtx.RUnlock()
var ticket Ticket var ticket Ticket
var found bool var found bool
@ -191,8 +191,8 @@ func (vdb *VspDatabase) GetTicketByHash(ticketHash string) (Ticket, bool, error)
} }
func (vdb *VspDatabase) CountTickets() (int64, int64, int64, error) { func (vdb *VspDatabase) CountTickets() (int64, int64, int64, error) {
defer vdb.ticketsMtx.RUnlock()
vdb.ticketsMtx.RLock() vdb.ticketsMtx.RLock()
defer vdb.ticketsMtx.RUnlock()
var voting, voted, revoked int64 var voting, voted, revoked int64
err := vdb.db.View(func(tx *bolt.Tx) error { err := vdb.db.View(func(tx *bolt.Tx) error {
@ -225,8 +225,8 @@ func (vdb *VspDatabase) CountTickets() (int64, int64, int64, error) {
// GetUnconfirmedTickets returns tickets which are not yet confirmed. // GetUnconfirmedTickets returns tickets which are not yet confirmed.
func (vdb *VspDatabase) GetUnconfirmedTickets() ([]Ticket, error) { func (vdb *VspDatabase) GetUnconfirmedTickets() ([]Ticket, error) {
defer vdb.ticketsMtx.RUnlock()
vdb.ticketsMtx.RLock() vdb.ticketsMtx.RLock()
defer vdb.ticketsMtx.RUnlock()
return vdb.filterTickets(func(t Ticket) bool { return vdb.filterTickets(func(t Ticket) bool {
return !t.Confirmed return !t.Confirmed
@ -236,8 +236,8 @@ func (vdb *VspDatabase) GetUnconfirmedTickets() ([]Ticket, error) {
// GetPendingFees returns tickets which are confirmed and have a fee tx which is // GetPendingFees returns tickets which are confirmed and have a fee tx which is
// not yet broadcast. // not yet broadcast.
func (vdb *VspDatabase) GetPendingFees() ([]Ticket, error) { func (vdb *VspDatabase) GetPendingFees() ([]Ticket, error) {
defer vdb.ticketsMtx.RUnlock()
vdb.ticketsMtx.RLock() vdb.ticketsMtx.RLock()
defer vdb.ticketsMtx.RUnlock()
return vdb.filterTickets(func(t Ticket) bool { return vdb.filterTickets(func(t Ticket) bool {
return t.Confirmed && t.FeeTxStatus == FeeReceieved return t.Confirmed && t.FeeTxStatus == FeeReceieved
@ -247,8 +247,8 @@ func (vdb *VspDatabase) GetPendingFees() ([]Ticket, error) {
// GetUnconfirmedFees returns tickets with a fee tx that is broadcast but not // GetUnconfirmedFees returns tickets with a fee tx that is broadcast but not
// confirmed yet. // confirmed yet.
func (vdb *VspDatabase) GetUnconfirmedFees() ([]Ticket, error) { func (vdb *VspDatabase) GetUnconfirmedFees() ([]Ticket, error) {
defer vdb.ticketsMtx.RUnlock()
vdb.ticketsMtx.RLock() vdb.ticketsMtx.RLock()
defer vdb.ticketsMtx.RUnlock()
return vdb.filterTickets(func(t Ticket) bool { return vdb.filterTickets(func(t Ticket) bool {
return t.FeeTxStatus == FeeBroadcast return t.FeeTxStatus == FeeBroadcast

View File

@ -27,13 +27,7 @@ type VoteChangeRecord struct {
// one which is currently stored. Records are stored using a serially increasing // one which is currently stored. Records are stored using a serially increasing
// integer as the key. // integer as the key.
func (vdb *VspDatabase) SaveVoteChange(ticketHash string, record VoteChangeRecord) error { func (vdb *VspDatabase) SaveVoteChange(ticketHash string, record VoteChangeRecord) error {
return vdb.db.Update(func(tx *bolt.Tx) error { return vdb.db.Update(func(tx *bolt.Tx) error {
// Serialize record for storage in the database.
recordBytes, err := json.Marshal(record)
if err != nil {
return fmt.Errorf("could not marshal vote change record: %w", err)
}
// Create or get a bucket for this ticket. // Create or get a bucket for this ticket.
bkt, err := tx.Bucket(vspBktK).Bucket(voteChangeBktK). bkt, err := tx.Bucket(vspBktK).Bucket(voteChangeBktK).
@ -85,6 +79,10 @@ func (vdb *VspDatabase) SaveVoteChange(ticketHash string, record VoteChangeRecor
binary.LittleEndian.PutUint32(keyBytes, newKey) binary.LittleEndian.PutUint32(keyBytes, newKey)
// Insert record. // Insert record.
recordBytes, err := json.Marshal(record)
if err != nil {
return fmt.Errorf("could not marshal vote change record: %w", err)
}
err = bkt.Put(keyBytes, recordBytes) err = bkt.Put(keyBytes, recordBytes)
if err != nil { if err != nil {
return fmt.Errorf("could not store vote change record: %w", err) return fmt.Errorf("could not store vote change record: %w", err)

View File

@ -87,8 +87,8 @@ func (c *client) Close() {
// boolean indicates whether this connection is new (true), or if it is an // boolean indicates whether this connection is new (true), or if it is an
// existing connection which is being reused (false). // existing connection which is being reused (false).
func (c *client) dial(ctx context.Context) (Caller, bool, error) { func (c *client) dial(ctx context.Context) (Caller, bool, error) {
defer c.mu.Unlock()
c.mu.Lock() c.mu.Lock()
defer c.mu.Unlock()
if c.client != nil { if c.client != nil {
select { select {