Remove global loggers from components.

- Web API Cache
- Recovery Middleware
- Database upgrades
- Address Generator
This commit is contained in:
jholdstock 2022-06-08 11:28:54 +01:00 committed by Jamie Holdstock
parent 63ce069a88
commit 01b0df2d7a
8 changed files with 33 additions and 18 deletions

View File

@ -1,4 +1,4 @@
// Copyright (c) 2021 The Decred developers // Copyright (c) 2021-2022 The Decred developers
// Use of this source code is governed by an ISC // Use of this source code is governed by an ISC
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
@ -8,10 +8,11 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/decred/slog"
bolt "go.etcd.io/bbolt" bolt "go.etcd.io/bbolt"
) )
func removeOldFeeTxUpgrade(db *bolt.DB) error { func removeOldFeeTxUpgrade(db *bolt.DB, log slog.Logger) error {
log.Infof("Upgrading database to version %d", removeOldFeeTxVersion) log.Infof("Upgrading database to version %d", removeOldFeeTxVersion)
// Run the upgrade in a single database transaction so it can be safely // Run the upgrade in a single database transaction so it can be safely

View File

@ -8,10 +8,11 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/decred/slog"
bolt "go.etcd.io/bbolt" bolt "go.etcd.io/bbolt"
) )
func ticketBucketUpgrade(db *bolt.DB) error { func ticketBucketUpgrade(db *bolt.DB, log slog.Logger) error {
log.Infof("Upgrading database to version %d", ticketBucketVersion) log.Infof("Upgrading database to version %d", ticketBucketVersion)
// Run the upgrade in a single database transaction so it can be safely // Run the upgrade in a single database transaction so it can be safely

View File

@ -1,4 +1,4 @@
// Copyright (c) 2021 The Decred developers // Copyright (c) 2021-2022 The Decred developers
// Use of this source code is governed by an ISC // Use of this source code is governed by an ISC
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
@ -7,10 +7,11 @@ package database
import ( import (
"fmt" "fmt"
"github.com/decred/slog"
bolt "go.etcd.io/bbolt" bolt "go.etcd.io/bbolt"
) )
func altSignAddrUpgrade(db *bolt.DB) error { func altSignAddrUpgrade(db *bolt.DB, log slog.Logger) error {
log.Infof("Upgrading database to version %d", altSignAddrVersion) log.Infof("Upgrading database to version %d", altSignAddrVersion)
// Run the upgrade in a single database transaction so it can be safely // Run the upgrade in a single database transaction so it can be safely

View File

@ -1,4 +1,4 @@
// Copyright (c) 2021 The Decred developers // Copyright (c) 2021-2022 The Decred developers
// Use of this source code is governed by an ISC // Use of this source code is governed by an ISC
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
@ -7,6 +7,7 @@ package database
import ( import (
"fmt" "fmt"
"github.com/decred/slog"
bolt "go.etcd.io/bbolt" bolt "go.etcd.io/bbolt"
) )
@ -37,7 +38,7 @@ const (
// upgrades maps between old database versions and the upgrade function to // upgrades maps between old database versions and the upgrade function to
// upgrade the database to the next version. // upgrade the database to the next version.
var upgrades = []func(tx *bolt.DB) error{ var upgrades = []func(tx *bolt.DB, log slog.Logger) error{
initialVersion: removeOldFeeTxUpgrade, initialVersion: removeOldFeeTxUpgrade,
removeOldFeeTxVersion: ticketBucketUpgrade, removeOldFeeTxVersion: ticketBucketUpgrade,
ticketBucketVersion: altSignAddrUpgrade, ticketBucketVersion: altSignAddrUpgrade,
@ -77,7 +78,7 @@ func (vdb *VspDatabase) Upgrade(currentVersion uint32) error {
// Execute all necessary upgrades in order. // Execute all necessary upgrades in order.
for _, upgrade := range upgrades[currentVersion:] { for _, upgrade := range upgrades[currentVersion:] {
err := upgrade(vdb.db) err := upgrade(vdb.db, log)
if err != nil { if err != nil {
return err return err
} }

View File

@ -1,4 +1,4 @@
// Copyright (c) 2020 The Decred developers // Copyright (c) 2020-2022 The Decred developers
// Use of this source code is governed by an ISC // Use of this source code is governed by an ISC
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
@ -10,15 +10,17 @@ import (
"github.com/decred/dcrd/chaincfg/v3" "github.com/decred/dcrd/chaincfg/v3"
"github.com/decred/dcrd/hdkeychain/v3" "github.com/decred/dcrd/hdkeychain/v3"
"github.com/decred/dcrd/txscript/v4/stdaddr" "github.com/decred/dcrd/txscript/v4/stdaddr"
"github.com/decred/slog"
) )
type addressGenerator struct { type addressGenerator struct {
external *hdkeychain.ExtendedKey external *hdkeychain.ExtendedKey
netParams *chaincfg.Params netParams *chaincfg.Params
lastUsedIndex uint32 lastUsedIndex uint32
log slog.Logger
} }
func newAddressGenerator(xPub string, netParams *chaincfg.Params, lastUsedIdx uint32) (*addressGenerator, error) { func newAddressGenerator(xPub string, netParams *chaincfg.Params, lastUsedIdx uint32, log slog.Logger) (*addressGenerator, error) {
xPubKey, err := hdkeychain.NewKeyFromString(xPub, netParams) xPubKey, err := hdkeychain.NewKeyFromString(xPub, netParams)
if err != nil { if err != nil {
return nil, err return nil, err
@ -38,6 +40,7 @@ func newAddressGenerator(xPub string, netParams *chaincfg.Params, lastUsedIdx ui
external: external, external: external,
netParams: netParams, netParams: netParams,
lastUsedIndex: lastUsedIdx, lastUsedIndex: lastUsedIdx,
log: log,
}, nil }, nil
} }
@ -58,7 +61,7 @@ func (m *addressGenerator) NextAddress() (string, uint32, error) {
if err != nil { if err != nil {
if errors.Is(err, hdkeychain.ErrInvalidChild) { if errors.Is(err, hdkeychain.ErrInvalidChild) {
invalidChildren++ invalidChildren++
log.Warnf("Generating address for index %d failed: %v", m.lastUsedIndex, err) m.log.Warnf("Generating address for index %d failed: %v", m.lastUsedIndex, err)
// If this happens 3 times, something is seriously wrong, so // If this happens 3 times, something is seriously wrong, so
// return an error. // return an error.
if invalidChildren > 2 { if invalidChildren > 2 {

View File

@ -9,6 +9,7 @@ import (
"sync" "sync"
"time" "time"
"github.com/decred/slog"
"github.com/decred/vspd/database" "github.com/decred/vspd/database"
"github.com/decred/vspd/rpc" "github.com/decred/vspd/rpc"
"github.com/dustin/go-humanize" "github.com/dustin/go-humanize"
@ -21,6 +22,7 @@ type cache struct {
data cacheData data cacheData
// mtx must be held to read/write cache data. // mtx must be held to read/write cache data.
mtx sync.RWMutex mtx sync.RWMutex
log slog.Logger
} }
type cacheData struct { type cacheData struct {
@ -45,11 +47,12 @@ func (c *cache) getData() cacheData {
} }
// newCache creates a new cache and initializes it with static values. // newCache creates a new cache and initializes it with static values.
func newCache(signPubKey string) *cache { func newCache(signPubKey string, log slog.Logger) *cache {
return &cache{ return &cache{
data: cacheData{ data: cacheData{
PubKey: signPubKey, PubKey: signPubKey,
}, },
log: log,
} }
} }
@ -86,9 +89,9 @@ func (c *cache) update(db *database.VspDatabase, dcrd rpc.DcrdConnect,
clients, failedConnections := wallets.Clients() clients, failedConnections := wallets.Clients()
if len(clients) == 0 { if len(clients) == 0 {
log.Error("Could not connect to any wallets") c.log.Error("Could not connect to any wallets")
} else if len(failedConnections) > 0 { } else if len(failedConnections) > 0 {
log.Errorf("Failed to connect to %d wallet(s), proceeding with only %d", c.log.Errorf("Failed to connect to %d wallet(s), proceeding with only %d",
len(failedConnections), len(clients)) len(failedConnections), len(clients))
} }

View File

@ -1,3 +1,7 @@
// Copyright (c) 2020-2022 The Decred developers
// Use of this source code is governed by an ISC
// license that can be found in the LICENSE file.
package webapi package webapi
import ( import (
@ -10,6 +14,7 @@ import (
"runtime" "runtime"
"strings" "strings"
"github.com/decred/slog"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@ -17,7 +22,7 @@ import (
// request handlers. It logs the panic, a stack trace, and the full request // request handlers. It logs the panic, a stack trace, and the full request
// details. It also ensure the client receives a 500 response rather than no // details. It also ensure the client receives a 500 response rather than no
// response at all. // response at all.
func Recovery() gin.HandlerFunc { func Recovery(log slog.Logger) gin.HandlerFunc {
return func(c *gin.Context) { return func(c *gin.Context) {
defer func() { defer func() {
if err := recover(); err != nil { if err := recover(); err != nil {

View File

@ -89,7 +89,7 @@ func Start(shutdownCtx context.Context, requestShutdown func(), shutdownWg *sync
} }
// Populate cached VSP stats before starting webserver. // Populate cached VSP stats before starting webserver.
s.cache = newCache(base64.StdEncoding.EncodeToString(s.signPubKey)) s.cache = newCache(base64.StdEncoding.EncodeToString(s.signPubKey), log)
err = s.cache.update(vdb, dcrd, wallets) err = s.cache.update(vdb, dcrd, wallets)
if err != nil { if err != nil {
log.Errorf("Could not initialize VSP stats cache: %v", err) log.Errorf("Could not initialize VSP stats cache: %v", err)
@ -105,7 +105,7 @@ func Start(shutdownCtx context.Context, requestShutdown func(), shutdownWg *sync
if err != nil { if err != nil {
return fmt.Errorf("db.GetFeeXPub error: %w", err) return fmt.Errorf("db.GetFeeXPub error: %w", err)
} }
s.addrGen, err = newAddressGenerator(feeXPub, config.NetParams, idx) s.addrGen, err = newAddressGenerator(feeXPub, config.NetParams, idx, log)
if err != nil { if err != nil {
return fmt.Errorf("failed to initialize fee address generator: %w", err) return fmt.Errorf("failed to initialize fee address generator: %w", err)
} }
@ -213,7 +213,7 @@ func (s *Server) router(cookieSecret []byte, dcrd rpc.DcrdConnect, wallets rpc.W
// Recovery middleware handles any go panics generated while processing web // Recovery middleware handles any go panics generated while processing web
// requests. Ensures a 500 response is sent to the client rather than // requests. Ensures a 500 response is sent to the client rather than
// sending no response at all. // sending no response at all.
router.Use(Recovery()) router.Use(Recovery(log))
if s.cfg.Debug { if s.cfg.Debug {
// Logger middleware outputs very detailed logging of webserver requests // Logger middleware outputs very detailed logging of webserver requests