status-go/_assets/patches/geth/0026-ethdb-error-deadlock.p...

55 lines
1.6 KiB
Diff
Raw Normal View History

diff --git i/ethdb/database.go w/ethdb/database.go
index 001d8f0bb..4c9b1412c 100644
--- i/ethdb/database.go
+++ w/ethdb/database.go
@@ -55,6 +55,7 @@ type LDBDatabase struct {
quitLock sync.Mutex // Mutex protecting the quit channel access
quitChan chan chan error // Quit channel to stop the metrics collection before closing the database
+ wg sync.WaitGroup // WaitGroup waits till all metering collections will exit.
log log.Logger // Contextual logger tracking the database path
}
@@ -134,14 +135,11 @@ func (db *LDBDatabase) Close() {
// Stop the metrics collection to avoid internal database races
db.quitLock.Lock()
defer db.quitLock.Unlock()
-
if db.quitChan != nil {
- errc := make(chan error)
- db.quitChan <- errc
- if err := <-errc; err != nil {
- db.log.Error("Metrics collection failed", "err", err)
- }
+ close(db.quitChan)
}
+ db.wg.Wait()
+ db.quitChan = nil
err := db.db.Close()
if err == nil {
db.log.Info("Database closed")
@@ -173,7 +171,11 @@ func (db *LDBDatabase) Meter(prefix string) {
db.quitChan = make(chan chan error)
db.quitLock.Unlock()
- go db.meter(3 * time.Second)
+ db.wg.Add(1)
+ go func() {
+ defer db.wg.Done()
+ db.meter(3 * time.Second)
+ }()
}
// meter periodically retrieves internal leveldb counters and reports them to
@@ -345,9 +347,8 @@ func (db *LDBDatabase) meter(refresh tim
// Sleep a bit, then repeat the stats collection
select {
- case errc := <-db.quitChan:
+ case <-db.quitChan:
// Quit requesting, stop hammering the database
- errc <- nil
return
case <-time.After(refresh):