Skip to content

Commit 09a9ccd

Browse files
authored
core/rawdb, node: use standalone flock dependency (#26633)
1 parent a36c68f commit 09a9ccd

File tree

4 files changed

+33
-33
lines changed

4 files changed

+33
-33
lines changed

core/rawdb/freezer.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import (
3030
"github.com/ethereum/go-ethereum/ethdb"
3131
"github.com/ethereum/go-ethereum/log"
3232
"github.com/ethereum/go-ethereum/metrics"
33-
"github.com/prometheus/tsdb/fileutil"
33+
"github.com/gofrs/flock"
3434
)
3535

3636
var (
@@ -75,7 +75,7 @@ type Freezer struct {
7575

7676
readonly bool
7777
tables map[string]*freezerTable // Data tables for storing everything
78-
instanceLock fileutil.Releaser // File-system lock to prevent double opens
78+
instanceLock *flock.Flock // File-system lock to prevent double opens
7979
closeOnce sync.Once
8080
}
8181

@@ -104,11 +104,17 @@ func NewFreezer(datadir string, namespace string, readonly bool, maxTableSize ui
104104
return nil, errSymlinkDatadir
105105
}
106106
}
107+
flockFile := filepath.Join(datadir, "FLOCK")
108+
if err := os.MkdirAll(filepath.Dir(flockFile), 0755); err != nil {
109+
return nil, err
110+
}
107111
// Leveldb uses LOCK as the filelock filename. To prevent the
108112
// name collision, we use FLOCK as the lock name.
109-
lock, _, err := fileutil.Flock(filepath.Join(datadir, "FLOCK"))
110-
if err != nil {
113+
lock := flock.New(flockFile)
114+
if locked, err := lock.TryLock(); err != nil {
111115
return nil, err
116+
} else if !locked {
117+
return nil, errors.New("locking failed")
112118
}
113119
// Open all the supported data tables
114120
freezer := &Freezer{
@@ -124,12 +130,12 @@ func NewFreezer(datadir string, namespace string, readonly bool, maxTableSize ui
124130
for _, table := range freezer.tables {
125131
table.Close()
126132
}
127-
lock.Release()
133+
lock.Unlock()
128134
return nil, err
129135
}
130136
freezer.tables[name] = table
131137
}
132-
138+
var err error
133139
if freezer.readonly {
134140
// In readonly mode only validate, don't truncate.
135141
// validate also sets `freezer.frozen`.
@@ -142,7 +148,7 @@ func NewFreezer(datadir string, namespace string, readonly bool, maxTableSize ui
142148
for _, table := range freezer.tables {
143149
table.Close()
144150
}
145-
lock.Release()
151+
lock.Unlock()
146152
return nil, err
147153
}
148154

@@ -165,7 +171,7 @@ func (f *Freezer) Close() error {
165171
errs = append(errs, err)
166172
}
167173
}
168-
if err := f.instanceLock.Release(); err != nil {
174+
if err := f.instanceLock.Unlock(); err != nil {
169175
errs = append(errs, err)
170176
}
171177
})

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ require (
2626
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff
2727
github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732
2828
github.com/go-stack/stack v1.8.1
29+
github.com/gofrs/flock v0.8.1
2930
github.com/golang-jwt/jwt/v4 v4.3.0
3031
github.com/golang/protobuf v1.5.2
3132
github.com/golang/snappy v0.0.4
@@ -49,7 +50,6 @@ require (
4950
github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416
5051
github.com/olekukonko/tablewriter v0.0.5
5152
github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7
52-
github.com/prometheus/tsdb v0.7.1
5353
github.com/rs/cors v1.7.0
5454
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible
5555
github.com/status-im/keycard-go v0.2.0

go.sum

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@ github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6ps
135135
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
136136
github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ=
137137
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
138-
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
139138
github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
140139
github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo=
141140
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
@@ -195,11 +194,9 @@ github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm
195194
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
196195
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
197196
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
198-
github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0=
199197
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
200198
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
201199
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
202-
github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=
203200
github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8=
204201
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
205202
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
@@ -214,6 +211,8 @@ github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP
214211
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
215212
github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
216213
github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
214+
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
215+
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
217216
github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
218217
github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
219218
github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4=
@@ -440,7 +439,6 @@ github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi
440439
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
441440
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
442441
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
443-
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
444442
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
445443
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
446444
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -481,7 +479,6 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:
481479
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
482480
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
483481
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
484-
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
485482
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
486483
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
487484
github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI=
@@ -490,8 +487,6 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R
490487
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
491488
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
492489
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
493-
github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
494-
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
495490
github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc=
496491
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
497492
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
@@ -683,7 +678,6 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
683678
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
684679
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
685680
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
686-
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
687681
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
688682
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
689683
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=

node/node.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import (
3737
"github.com/ethereum/go-ethereum/log"
3838
"github.com/ethereum/go-ethereum/p2p"
3939
"github.com/ethereum/go-ethereum/rpc"
40-
"github.com/prometheus/tsdb/fileutil"
40+
"github.com/gofrs/flock"
4141
)
4242

4343
// Node is a container on which services can be registered.
@@ -46,13 +46,13 @@ type Node struct {
4646
config *Config
4747
accman *accounts.Manager
4848
log log.Logger
49-
keyDir string // key store directory
50-
keyDirTemp bool // If true, key directory will be removed by Stop
51-
dirLock fileutil.Releaser // prevents concurrent use of instance directory
52-
stop chan struct{} // Channel to wait for termination notifications
53-
server *p2p.Server // Currently running P2P networking layer
54-
startStopLock sync.Mutex // Start/Stop are protected by an additional lock
55-
state int // Tracks state of node lifecycle
49+
keyDir string // key store directory
50+
keyDirTemp bool // If true, key directory will be removed by Stop
51+
dirLock *flock.Flock // prevents concurrent use of instance directory
52+
stop chan struct{} // Channel to wait for termination notifications
53+
server *p2p.Server // Currently running P2P networking layer
54+
startStopLock sync.Mutex // Start/Stop are protected by an additional lock
55+
state int // Tracks state of node lifecycle
5656

5757
lock sync.Mutex
5858
lifecycles []Lifecycle // All registered backends, services, and auxiliary services that have a lifecycle
@@ -320,20 +320,20 @@ func (n *Node) openDataDir() error {
320320
}
321321
// Lock the instance directory to prevent concurrent use by another instance as well as
322322
// accidental use of the instance directory as a database.
323-
release, _, err := fileutil.Flock(filepath.Join(instdir, "LOCK"))
324-
if err != nil {
325-
return convertFileLockError(err)
323+
n.dirLock = flock.New(filepath.Join(instdir, "LOCK"))
324+
325+
if locked, err := n.dirLock.TryLock(); err != nil {
326+
return err
327+
} else if !locked {
328+
return ErrDatadirUsed
326329
}
327-
n.dirLock = release
328330
return nil
329331
}
330332

331333
func (n *Node) closeDataDir() {
332334
// Release instance directory lock.
333-
if n.dirLock != nil {
334-
if err := n.dirLock.Release(); err != nil {
335-
n.log.Error("Can't release datadir lock", "err", err)
336-
}
335+
if n.dirLock != nil && n.dirLock.Locked() {
336+
n.dirLock.Unlock()
337337
n.dirLock = nil
338338
}
339339
}

0 commit comments

Comments
 (0)