From f1c6b9fe8fc9b366485c978adc187bc5d25fd2e3 Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Fri, 6 Oct 2023 12:09:25 +0300 Subject: [PATCH] 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 --- pkg/core/storage/boltdb_store.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkg/core/storage/boltdb_store.go b/pkg/core/storage/boltdb_store.go index a0c2572e77..80de15a87b 100644 --- a/pkg/core/storage/boltdb_store.go +++ b/pkg/core/storage/boltdb_store.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "os" + "time" "github.com/nspcc-dev/neo-go/pkg/core/storage/dbconfig" "github.com/nspcc-dev/neo-go/pkg/io" @@ -21,6 +22,10 @@ type BoltDBStore struct { 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. func NewBoltDBStore(cfg dbconfig.BoltDBOptions) (*BoltDBStore, error) { cp := *bbolt.DefaultOptions // Do not change bbolt's global variable. @@ -34,6 +39,8 @@ func NewBoltDBStore(cfg dbconfig.BoltDBOptions) (*BoltDBStore, error) { return nil, err } } + opts.Timeout = defaultOpenTimeout + db, err := bbolt.Open(fileName, fileMode, opts) if err != nil { return nil, fmt.Errorf("failed to open BoltDB instance: %w", err)