From 057b89e2f2804e72a15b3167a5d37a8ab02617bd Mon Sep 17 00:00:00 2001 From: Jamie Holdstock Date: Sun, 27 Dec 2020 15:20:46 +0000 Subject: [PATCH] Only marshal DB record when needed (#214) * Only marshal DB record when needed * Lock mutex before deferring Unlock. --- database/ticket.go | 16 ++++++++-------- database/votechange.go | 10 ++++------ rpc/client.go | 2 +- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/database/ticket.go b/database/ticket.go index 54a9427..2c2ba79 100644 --- a/database/ticket.go +++ b/database/ticket.go @@ -82,8 +82,8 @@ var ( ) func (vdb *VspDatabase) InsertNewTicket(ticket Ticket) error { - defer vdb.ticketsMtx.Unlock() vdb.ticketsMtx.Lock() + defer vdb.ticketsMtx.Unlock() return vdb.db.Update(func(tx *bolt.Tx) error { ticketBkt := tx.Bucket(vspBktK).Bucket(ticketBktK) @@ -126,8 +126,8 @@ func (vdb *VspDatabase) InsertNewTicket(ticket Ticket) error { } func (vdb *VspDatabase) DeleteTicket(ticket Ticket) error { - defer vdb.ticketsMtx.Unlock() vdb.ticketsMtx.Lock() + defer vdb.ticketsMtx.Unlock() return vdb.db.Update(func(tx *bolt.Tx) error { ticketBkt := tx.Bucket(vspBktK).Bucket(ticketBktK) @@ -142,8 +142,8 @@ func (vdb *VspDatabase) DeleteTicket(ticket Ticket) error { } func (vdb *VspDatabase) UpdateTicket(ticket Ticket) error { - defer vdb.ticketsMtx.Unlock() vdb.ticketsMtx.Lock() + defer vdb.ticketsMtx.Unlock() return vdb.db.Update(func(tx *bolt.Tx) error { 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) { - defer vdb.ticketsMtx.RUnlock() vdb.ticketsMtx.RLock() + defer vdb.ticketsMtx.RUnlock() var ticket Ticket var found bool @@ -191,8 +191,8 @@ func (vdb *VspDatabase) GetTicketByHash(ticketHash string) (Ticket, bool, error) } func (vdb *VspDatabase) CountTickets() (int64, int64, int64, error) { - defer vdb.ticketsMtx.RUnlock() vdb.ticketsMtx.RLock() + defer vdb.ticketsMtx.RUnlock() var voting, voted, revoked int64 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. func (vdb *VspDatabase) GetUnconfirmedTickets() ([]Ticket, error) { - defer vdb.ticketsMtx.RUnlock() vdb.ticketsMtx.RLock() + defer vdb.ticketsMtx.RUnlock() return vdb.filterTickets(func(t Ticket) bool { 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 // not yet broadcast. func (vdb *VspDatabase) GetPendingFees() ([]Ticket, error) { - defer vdb.ticketsMtx.RUnlock() vdb.ticketsMtx.RLock() + defer vdb.ticketsMtx.RUnlock() return vdb.filterTickets(func(t Ticket) bool { 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 // confirmed yet. func (vdb *VspDatabase) GetUnconfirmedFees() ([]Ticket, error) { - defer vdb.ticketsMtx.RUnlock() vdb.ticketsMtx.RLock() + defer vdb.ticketsMtx.RUnlock() return vdb.filterTickets(func(t Ticket) bool { return t.FeeTxStatus == FeeBroadcast diff --git a/database/votechange.go b/database/votechange.go index bae1a9a..981e9ff 100644 --- a/database/votechange.go +++ b/database/votechange.go @@ -27,13 +27,7 @@ type VoteChangeRecord struct { // one which is currently stored. Records are stored using a serially increasing // integer as the key. func (vdb *VspDatabase) SaveVoteChange(ticketHash string, record VoteChangeRecord) 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. bkt, err := tx.Bucket(vspBktK).Bucket(voteChangeBktK). @@ -85,6 +79,10 @@ func (vdb *VspDatabase) SaveVoteChange(ticketHash string, record VoteChangeRecor binary.LittleEndian.PutUint32(keyBytes, newKey) // 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) if err != nil { return fmt.Errorf("could not store vote change record: %w", err) diff --git a/rpc/client.go b/rpc/client.go index 4451266..4c28577 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -87,8 +87,8 @@ func (c *client) Close() { // boolean indicates whether this connection is new (true), or if it is an // existing connection which is being reused (false). func (c *client) dial(ctx context.Context) (Caller, bool, error) { - defer c.mu.Unlock() c.mu.Lock() + defer c.mu.Unlock() if c.client != nil { select {