mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
ethdb/leveldb : use close(quit) to quit meter routine
This commit is contained in:
parent
8d163ae08b
commit
b960717392
1 changed files with 9 additions and 33 deletions
|
|
@ -145,14 +145,8 @@ func (db *Database) Close() error {
|
|||
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)
|
||||
}
|
||||
db.quitChan = nil
|
||||
}
|
||||
close(db.quitChan)
|
||||
|
||||
db.wg.Wait()
|
||||
return db.db.Close()
|
||||
}
|
||||
|
|
@ -249,19 +243,15 @@ func (db *Database) meter(refresh time.Duration) {
|
|||
delaystats [2]int64
|
||||
lastWritePaused time.Time
|
||||
)
|
||||
|
||||
var (
|
||||
errc chan error
|
||||
merr error
|
||||
)
|
||||
timer := time.NewTimer(refresh)
|
||||
defer timer.Stop()
|
||||
|
||||
// Iterate ad infinitum and collect the stats
|
||||
for i := 1; errc == nil && merr == nil; i++ {
|
||||
for i := 1; ; i++ {
|
||||
// Retrieve the database stats
|
||||
stats, err := db.db.GetProperty("leveldb.stats")
|
||||
if err != nil {
|
||||
db.log.Error("Failed to read database stats", "err", err)
|
||||
merr = err
|
||||
continue
|
||||
}
|
||||
// Find the compaction table, skip the header
|
||||
|
|
@ -271,7 +261,6 @@ func (db *Database) meter(refresh time.Duration) {
|
|||
}
|
||||
if len(lines) <= 3 {
|
||||
db.log.Error("Compaction leveldbTable not found")
|
||||
merr = errors.New("compaction leveldbTable not found")
|
||||
continue
|
||||
}
|
||||
lines = lines[3:]
|
||||
|
|
@ -289,7 +278,6 @@ func (db *Database) meter(refresh time.Duration) {
|
|||
value, err := strconv.ParseFloat(strings.TrimSpace(counter), 64)
|
||||
if err != nil {
|
||||
db.log.Error("Compaction entry parsing failed", "err", err)
|
||||
merr = err
|
||||
continue
|
||||
}
|
||||
compactions[i%2][idx] += value
|
||||
|
|
@ -312,7 +300,6 @@ func (db *Database) meter(refresh time.Duration) {
|
|||
writedelay, err := db.db.GetProperty("leveldb.writedelay")
|
||||
if err != nil {
|
||||
db.log.Error("Failed to read database write delay statistic", "err", err)
|
||||
merr = err
|
||||
continue
|
||||
}
|
||||
var (
|
||||
|
|
@ -323,13 +310,11 @@ func (db *Database) meter(refresh time.Duration) {
|
|||
)
|
||||
if n, err := fmt.Sscanf(writedelay, "DelayN:%d Delay:%s Paused:%t", &delayN, &delayDuration, &paused); n != 3 || err != nil {
|
||||
db.log.Error("Write delay statistic not found")
|
||||
merr = err
|
||||
continue
|
||||
}
|
||||
duration, err = time.ParseDuration(delayDuration)
|
||||
if err != nil {
|
||||
db.log.Error("Failed to parse delay duration", "err", err)
|
||||
merr = err
|
||||
continue
|
||||
}
|
||||
if db.writeDelayNMeter != nil {
|
||||
|
|
@ -351,24 +336,20 @@ func (db *Database) meter(refresh time.Duration) {
|
|||
ioStats, err := db.db.GetProperty("leveldb.iostats")
|
||||
if err != nil {
|
||||
db.log.Error("Failed to read database iostats", "err", err)
|
||||
merr = err
|
||||
continue
|
||||
}
|
||||
var nRead, nWrite float64
|
||||
parts := strings.Split(ioStats, " ")
|
||||
if len(parts) < 2 {
|
||||
db.log.Error("Bad syntax of ioStats", "ioStats", ioStats)
|
||||
merr = fmt.Errorf("bad syntax of ioStats %s", ioStats)
|
||||
continue
|
||||
}
|
||||
if n, err := fmt.Sscanf(parts[0], "Read(MB):%f", &nRead); n != 1 || err != nil {
|
||||
db.log.Error("Bad syntax of read entry", "entry", parts[0])
|
||||
merr = err
|
||||
continue
|
||||
}
|
||||
if n, err := fmt.Sscanf(parts[1], "Write(MB):%f", &nWrite); n != 1 || err != nil {
|
||||
db.log.Error("Bad syntax of write entry", "entry", parts[1])
|
||||
merr = err
|
||||
continue
|
||||
}
|
||||
if db.diskReadMeter != nil {
|
||||
|
|
@ -382,7 +363,6 @@ func (db *Database) meter(refresh time.Duration) {
|
|||
compCount, err := db.db.GetProperty("leveldb.compcount")
|
||||
if err != nil {
|
||||
db.log.Error("Failed to read database iostats", "err", err)
|
||||
merr = err
|
||||
continue
|
||||
}
|
||||
|
||||
|
|
@ -394,7 +374,6 @@ func (db *Database) meter(refresh time.Duration) {
|
|||
)
|
||||
if n, err := fmt.Sscanf(compCount, "MemComp:%d Level0Comp:%d NonLevel0Comp:%d SeekComp:%d", &memComp, &level0Comp, &nonLevel0Comp, &seekComp); n != 4 || err != nil {
|
||||
db.log.Error("Compaction count statistic not found")
|
||||
merr = err
|
||||
continue
|
||||
}
|
||||
db.memCompGauge.Update(int64(memComp))
|
||||
|
|
@ -404,17 +383,14 @@ func (db *Database) meter(refresh time.Duration) {
|
|||
|
||||
// Sleep a bit, then repeat the stats collection
|
||||
select {
|
||||
case errc = <-db.quitChan:
|
||||
case <-db.quitChan:
|
||||
return
|
||||
// Quit requesting, stop hammering the database
|
||||
case <-time.After(refresh):
|
||||
case <-timer.C:
|
||||
timer.Reset(refresh)
|
||||
// Timeout, gather a new set of stats
|
||||
}
|
||||
}
|
||||
|
||||
if errc == nil {
|
||||
errc = <-db.quitChan
|
||||
}
|
||||
errc <- merr
|
||||
}
|
||||
|
||||
// batch is a write-only leveldb batch that commits changes to its host database
|
||||
|
|
|
|||
Loading…
Reference in a new issue