storage: Use timeout for boltdb database opening

To dump the DB, the service must be stopped.
If this is not the case `dump` command just hangs without any output,
which _may_ be unexpected from the ops POV.
Introduce a 1 second timeous, which is more than enough, given
that bbolt retries doing flock() every 50ms.

Signed-off-by: Evgenii Stratonikov <fyfyrchik@runbox.com>
This commit is contained in:
Evgenii Stratonikov 2023-10-06 12:09:25 +03:00
parent 91c928e8d3
commit f1c6b9fe8f

View file

@ -5,6 +5,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"os" "os"
"time"
"github.com/nspcc-dev/neo-go/pkg/core/storage/dbconfig" "github.com/nspcc-dev/neo-go/pkg/core/storage/dbconfig"
"github.com/nspcc-dev/neo-go/pkg/io" "github.com/nspcc-dev/neo-go/pkg/io"
@ -21,6 +22,10 @@ type BoltDBStore struct {
db *bbolt.DB db *bbolt.DB
} }
// defaultOpenTimeout is the default timeout for performing flock on a bbolt database.
// bbolt does retries every 50ms during this interval.
const defaultOpenTimeout = 1 * time.Second
// NewBoltDBStore returns a new ready to use BoltDB storage with created bucket. // NewBoltDBStore returns a new ready to use BoltDB storage with created bucket.
func NewBoltDBStore(cfg dbconfig.BoltDBOptions) (*BoltDBStore, error) { func NewBoltDBStore(cfg dbconfig.BoltDBOptions) (*BoltDBStore, error) {
cp := *bbolt.DefaultOptions // Do not change bbolt's global variable. cp := *bbolt.DefaultOptions // Do not change bbolt's global variable.
@ -34,6 +39,8 @@ func NewBoltDBStore(cfg dbconfig.BoltDBOptions) (*BoltDBStore, error) {
return nil, err return nil, err
} }
} }
opts.Timeout = defaultOpenTimeout
db, err := bbolt.Open(fileName, fileMode, opts) db, err := bbolt.Open(fileName, fileMode, opts)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to open BoltDB instance: %w", err) return nil, fmt.Errorf("failed to open BoltDB instance: %w", err)