core/rawdb: add file lock for freezer
This commit is contained in:
committed by
Péter Szilágyi
parent
b69bdc2a4f
commit
b6cac42e9f
@ -20,6 +20,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"math"
|
||||
"path/filepath"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
@ -27,6 +28,7 @@ import (
|
||||
"github.com/ethereum/go-ethereum/ethdb"
|
||||
"github.com/ethereum/go-ethereum/log"
|
||||
"github.com/ethereum/go-ethereum/metrics"
|
||||
"github.com/prometheus/tsdb/fileutil"
|
||||
)
|
||||
|
||||
// errUnknownTable is returned if the user attempts to read from a table that is
|
||||
@ -57,8 +59,9 @@ const (
|
||||
// reserving it for go-ethereum. This would also reduce the memory requirements
|
||||
// of Geth, and thus also GC overhead.
|
||||
type freezer struct {
|
||||
tables map[string]*freezerTable // Data tables for storing everything
|
||||
frozen uint64 // Number of blocks already frozen
|
||||
tables map[string]*freezerTable // Data tables for storing everything
|
||||
frozen uint64 // Number of blocks already frozen
|
||||
instanceLock fileutil.Releaser // File-system lock to prevent double opens
|
||||
}
|
||||
|
||||
// newFreezer creates a chain freezer that moves ancient chain data into
|
||||
@ -69,9 +72,14 @@ func newFreezer(datadir string, namespace string) (*freezer, error) {
|
||||
readMeter = metrics.NewRegisteredMeter(namespace+"ancient/read", nil)
|
||||
writeMeter = metrics.NewRegisteredMeter(namespace+"ancient/write", nil)
|
||||
)
|
||||
lock, _, err := fileutil.Flock(filepath.Join(datadir, "LOCK"))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// Open all the supported data tables
|
||||
freezer := &freezer{
|
||||
tables: make(map[string]*freezerTable),
|
||||
tables: make(map[string]*freezerTable),
|
||||
instanceLock: lock,
|
||||
}
|
||||
for _, name := range []string{"hashes", "headers", "bodies", "receipts", "diffs"} {
|
||||
table, err := newTable(datadir, name, readMeter, writeMeter)
|
||||
@ -79,6 +87,7 @@ func newFreezer(datadir string, namespace string) (*freezer, error) {
|
||||
for _, table := range freezer.tables {
|
||||
table.Close()
|
||||
}
|
||||
lock.Release()
|
||||
return nil, err
|
||||
}
|
||||
freezer.tables[name] = table
|
||||
@ -95,6 +104,7 @@ func newFreezer(datadir string, namespace string) (*freezer, error) {
|
||||
for _, table := range freezer.tables {
|
||||
table.Close()
|
||||
}
|
||||
lock.Release()
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
@ -109,6 +119,9 @@ func (f *freezer) Close() error {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
}
|
||||
if err := f.instanceLock.Release(); err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
if errs != nil {
|
||||
return fmt.Errorf("%v", errs)
|
||||
}
|
||||
|
Reference in New Issue
Block a user