Only marshal DB record when needed (#214)
* Only marshal DB record when needed * Lock mutex before deferring Unlock.
This commit is contained in:
parent
6474f0ea4c
commit
057b89e2f2
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user